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);
249 /* And finally, a /proc. */
250 fprintf(fstab, "proc\t\t\t/proc\t\tprocfs\trw\t\t0\t0\n");
255 msgDebug("Wrote out /etc/fstab file\n");
256 return DITEM_SUCCESS;
259 /* Do the work of sucking in a config file.
260 * config is the filename to read in.
261 * lines is a fixed (max) sized array of char*
262 * returns number of lines read. line contents
263 * are malloc'd and must be freed by the caller.
266 readConfig(char *config, char **lines, int max)
272 fp = fopen(config, "r");
277 /* Read in the entire file */
278 for (i = 0; i < max; i++) {
279 if (!fgets(line, sizeof line, fp))
281 lines[nlines++] = strdup(line);
285 msgDebug("readConfig: Read %d lines from %s.\n", nlines, config);
289 #define MAX_LINES 2000 /* Some big number we're not likely to ever reach - I'm being really lazy here, I know */
292 readConfigFile(char *config, int marked)
294 char *lines[MAX_LINES], *cp, *cp2;
297 nlines = readConfig(config, lines, MAX_LINES);
301 for (i = 0; i < nlines; i++) {
302 /* Skip the comments & non-variable settings */
303 if (lines[i][0] == '#' || !(cp = index(lines[i], '='))) {
309 if ((cp2 = index(cp, '"')) || (cp2 = index(cp, '\047'))) {
311 cp2 = index(cp, *cp2);
313 /* If valid quotes, use it */
316 /* If we have a legit value, set it */
318 variable_set2(lines[i], cp, marked);
324 /* Load the environment from rc.conf file(s) */
326 configEnvironmentRC_conf(void)
332 { "/etc/defaults/rc.conf", 0 },
333 { "/etc/rc.conf", 0 },
334 { "/etc/rc.conf.local", 0 },
339 for (i = 0; configs[i].fname; i++) {
340 if (file_readable(configs[i].fname))
341 readConfigFile(configs[i].fname, configs[i].marked);
345 /* Load the environment from a resolv.conf file */
347 configEnvironmentResolv(char *config)
349 char *lines[MAX_LINES];
352 nlines = readConfig(config, lines, MAX_LINES);
355 for (i = 0; i < nlines; i++) {
356 Boolean name_set = variable_get(VAR_NAMESERVER) ? 1 : 0;
358 if (!strncmp(lines[i], "domain", 6) && !variable_get(VAR_DOMAINNAME))
359 variable_set2(VAR_DOMAINNAME, string_skipwhite(string_prune(lines[i] + 6)), 0);
360 else if (!name_set && !strncmp(lines[i], "nameserver", 10)) {
361 /* Only take the first nameserver setting - we're lame */
362 variable_set2(VAR_NAMESERVER, string_skipwhite(string_prune(lines[i] + 10)), 0);
368 /* Version of below for dispatch routines */
370 configRC(dialogMenuItem *unused)
373 return DITEM_SUCCESS;
384 static int did_marker = 0;
388 write_header = !file_readable("/etc/rc.conf");
389 rcSite = fopen("/etc/rc.conf", "a");
393 fprintf(rcSite, "# This file now contains just the overrides from /etc/defaults/rc.conf.\n");
394 fprintf(rcSite, "# Please make all changes to this file, not to /etc/defaults/rc.conf.\n\n");
395 fprintf(rcSite, "# Enable network daemons for user convenience.\n");
396 if ((t_loc = time(NULL)) != -1 && (cp = ctime(&t_loc)))
397 fprintf(rcSite, "# Created: %s", cp);
400 /* Now do variable substitutions */
401 for (v = VarHead; v; v = v->next) {
405 fprintf(rcSite, "# -- sysinstall generated deltas -- # "
409 fprintf(rcSite, "%s=\"%s\"\n", v->name, v->value);
414 /* Tidy up the resulting file if it's late enough in the installation
415 for sort and uniq to be available */
416 if (RunningAsInit && file_readable("/usr/bin/sort") && file_readable("/usr/bin/uniq"))
417 (void)vsystem("sort /etc/rc.conf | uniq > /etc/rc.conf.new && mv /etc/rc.conf.new /etc/rc.conf");
421 configSaver(dialogMenuItem *self)
423 variable_set((char *)self->data, 1);
424 if (!variable_get(VAR_BLANKTIME))
425 variable_set2(VAR_BLANKTIME, "300", 1);
426 return DITEM_SUCCESS;
430 configSaverTimeout(dialogMenuItem *self)
432 return (variable_get_value(VAR_BLANKTIME,
433 "Enter time-out period in seconds for screen saver", 1) ?
434 DITEM_SUCCESS : DITEM_FAILURE);
438 configNTP(dialogMenuItem *self)
442 status = variable_get_value(VAR_NTPDATE_FLAGS,
443 "Enter the name of an NTP server", 1)
444 ? DITEM_SUCCESS : DITEM_FAILURE;
445 if (status == DITEM_SUCCESS) {
446 static char tmp[255];
448 snprintf(tmp, sizeof(tmp), "ntpdate_enable=YES,ntpdate_flags=%s",
449 variable_get(VAR_NTPDATE_FLAGS));
451 dmenuSetVariables(self);
457 configUsers(dialogMenuItem *self)
459 WINDOW *w = savescr();
461 dialog_clear_norefresh();
462 dmenuOpenSimple(&MenuUsermgmt, FALSE);
464 return DITEM_SUCCESS;
468 configLinux(dialogMenuItem *self)
470 WINDOW *w = savescr();
473 dialog_clear_norefresh();
474 variable_set2(VAR_LINUX_ENABLE, "YES", 1);
475 Mkdir("/compat/linux");
476 msgNotify("Installing Linux compatibility library...");
477 i = package_add("linux_base");
483 configSecurityProfile(dialogMenuItem *self)
485 WINDOW *w = savescr();
487 dialog_clear_norefresh();
488 dmenuOpenSimple(&MenuSecurityProfile, FALSE);
490 return DITEM_SUCCESS;
493 /* Use the most extreme security settings */
495 configSecurityExtreme(dialogMenuItem *self)
497 WINDOW *w = savescr();
499 variable_set2("nfs_server_enable", "NO", 1);
500 variable_set2("sendmail_enable", "NO", 1);
501 variable_set2("sshd_enable", "NO", 1);
502 variable_set2("kern_securelevel_enable", "YES", 1);
503 variable_set2("kern_securelevel", "2", 1);
506 msgConfirm("Extreme security settings have been selected.\n\n"
507 "Sendmail, sshd, and NFS services have been disabled, and\n"
508 "securelevels have been enabled.\n\n"
509 "PLEASE NOTE that this still does not save you from having\n"
510 "to properly secure your system in other ways or exercise\n"
511 "due diligence in your administration, this simply picks\n"
512 "a more secure set of out-of-box defaults to start with.\n\n"
513 "To change any of these settings later, edit /etc/rc.conf");
516 return DITEM_SUCCESS;
520 configSecurityModerate(dialogMenuItem *self)
522 WINDOW *w = savescr();
524 variable_set2("nfs_reserved_port_only", "YES", 1);
525 variable_set2("sendmail_enable", "YES", 1);
526 variable_set2("sshd_enable", "YES", 1);
527 variable_set2("kern_securelevel_enable", "NO", 1);
530 msgConfirm("Moderate security settings have been selected.\n\n"
531 "Sendmail and sshd have been enabled, securelevels are\n"
532 "disabled, and NFS server settings have been left intact.\n\n"
533 "PLEASE NOTE that this still does not save you from having\n"
534 "to properly secure your system in other ways or exercise\n"
535 "due diligence in your administration, this simply picks\n"
536 "a standard set of out-of-box defaults to start with.\n\n"
537 "To change any of these settings later, edit /etc/rc.conf");
540 return DITEM_SUCCESS;
544 write_root_xprofile(char *str)
549 static char *flist[] = { /* take care of both xdm and startx */
552 "/usr/share/skel/dot.xinitrc",
553 "/usr/share/skel/dot.xsession",
558 for (cp = flist; *cp; cp++) {
559 fp = fopen(*cp, "w");
561 fwrite(str, 1, len, fp);
562 fchmod(fileno(fp), 0755);
571 char tmp[FILENAME_MAX];
573 snprintf(tmp, sizeof tmp, "/usr/X11R6/bin/%s", fname);
574 if (file_executable(tmp))
576 snprintf(tmp, sizeof tmp, "/usr/local/bin/%s", fname);
577 return file_executable(tmp);
581 configXDesktop(dialogMenuItem *self)
584 int ret = DITEM_SUCCESS;
585 WINDOW *w = savescr();
587 dialog_clear_norefresh();
588 if (!dmenuOpenSimple(&MenuXDesktops, FALSE) || !(desk = variable_get(VAR_DESKSTYLE))) {
590 return DITEM_FAILURE;
592 if (!strcmp(desk, "kde")) {
593 ret = package_add("kde");
594 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("startkde"))
595 write_root_xprofile("exec startkde\n");
597 else if (!strcmp(desk, "gnome")) {
598 ret = package_add("gnomecore");
599 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("gnome-session")) {
600 ret = package_add("sawfish");
601 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("sawfish"))
602 write_root_xprofile("exec gnome-session\n");
605 else if (!strcmp(desk, "enlightenment")) {
606 ret = package_add("gnomecore");
607 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("gnome-session")) {
608 ret = package_add("enlightenment");
609 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("enlightenment"))
610 write_root_xprofile("exec gnome-session\n");
613 else if (!strcmp(desk, "afterstep")) {
614 ret = package_add("afterstep");
615 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("afterstep"))
616 write_root_xprofile("exec afterstep\n");
618 else if (!strcmp(desk, "windowmaker")) {
619 ret = package_add("windowmaker");
620 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("wmaker.inst")) {
621 write_root_xprofile("xterm &\n[ ! -d $HOME/GNUstep/Library/WindowMaker ] && /usr/X11R6/bin/wmaker.inst\nexec /usr/X11R6/bin/wmaker\n");
624 else if (!strcmp(desk, "fvwm2")) {
625 ret = package_add("fvwm");
626 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("fvwm"))
627 write_root_xprofile("exec fvwm\n");
629 if (DITEM_STATUS(ret) == DITEM_FAILURE)
630 msgConfirm("An error occurred while adding the package(s) required\n"
631 "by this desktop type. Please change installation media\n"
632 "and/or select a different, perhaps simpler, desktop\n"
633 "environment and try again.");
639 configXSetup(dialogMenuItem *self)
641 char *config, *execfile, *style;
643 WINDOW *w = savescr();
645 setenv("XWINHOME", "/usr/X11R6", 1);
647 variable_unset(VAR_DESKSTYLE);
648 variable_unset(VAR_XF86_CONFIG);
649 dialog_clear_norefresh();
650 if (!dmenuOpenSimple(&MenuXF86Config, FALSE)) {
652 return DITEM_FAILURE;
654 config = variable_get(VAR_XF86_CONFIG);
655 style = variable_get(VAR_DESKSTYLE);
661 return DITEM_FAILURE;
665 if (file_readable("/var/run/ld-elf.so.hints"))
666 vsystem("/sbin/ldconfig -m /usr/lib /usr/X11R6/lib /usr/local/lib /usr/lib/compat");
668 vsystem("/sbin/ldconfig /usr/lib /usr/X11R6/lib /usr/local/lib /usr/lib/compat");
669 if (file_readable("/var/run/ld.so.hints"))
670 vsystem("ldconfig -m -aout /usr/lib/aout /usr/lib/compat/aout /usr/local/lib/aout /usr/X11R6/lib/aout");
672 vsystem("ldconfig -aout /usr/lib/aout /usr/lib/compat/aout /usr/local/lib/aout /usr/X11R6/lib/aout");
674 vsystem("/sbin/ifconfig lo0 127.0.0.1");
675 execfile = string_concat("/usr/X11R6/bin/", config);
676 if (file_executable(execfile)) {
677 moused = variable_get(VAR_MOUSED);
678 while (!moused || strcmp(moused, "YES")) {
679 if (msgYesNo("The X server may access the mouse in two ways: direct access\n"
680 "or indirect access via the mouse daemon. You have not\n"
681 "configured the mouse daemon. Would you like to configure it\n"
682 "now? If you intend to let the X server access the mouse\n"
683 "directly, choose \"No\" at this time."))
685 dialog_clear_norefresh();
686 dmenuOpenSimple(&MenuMouse, FALSE);
687 moused = variable_get(VAR_MOUSED);
689 if (moused && !strcmp(moused, "YES"))
690 msgConfirm("You have configured and are now running the mouse daemon.\n"
691 "Choose \"/dev/sysmouse\" as the mouse port and \"SysMouse\" or\n"
692 "\"MouseSystems\" as the mouse protocol in the X configuration\n"
694 systemExecute(execfile);
695 if (!file_readable("/etc/XF86Config")) {
696 if (!msgYesNo("The XFree86 configuration process seems to have\nfailed. Would you like to try again?"))
700 return DITEM_FAILURE;
704 configXDesktop(self);
706 return DITEM_SUCCESS;
709 msgConfirm("The XFree86 setup utility you chose does not appear to be installed!\n"
710 "Please install this before attempting to configure XFree86.");
712 return DITEM_FAILURE;
717 configResolv(dialogMenuItem *ditem)
720 char *cp, *c6p, *dp, *hp;
722 cp = variable_get(VAR_NAMESERVER);
726 fp = fopen("/etc/resolv.conf", "w");
728 return DITEM_FAILURE;
729 if (variable_get(VAR_DOMAINNAME))
730 fprintf(fp, "domain\t%s\n", variable_get(VAR_DOMAINNAME));
731 fprintf(fp, "nameserver\t%s\n", cp);
734 msgDebug("Wrote out /etc/resolv.conf\n");
737 dp = variable_get(VAR_DOMAINNAME);
738 cp = variable_get(VAR_IPADDR);
739 c6p = variable_get(VAR_IPV6ADDR);
740 hp = variable_get(VAR_HOSTNAME);
741 /* Tack ourselves into /etc/hosts */
742 fp = fopen("/etc/hosts", "w");
744 return DITEM_FAILURE;
745 /* Add an entry for localhost */
746 if (!variable_cmp(VAR_IPV6_ENABLE, "YES")) {
748 fprintf(fp, "::1\t\t\tlocalhost.%s localhost\n", dp);
750 fprintf(fp, "::1\t\t\tlocalhost\n");
753 fprintf(fp, "127.0.0.1\t\tlocalhost.%s localhost\n", dp);
755 fprintf(fp, "127.0.0.1\t\tlocalhost\n");
756 /* Now the host entries, if applicable */
757 if (((cp && cp[0] != '0') || (c6p && c6p[0] != '0')) && hp) {
763 SAFE_STRCPY(cp2, hp);
764 *(index(cp2, '.')) = '\0';
766 if (c6p && c6p[0] != '0') {
767 fprintf(fp, "%s\t%s %s\n", c6p, hp, cp2);
768 fprintf(fp, "%s\t%s.\n", c6p, hp);
770 if (cp && cp[0] != '0') {
771 fprintf(fp, "%s\t\t%s %s\n", cp, hp, cp2);
772 fprintf(fp, "%s\t\t%s.\n", cp, hp);
777 msgDebug("Wrote out /etc/hosts\n");
778 return DITEM_SUCCESS;
782 configRouter(dialogMenuItem *self)
786 ret = variable_get_value(VAR_ROUTER,
787 "Please specify the router you wish to use. Routed is\n"
788 "provided with the stock system and gated is provided\n"
789 "as an optional package which this installation system\n"
790 "will attempt to load if you select gated. Any other\n"
791 "choice of routing daemon will be assumed to be something\n"
792 "the user intends to install themselves before rebooting\n"
793 "the system. If you don't want any routing daemon, choose NO", 1)
794 ? DITEM_SUCCESS : DITEM_FAILURE;
796 if (ret == DITEM_SUCCESS) {
797 char *cp = variable_get(VAR_ROUTER);
799 if (cp && strcmp(cp, "NO")) {
800 variable_set2(VAR_ROUTER_ENABLE, "YES", 1);
801 if (!strcmp(cp, "gated")) {
802 if (package_add("gated") != DITEM_SUCCESS) {
803 msgConfirm("Unable to load gated package. Falling back to no router.");
804 variable_unset(VAR_ROUTER);
805 variable_unset(VAR_ROUTERFLAGS);
806 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
811 /* Now get the flags, if they chose a router */
812 ret = variable_get_value(VAR_ROUTERFLAGS,
813 "Please Specify the routing daemon flags; if you're running routed\n"
814 "then -q is the right choice for nodes and -s for gateway hosts.\n", 1)
815 ? DITEM_SUCCESS : DITEM_FAILURE;
816 if (ret != DITEM_SUCCESS)
817 variable_unset(VAR_ROUTERFLAGS);
822 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
823 variable_unset(VAR_ROUTERFLAGS);
824 variable_unset(VAR_ROUTER);
828 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
829 variable_unset(VAR_ROUTERFLAGS);
830 variable_unset(VAR_ROUTER);
835 /* Shared between us and index_initialize() */
836 extern PkgNode Top, Plist;
839 configPackages(dialogMenuItem *self)
841 int i, restoreflag = 0;
844 /* Did we get an INDEX? */
845 i = index_initialize("packages/INDEX");
846 if (DITEM_STATUS(i) == DITEM_FAILURE)
850 int ret, pos, scroll;
852 /* Bring up the packages menu */
854 index_menu(&Top, &Top, &Plist, &pos, &scroll);
856 if (Plist.kids && Plist.kids->name) {
857 /* Now show the packing list menu */
859 ret = index_menu(&Plist, &Plist, NULL, &pos, &scroll);
860 if (ret & DITEM_LEAVE_MENU)
862 else if (DITEM_STATUS(ret) != DITEM_FAILURE) {
865 for (tmp = Plist.kids; tmp && tmp->name; tmp = tmp->next)
866 (void)index_extract(mediaDevice, &Top, tmp, FALSE);
871 msgConfirm("No packages were selected for extraction.");
877 PkgNodePtr tmp2 = tmp->next;
882 index_init(NULL, &Plist);
883 return DITEM_SUCCESS | (restoreflag ? DITEM_RESTORE : 0);
886 /* Load pcnfsd package */
888 configPCNFSD(dialogMenuItem *self)
892 ret = package_add("pcnfsd");
893 if (DITEM_STATUS(ret) == DITEM_SUCCESS) {
894 variable_set2(VAR_PCNFSD, "YES", 0);
895 variable_set2("mountd_flags", "-n", 1);
901 configInetd(dialogMenuItem *self)
905 WINDOW *w = savescr();
907 if (msgYesNo("The Internet Super Server (inetd) allows a number of simple Internet\n"
908 "services to be enabled, including finger, ftp, and telnetd. Enabling\n"
909 "these services may increase risk of security problems by increasing\n"
910 "the exposure of your system.\n\n"
911 "With this in mind, do you wish to enable inetd?\n")) {
912 variable_set2("inetd_enable", "NO", 1);
914 /* If inetd is enabled, we'll need an inetd.conf */
916 if (!msgYesNo("inetd(8) relies on its configuration file, /etc/inetd.conf, to determine\n"
917 "which of its Internet services will be available. The default FreeBSD\n"
918 "inetd.conf(5) leaves all services disabled by default, so they must be\n"
919 "specifically enabled in the configuration file before they will\n"
920 "function, even once inetd(8) is enabled. Note that services for\n"
921 "IPv6 must be seperately enabled from IPv4 services.\n\n"
922 "Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to\n"
923 "use the current settings.\n")) {
924 sprintf(cmd, "%s /etc/inetd.conf", variable_get(VAR_EDITOR));
927 variable_set2("inetd_enable", "YES", 1);
931 return DITEM_SUCCESS;
935 configNFSServer(dialogMenuItem *self)
939 /* If we're an NFS server, we need an exports file */
940 if (!file_readable("/etc/exports")) {
941 WINDOW *w = savescr();
943 if (file_readable("/etc/exports.disabled"))
944 vsystem("mv /etc/exports.disabled /etc/exports");
946 dialog_clear_norefresh();
947 msgConfirm("Operating as an NFS server means that you must first configure\n"
948 "an /etc/exports file to indicate which hosts are allowed certain\n"
949 "kinds of access to your local file systems.\n"
950 "Press [ENTER] now to invoke an editor on /etc/exports\n");
951 vsystem("echo '#The following examples export /usr to 3 machines named after ducks,' > /etc/exports");
952 vsystem("echo '#/usr/src and /usr/ports read-only to machines named after trouble makers' >> /etc/exports");
953 vsystem("echo '#/home and all directories under it to machines named after dead rock stars' >> /etc/exports");
954 vsystem("echo '#and, /a to a network of privileged machines allowed to write on it as root.' >> /etc/exports");
955 vsystem("echo '#/usr huey louie dewie' >> /etc/exports");
956 vsystem("echo '#/usr/src /usr/obj -ro calvin hobbes' >> /etc/exports");
957 vsystem("echo '#/home -alldirs janice jimmy frank' >> /etc/exports");
958 vsystem("echo '#/a -maproot=0 -network 10.0.1.0 -mask 255.255.248.0' >> /etc/exports");
959 vsystem("echo '#' >> /etc/exports");
960 vsystem("echo '# You should replace these lines with your actual exported filesystems.' >> /etc/exports");
961 vsystem("echo '# Note that BSD's export synatx is \"host-centric\" vs. Sun\'s \"FS-centric\" one.' >> /etc/exports");
962 vsystem("echo >> /etc/exports");
963 sprintf(cmd, "%s /etc/exports", variable_get(VAR_EDITOR));
967 variable_set2(VAR_NFS_SERVER, "YES", 1);
970 else if (variable_get(VAR_NFS_SERVER)) { /* We want to turn it off again? */
971 vsystem("mv -f /etc/exports /etc/exports.disabled");
972 variable_unset(VAR_NFS_SERVER);
974 return DITEM_SUCCESS;
978 configEtcTtys(dialogMenuItem *self)
982 WINDOW *w = savescr();
984 /* Simply prompt for confirmation, then edit away. */
985 if (msgYesNo("Configuration of system TTYs requires editing the /etc/ttys file.\n"
986 "Typical configuration activities might include enabling getty(8)\n"
987 "on the first serial port to allow login via serial console after\n"
988 "reboot, or to enable xdm. The default ttys file enables normal\n"
989 "virtual consoles, and most sites will not need to perform manual\n"
991 "To load /etc/ttys in the editor, select [Yes], otherwise, [No].")) {
994 sprintf(cmd, "%s /etc/ttys", variable_get(VAR_EDITOR));
1000 return DITEM_SUCCESS;