2 * The new sysinstall program.
4 * This is probably the last program in the `sysinstall' line - the next
5 * generation being essentially a complete rewrite.
10 * Jordan Hubbard. All rights reserved.
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer,
17 * verbatim and that no modifications are made prior to this
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
23 * THIS SOFTWARE IS PROVIDED BY JORDAN HUBBARD ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL JORDAN HUBBARD OR HIS PETS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, LIFE OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37 #include "sysinstall.h"
38 #include <sys/disklabel.h>
40 #include <sys/errno.h>
41 #include <sys/ioctl.h>
42 #include <sys/fcntl.h>
43 #include <sys/param.h>
46 #include <sys/mount.h>
49 static Chunk *chunk_list[MAX_CHUNKS];
51 static int rootdev_is_od;
55 chunk_compare(Chunk *c1, Chunk *c2)
63 else if (!c1->private_data && !c2->private_data)
65 else if (c1->private_data && !c2->private_data)
67 else if (!c1->private_data && c2->private_data)
70 return strcmp(((PartInfo *)(c1->private_data))->mountpoint, ((PartInfo *)(c2->private_data))->mountpoint);
78 for (i = 0; i < nchunks; i++) {
79 for (j = 0; j < nchunks; j++) {
80 if (chunk_compare(chunk_list[j], chunk_list[j + 1]) > 0) {
81 Chunk *tmp = chunk_list[j];
83 chunk_list[j] = chunk_list[j + 1];
84 chunk_list[j + 1] = tmp;
91 check_rootdev(Chunk **list, int n)
97 for (i = 0; i < n; i++) {
99 if (c->type == part && (c->flags & CHUNK_IS_ROOT)
100 && strncmp(c->disk->name, "od", 2) == 0)
112 mount_point(Chunk *c1)
114 if (c1->type == part && c1->subtype == FS_SWAP)
116 else if (c1->type == part || c1->type == fat)
117 return ((PartInfo *)c1->private_data)->mountpoint;
126 else if (c1->type == part) {
127 if (c1->subtype != FS_SWAP)
136 fstype_short(Chunk *c1)
138 if (c1->type == part) {
139 if (c1->subtype != FS_SWAP) {
140 if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0)
148 else if (c1->type == fat) {
149 if (strncmp(c1->name, "od", 2) == 0)
160 if (c1->type == part && c1->subtype != FS_SWAP) {
161 if (rootdev_is_od == 0 && strncmp(c1->name, "od", 2) == 0)
163 else if (c1->flags & CHUNK_IS_ROOT)
172 configFstab(dialogMenuItem *self)
180 if (!RunningAsInit) {
181 if (file_readable("/etc/fstab"))
182 return DITEM_SUCCESS;
184 msgConfirm("Attempting to rebuild your /etc/fstab file. Warning: If you had\n"
185 "any CD devices in use before running sysinstall then they may NOT\n"
186 "be found by this run!");
190 devs = deviceFind(NULL, DEVICE_TYPE_DISK);
192 msgConfirm("No disks found!");
193 return DITEM_FAILURE;
196 /* Record all the chunks */
198 for (i = 0; devs[i]; i++) {
199 if (!devs[i]->enabled)
201 disk = (Disk *)devs[i]->private;
203 msgFatal("No chunk list found for %s!", disk->name);
204 for (c1 = disk->chunks->part; c1; c1 = c1->next) {
205 if (c1->type == freebsd) {
206 for (c2 = c1->part; c2; c2 = c2->next) {
207 if (c2->type == part && (c2->subtype == FS_SWAP || c2->private_data))
208 chunk_list[nchunks++] = c2;
211 else if (c1->type == fat && c1->private_data)
212 chunk_list[nchunks++] = c1;
215 chunk_list[nchunks] = 0;
218 fstab = fopen("/etc/fstab", "w");
220 msgConfirm("Unable to create a new /etc/fstab file! Manual intervention\n"
221 "will be required.");
222 return DITEM_FAILURE;
225 check_rootdev(chunk_list, nchunks);
227 /* Go for the burn */
228 msgDebug("Generating /etc/fstab file\n");
229 fprintf(fstab, "# Device\t\tMountpoint\tFStype\tOptions\t\tDump\tPass#\n");
230 for (i = 0; i < nchunks; i++)
231 fprintf(fstab, "/dev/%s\t\t%s\t\t%s\t%s\t\t%d\t%d\n", name_of(chunk_list[i]), mount_point(chunk_list[i]),
232 fstype(chunk_list[i]), fstype_short(chunk_list[i]), seq_num(chunk_list[i]), seq_num(chunk_list[i]));
234 /* Now look for the CDROMs */
235 devs = deviceFind(NULL, DEVICE_TYPE_CDROM);
236 cnt = deviceCount(devs);
238 /* Write out the CDROM entries */
239 for (i = 0; i < cnt; i++) {
242 sprintf(cdname, "/cdrom%s", i ? itoa(i) : "");
244 msgConfirm("Unable to make mount point for: %s", cdname);
246 fprintf(fstab, "/dev/%s\t\t%s\t\tcd9660\tro,noauto\t0\t0\n", devs[i]->name, cdname);
251 msgDebug("Wrote out /etc/fstab file\n");
252 return DITEM_SUCCESS;
255 /* Do the work of sucking in a config file.
256 * config is the filename to read in.
257 * lines is a fixed (max) sized array of char*
258 * returns number of lines read. line contents
259 * are malloc'd and must be freed by the caller.
262 readConfig(char *config, char **lines, int max)
268 fp = fopen(config, "r");
273 /* Read in the entire file */
274 for (i = 0; i < max; i++) {
275 if (!fgets(line, sizeof line, fp))
277 lines[nlines++] = strdup(line);
281 msgDebug("readConfig: Read %d lines from %s.\n", nlines, config);
285 #define MAX_LINES 2000 /* Some big number we're not likely to ever reach - I'm being really lazy here, I know */
288 readConfigFile(char *config, int marked)
290 char *lines[MAX_LINES], *cp, *cp2;
293 nlines = readConfig(config, lines, MAX_LINES);
297 for (i = 0; i < nlines; i++) {
298 /* Skip the comments & non-variable settings */
299 if (lines[i][0] == '#' || !(cp = index(lines[i], '='))) {
305 if ((cp2 = index(cp, '"')) || (cp2 = index(cp, '\047'))) {
307 cp2 = index(cp, *cp2);
309 /* If valid quotes, use it */
312 /* If we have a legit value, set it */
314 variable_set2(lines[i], cp, marked);
320 /* Load the environment from rc.conf file(s) */
322 configEnvironmentRC_conf(void)
328 { "/etc/defaults/rc.conf", 0 },
329 { "/etc/rc.conf", 0 },
330 { "/etc/rc.conf.local", 0 },
335 for (i = 0; configs[i].fname; i++) {
336 if (file_readable(configs[i].fname))
337 readConfigFile(configs[i].fname, configs[i].marked);
341 /* Load the environment from a resolv.conf file */
343 configEnvironmentResolv(char *config)
345 char *lines[MAX_LINES];
348 nlines = readConfig(config, lines, MAX_LINES);
351 for (i = 0; i < nlines; i++) {
352 Boolean name_set = variable_get(VAR_NAMESERVER) ? 1 : 0;
354 if (!strncmp(lines[i], "domain", 6) && !variable_get(VAR_DOMAINNAME))
355 variable_set2(VAR_DOMAINNAME, string_skipwhite(string_prune(lines[i] + 6)), 0);
356 else if (!name_set && !strncmp(lines[i], "nameserver", 10)) {
357 /* Only take the first nameserver setting - we're lame */
358 variable_set2(VAR_NAMESERVER, string_skipwhite(string_prune(lines[i] + 10)), 0);
364 /* Version of below for dispatch routines */
366 configRC(dialogMenuItem *unused)
369 return DITEM_SUCCESS;
380 static int did_marker = 0;
384 write_header = !file_readable("/etc/rc.conf");
385 rcSite = fopen("/etc/rc.conf", "a");
389 fprintf(rcSite, "# This file now contains just the overrides from /etc/defaults/rc.conf.\n");
390 fprintf(rcSite, "# Please make all changes to this file, not to /etc/defaults/rc.conf.\n\n");
391 fprintf(rcSite, "# Enable network daemons for user convenience.\n");
392 if ((t_loc = time(NULL)) != -1 && (cp = ctime(&t_loc)))
393 fprintf(rcSite, "# Created: %s", cp);
396 /* Now do variable substitutions */
397 for (v = VarHead; v; v = v->next) {
401 fprintf(rcSite, "# -- sysinstall generated deltas -- # "
405 fprintf(rcSite, "%s=\"%s\"\n", v->name, v->value);
410 /* Tidy up the resulting file if it's late enough in the installation
411 for sort and uniq to be available */
412 if (RunningAsInit && file_readable("/usr/bin/sort") && file_readable("/usr/bin/uniq"))
413 (void)vsystem("sort /etc/rc.conf | uniq > /etc/rc.conf.new && mv /etc/rc.conf.new /etc/rc.conf");
417 configSaver(dialogMenuItem *self)
419 variable_set((char *)self->data, 1);
420 if (!variable_get(VAR_BLANKTIME))
421 variable_set2(VAR_BLANKTIME, "300", 1);
422 return DITEM_SUCCESS;
426 configSaverTimeout(dialogMenuItem *self)
428 return (variable_get_value(VAR_BLANKTIME,
429 "Enter time-out period in seconds for screen saver", 1) ?
430 DITEM_SUCCESS : DITEM_FAILURE);
434 configNTP(dialogMenuItem *self)
438 status = variable_get_value(VAR_NTPDATE_FLAGS,
439 "Enter the name of an NTP server", 1)
440 ? DITEM_SUCCESS : DITEM_FAILURE;
441 if (status == DITEM_SUCCESS) {
442 static char tmp[255];
444 snprintf(tmp, sizeof(tmp), "ntpdate_enable=YES,ntpdate_flags=%s",
445 variable_get(VAR_NTPDATE_FLAGS));
447 dmenuSetVariables(self);
453 configUsers(dialogMenuItem *self)
455 WINDOW *w = savescr();
457 dialog_clear_norefresh();
458 dmenuOpenSimple(&MenuUsermgmt, FALSE);
460 return DITEM_SUCCESS;
464 configLinux(dialogMenuItem *self)
466 WINDOW *w = savescr();
469 dialog_clear_norefresh();
470 variable_set2(VAR_LINUX_ENABLE, "YES", 1);
471 Mkdir("/compat/linux");
472 msgNotify("Installing Linux compatibility library...");
473 i = package_add("linux_base");
479 configSecurity(dialogMenuItem *self)
481 WINDOW *w = savescr();
483 dialog_clear_norefresh();
484 dmenuOpenSimple(&MenuSecurity, FALSE);
486 return DITEM_SUCCESS;
490 configSecurityProfile(dialogMenuItem *self)
492 WINDOW *w = savescr();
494 dialog_clear_norefresh();
495 dmenuOpenSimple(&MenuSecurityProfile, FALSE);
497 return DITEM_SUCCESS;
500 /* Use the most extreme security settings */
502 configSecurityExtreme(dialogMenuItem *self)
504 WINDOW *w = savescr();
506 variable_set2("nfs_server_enable", "NO", 1);
507 variable_set2("sendmail_enable", "NO", 1);
508 variable_set2("sshd_enable", "NO", 1);
509 variable_set2("kern_securelevel_enable", "YES", 1);
510 variable_set2("kern_securelevel", "2", 1);
513 msgConfirm("Extreme security settings have been selected.\n\n"
514 "Sendmail, sshd, and NFS services have been disabled, and\n"
515 "securelevels have been enabled.\n\n"
516 "PLEASE NOTE that this still does not save you from having\n"
517 "to properly secure your system in other ways or exercise\n"
518 "due diligence in your administration, this simply picks\n"
519 "a more secure set of out-of-box defaults to start with.\n\n"
520 "To change any of these settings later, edit /etc/rc.conf");
523 return DITEM_SUCCESS;
527 configSecurityModerate(dialogMenuItem *self)
529 WINDOW *w = savescr();
531 variable_set2("sendmail_enable", "YES", 1);
532 variable_set2("sshd_enable", "YES", 1);
533 variable_set2("kern_securelevel_enable", "NO", 1);
536 msgConfirm("Moderate security settings have been selected.\n\n"
537 "Sendmail and sshd have been enabled, securelevels are\n"
538 "disabled, and NFS server settings have been left intact.\n\n"
539 "PLEASE NOTE that this still does not save you from having\n"
540 "to properly secure your system in other ways or exercise\n"
541 "due diligence in your administration, this simply picks\n"
542 "a standard set of out-of-box defaults to start with.\n\n"
543 "To change any of these settings later, edit /etc/rc.conf");
546 return DITEM_SUCCESS;
550 write_root_xprofile(char *str)
555 static char *flist[] = { /* take care of both xdm and startx */
558 "/usr/share/skel/dot.xinitrc",
559 "/usr/share/skel/dot.xsession",
564 for (cp = flist; *cp; cp++) {
565 fp = fopen(*cp, "w");
567 fwrite(str, 1, len, fp);
568 fchmod(fileno(fp), 0755);
577 char tmp[FILENAME_MAX];
579 snprintf(tmp, sizeof tmp, "/usr/X11R6/bin/%s", fname);
580 if (file_executable(tmp))
582 snprintf(tmp, sizeof tmp, "/usr/local/bin/%s", fname);
583 return file_executable(tmp);
587 configXDesktop(dialogMenuItem *self)
590 int ret = DITEM_SUCCESS;
591 WINDOW *w = savescr();
593 dialog_clear_norefresh();
594 if (!dmenuOpenSimple(&MenuXDesktops, FALSE) || !(desk = variable_get(VAR_DESKSTYLE))) {
596 return DITEM_FAILURE;
598 if (!strcmp(desk, "kde")) {
599 ret = package_add("kde");
600 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("startkde"))
601 write_root_xprofile("exec startkde\n");
603 else if (!strcmp(desk, "gnome")) {
604 ret = package_add("gnomecore");
605 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("gnome-session")) {
606 ret = package_add("sawfish-gnome");
607 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("sawfish"))
608 write_root_xprofile("exec gnome-session\n");
611 else if (!strcmp(desk, "enlightenment")) {
612 ret = package_add("gnomecore");
613 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("gnome-session")) {
614 ret = package_add("enlightenment");
615 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("enlightenment"))
616 write_root_xprofile("exec gnome-session\n");
619 else if (!strcmp(desk, "afterstep")) {
620 ret = package_add("afterstep");
621 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("afterstep"))
622 write_root_xprofile("exec afterstep\n");
624 else if (!strcmp(desk, "windowmaker")) {
625 ret = package_add("windowmaker");
626 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("wmaker.inst")) {
627 write_root_xprofile("xterm &\n[ ! -d $HOME/GNUstep/Library/WindowMaker ] && /usr/X11R6/bin/wmaker.inst\nexec /usr/X11R6/bin/wmaker\n");
630 else if (!strcmp(desk, "fvwm2")) {
631 ret = package_add("fvwm");
632 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("fvwm"))
633 write_root_xprofile("exec fvwm\n");
635 if (DITEM_STATUS(ret) == DITEM_FAILURE)
636 msgConfirm("An error occurred while adding the package(s) required\n"
637 "by this desktop type. Please change installation media\n"
638 "and/or select a different, perhaps simpler, desktop\n"
639 "environment and try again.");
645 configXSetup(dialogMenuItem *self)
647 char *config, *execfile, *execcmd, *style, *tmp;
649 WINDOW *w = savescr();
651 setenv("XWINHOME", "/usr/X11R6", 1);
653 variable_unset(VAR_DESKSTYLE);
654 variable_unset(VAR_XF86_CONFIG);
655 dialog_clear_norefresh();
656 if (!dmenuOpenSimple(&MenuXF86Config, FALSE)) {
658 return DITEM_FAILURE;
660 config = variable_get(VAR_XF86_CONFIG);
661 style = variable_get(VAR_DESKSTYLE);
667 return DITEM_FAILURE;
671 if (file_readable("/var/run/ld-elf.so.hints"))
672 vsystem("/sbin/ldconfig -m /usr/lib /usr/X11R6/lib /usr/local/lib /usr/lib/compat");
674 vsystem("/sbin/ldconfig /usr/lib /usr/X11R6/lib /usr/local/lib /usr/lib/compat");
675 if (file_readable("/var/run/ld.so.hints"))
676 vsystem("ldconfig -m -aout /usr/lib/aout /usr/lib/compat/aout /usr/local/lib/aout /usr/X11R6/lib/aout");
678 vsystem("ldconfig -aout /usr/lib/aout /usr/lib/compat/aout /usr/local/lib/aout /usr/X11R6/lib/aout");
680 vsystem("/sbin/ifconfig lo0 127.0.0.1");
683 * execcmd may have been passed in as a command name with
684 * arguments. Therefore, before determining if it is suitable for
685 * execution, we must split off the filename component from the
686 * command line arguments.
689 execcmd = string_concat("/usr/X11R6/bin/", config);
690 execfile = strdup(execcmd);
691 if ((tmp = strchr(execfile, ' ')))
693 if (file_executable(execfile)) {
695 moused = variable_get(VAR_MOUSED);
696 while (!moused || strcmp(moused, "YES")) {
697 if (msgYesNo("The X server may access the mouse in two ways: direct access\n"
698 "or indirect access via the mouse daemon. You have not\n"
699 "configured the mouse daemon. Would you like to configure it\n"
700 "now? If you intend to let the X server access the mouse\n"
701 "directly, choose \"No\" at this time."))
703 dialog_clear_norefresh();
704 dmenuOpenSimple(&MenuMouse, FALSE);
705 moused = variable_get(VAR_MOUSED);
707 if (moused && !strcmp(moused, "YES"))
708 msgConfirm("You have configured and are now running the mouse daemon.\n"
709 "Choose \"/dev/sysmouse\" as the mouse port and \"SysMouse\" or\n"
710 "\"MouseSystems\" as the mouse protocol in the X configuration\n"
712 systemExecute(execcmd);
713 if (!file_readable("/etc/XF86Config")) {
714 if (!msgYesNo("The XFree86 configuration process seems to have\nfailed. Would you like to try again?"))
718 return DITEM_FAILURE;
722 configXDesktop(self);
724 return DITEM_SUCCESS;
728 msgConfirm("The XFree86 setup utility you chose does not appear to be installed!\n"
729 "Please install this before attempting to configure XFree86.");
731 return DITEM_FAILURE;
736 configResolv(dialogMenuItem *ditem)
739 char *cp, *c6p, *dp, *hp;
741 cp = variable_get(VAR_NAMESERVER);
745 fp = fopen("/etc/resolv.conf", "w");
747 return DITEM_FAILURE;
748 if (variable_get(VAR_DOMAINNAME))
749 fprintf(fp, "domain\t%s\n", variable_get(VAR_DOMAINNAME));
750 fprintf(fp, "nameserver\t%s\n", cp);
753 msgDebug("Wrote out /etc/resolv.conf\n");
756 dp = variable_get(VAR_DOMAINNAME);
757 cp = variable_get(VAR_IPADDR);
758 c6p = variable_get(VAR_IPV6ADDR);
759 hp = variable_get(VAR_HOSTNAME);
760 /* Tack ourselves into /etc/hosts */
761 fp = fopen("/etc/hosts", "w");
763 return DITEM_FAILURE;
764 /* Add an entry for localhost */
765 if (!variable_cmp(VAR_IPV6_ENABLE, "YES")) {
767 fprintf(fp, "::1\t\t\tlocalhost.%s localhost\n", dp);
769 fprintf(fp, "::1\t\t\tlocalhost\n");
772 fprintf(fp, "127.0.0.1\t\tlocalhost.%s localhost\n", dp);
774 fprintf(fp, "127.0.0.1\t\tlocalhost\n");
775 /* Now the host entries, if applicable */
776 if (((cp && cp[0] != '0') || (c6p && c6p[0] != '0')) && hp) {
782 SAFE_STRCPY(cp2, hp);
783 *(index(cp2, '.')) = '\0';
785 if (c6p && c6p[0] != '0') {
786 fprintf(fp, "%s\t%s %s\n", c6p, hp, cp2);
787 fprintf(fp, "%s\t%s.\n", c6p, hp);
789 if (cp && cp[0] != '0') {
790 fprintf(fp, "%s\t\t%s %s\n", cp, hp, cp2);
791 fprintf(fp, "%s\t\t%s.\n", cp, hp);
796 msgDebug("Wrote out /etc/hosts\n");
797 return DITEM_SUCCESS;
801 configRouter(dialogMenuItem *self)
805 ret = variable_get_value(VAR_ROUTER,
806 "Please specify the router you wish to use. Routed is\n"
807 "provided with the stock system and gated is provided\n"
808 "as an optional package which this installation system\n"
809 "will attempt to load if you select gated. Any other\n"
810 "choice of routing daemon will be assumed to be something\n"
811 "the user intends to install themselves before rebooting\n"
812 "the system. If you don't want any routing daemon, choose NO", 1)
813 ? DITEM_SUCCESS : DITEM_FAILURE;
815 if (ret == DITEM_SUCCESS) {
816 char *cp = variable_get(VAR_ROUTER);
818 if (cp && strcmp(cp, "NO")) {
819 variable_set2(VAR_ROUTER_ENABLE, "YES", 1);
820 if (!strcmp(cp, "gated")) {
821 if (package_add("gated") != DITEM_SUCCESS) {
822 msgConfirm("Unable to load gated package. Falling back to no router.");
823 variable_unset(VAR_ROUTER);
824 variable_unset(VAR_ROUTERFLAGS);
825 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
830 /* Now get the flags, if they chose a router */
831 ret = variable_get_value(VAR_ROUTERFLAGS,
832 "Please Specify the routing daemon flags; if you're running routed\n"
833 "then -q is the right choice for nodes and -s for gateway hosts.\n", 1)
834 ? DITEM_SUCCESS : DITEM_FAILURE;
835 if (ret != DITEM_SUCCESS)
836 variable_unset(VAR_ROUTERFLAGS);
841 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
842 variable_unset(VAR_ROUTERFLAGS);
843 variable_unset(VAR_ROUTER);
847 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
848 variable_unset(VAR_ROUTERFLAGS);
849 variable_unset(VAR_ROUTER);
854 /* Shared between us and index_initialize() */
855 extern PkgNode Top, Plist;
858 configPackages(dialogMenuItem *self)
860 int i, restoreflag = 0;
863 /* Did we get an INDEX? */
864 i = index_initialize("packages/INDEX");
865 if (DITEM_STATUS(i) == DITEM_FAILURE)
869 int ret, pos, scroll;
871 /* Bring up the packages menu */
873 index_menu(&Top, &Top, &Plist, &pos, &scroll);
875 if (Plist.kids && Plist.kids->name) {
876 /* Now show the packing list menu */
878 ret = index_menu(&Plist, &Plist, NULL, &pos, &scroll);
879 if (ret & DITEM_LEAVE_MENU)
881 else if (DITEM_STATUS(ret) != DITEM_FAILURE) {
884 for (tmp = Plist.kids; tmp && tmp->name; tmp = tmp->next)
885 (void)index_extract(mediaDevice, &Top, tmp, FALSE);
890 msgConfirm("No packages were selected for extraction.");
896 PkgNodePtr tmp2 = tmp->next;
901 index_init(NULL, &Plist);
902 return DITEM_SUCCESS | (restoreflag ? DITEM_RESTORE : 0);
905 /* Load pcnfsd package */
907 configPCNFSD(dialogMenuItem *self)
911 ret = package_add("pcnfsd");
912 if (DITEM_STATUS(ret) == DITEM_SUCCESS) {
913 variable_set2(VAR_PCNFSD, "YES", 0);
914 variable_set2("mountd_flags", "-n", 1);
920 configInetd(dialogMenuItem *self)
924 WINDOW *w = savescr();
926 if (msgYesNo("The Internet Super Server (inetd) allows a number of simple Internet\n"
927 "services to be enabled, including finger, ftp, and telnetd. Enabling\n"
928 "these services may increase risk of security problems by increasing\n"
929 "the exposure of your system.\n\n"
930 "With this in mind, do you wish to enable inetd?\n")) {
931 variable_set2("inetd_enable", "NO", 1);
933 /* If inetd is enabled, we'll need an inetd.conf */
935 if (!msgYesNo("inetd(8) relies on its configuration file, /etc/inetd.conf, to determine\n"
936 "which of its Internet services will be available. The default FreeBSD\n"
937 "inetd.conf(5) leaves all services disabled by default, so they must be\n"
938 "specifically enabled in the configuration file before they will\n"
939 "function, even once inetd(8) is enabled. Note that services for\n"
940 "IPv6 must be seperately enabled from IPv4 services.\n\n"
941 "Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to\n"
942 "use the current settings.\n")) {
943 sprintf(cmd, "%s /etc/inetd.conf", variable_get(VAR_EDITOR));
946 variable_set2("inetd_enable", "YES", 1);
950 return DITEM_SUCCESS;
954 configNFSServer(dialogMenuItem *self)
958 /* If we're an NFS server, we need an exports file */
959 if (!file_readable("/etc/exports")) {
960 WINDOW *w = savescr();
962 if (file_readable("/etc/exports.disabled"))
963 vsystem("mv /etc/exports.disabled /etc/exports");
965 dialog_clear_norefresh();
966 msgConfirm("Operating as an NFS server means that you must first configure\n"
967 "an /etc/exports file to indicate which hosts are allowed certain\n"
968 "kinds of access to your local file systems.\n"
969 "Press [ENTER] now to invoke an editor on /etc/exports\n");
970 vsystem("echo '#The following examples export /usr to 3 machines named after ducks,' > /etc/exports");
971 vsystem("echo '#/usr/src and /usr/ports read-only to machines named after trouble makers' >> /etc/exports");
972 vsystem("echo '#/home and all directories under it to machines named after dead rock stars' >> /etc/exports");
973 vsystem("echo '#and, /a to a network of privileged machines allowed to write on it as root.' >> /etc/exports");
974 vsystem("echo '#/usr huey louie dewie' >> /etc/exports");
975 vsystem("echo '#/usr/src /usr/obj -ro calvin hobbes' >> /etc/exports");
976 vsystem("echo '#/home -alldirs janice jimmy frank' >> /etc/exports");
977 vsystem("echo '#/a -maproot=0 -network 10.0.1.0 -mask 255.255.248.0' >> /etc/exports");
978 vsystem("echo '#' >> /etc/exports");
979 vsystem("echo '# You should replace these lines with your actual exported filesystems.' >> /etc/exports");
980 vsystem("echo '# Note that BSD's export synatx is \"host-centric\" vs. Sun\'s \"FS-centric\" one.' >> /etc/exports");
981 vsystem("echo >> /etc/exports");
982 sprintf(cmd, "%s /etc/exports", variable_get(VAR_EDITOR));
986 variable_set2(VAR_NFS_SERVER, "YES", 1);
989 else if (variable_get(VAR_NFS_SERVER)) { /* We want to turn it off again? */
990 vsystem("mv -f /etc/exports /etc/exports.disabled");
991 variable_unset(VAR_NFS_SERVER);
993 return DITEM_SUCCESS;
997 configEtcTtys(dialogMenuItem *self)
1001 WINDOW *w = savescr();
1003 /* Simply prompt for confirmation, then edit away. */
1004 if (msgYesNo("Configuration of system TTYs requires editing the /etc/ttys file.\n"
1005 "Typical configuration activities might include enabling getty(8)\n"
1006 "on the first serial port to allow login via serial console after\n"
1007 "reboot, or to enable xdm. The default ttys file enables normal\n"
1008 "virtual consoles, and most sites will not need to perform manual\n"
1009 "configuration.\n\n"
1010 "To load /etc/ttys in the editor, select [Yes], otherwise, [No].")) {
1013 sprintf(cmd, "%s /etc/ttys", variable_get(VAR_EDITOR));
1019 return DITEM_SUCCESS;