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, *style;
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");
681 execfile = string_concat("/usr/X11R6/bin/", config);
682 if (file_executable(execfile)) {
683 moused = variable_get(VAR_MOUSED);
684 while (!moused || strcmp(moused, "YES")) {
685 if (msgYesNo("The X server may access the mouse in two ways: direct access\n"
686 "or indirect access via the mouse daemon. You have not\n"
687 "configured the mouse daemon. Would you like to configure it\n"
688 "now? If you intend to let the X server access the mouse\n"
689 "directly, choose \"No\" at this time."))
691 dialog_clear_norefresh();
692 dmenuOpenSimple(&MenuMouse, FALSE);
693 moused = variable_get(VAR_MOUSED);
695 if (moused && !strcmp(moused, "YES"))
696 msgConfirm("You have configured and are now running the mouse daemon.\n"
697 "Choose \"/dev/sysmouse\" as the mouse port and \"SysMouse\" or\n"
698 "\"MouseSystems\" as the mouse protocol in the X configuration\n"
700 systemExecute(execfile);
701 if (!file_readable("/etc/XF86Config")) {
702 if (!msgYesNo("The XFree86 configuration process seems to have\nfailed. Would you like to try again?"))
706 return DITEM_FAILURE;
710 configXDesktop(self);
712 return DITEM_SUCCESS;
715 msgConfirm("The XFree86 setup utility you chose does not appear to be installed!\n"
716 "Please install this before attempting to configure XFree86.");
718 return DITEM_FAILURE;
723 configResolv(dialogMenuItem *ditem)
726 char *cp, *c6p, *dp, *hp;
728 cp = variable_get(VAR_NAMESERVER);
732 fp = fopen("/etc/resolv.conf", "w");
734 return DITEM_FAILURE;
735 if (variable_get(VAR_DOMAINNAME))
736 fprintf(fp, "domain\t%s\n", variable_get(VAR_DOMAINNAME));
737 fprintf(fp, "nameserver\t%s\n", cp);
740 msgDebug("Wrote out /etc/resolv.conf\n");
743 dp = variable_get(VAR_DOMAINNAME);
744 cp = variable_get(VAR_IPADDR);
745 c6p = variable_get(VAR_IPV6ADDR);
746 hp = variable_get(VAR_HOSTNAME);
747 /* Tack ourselves into /etc/hosts */
748 fp = fopen("/etc/hosts", "w");
750 return DITEM_FAILURE;
751 /* Add an entry for localhost */
752 if (!variable_cmp(VAR_IPV6_ENABLE, "YES")) {
754 fprintf(fp, "::1\t\t\tlocalhost.%s localhost\n", dp);
756 fprintf(fp, "::1\t\t\tlocalhost\n");
759 fprintf(fp, "127.0.0.1\t\tlocalhost.%s localhost\n", dp);
761 fprintf(fp, "127.0.0.1\t\tlocalhost\n");
762 /* Now the host entries, if applicable */
763 if (((cp && cp[0] != '0') || (c6p && c6p[0] != '0')) && hp) {
769 SAFE_STRCPY(cp2, hp);
770 *(index(cp2, '.')) = '\0';
772 if (c6p && c6p[0] != '0') {
773 fprintf(fp, "%s\t%s %s\n", c6p, hp, cp2);
774 fprintf(fp, "%s\t%s.\n", c6p, hp);
776 if (cp && cp[0] != '0') {
777 fprintf(fp, "%s\t\t%s %s\n", cp, hp, cp2);
778 fprintf(fp, "%s\t\t%s.\n", cp, hp);
783 msgDebug("Wrote out /etc/hosts\n");
784 return DITEM_SUCCESS;
788 configRouter(dialogMenuItem *self)
792 ret = variable_get_value(VAR_ROUTER,
793 "Please specify the router you wish to use. Routed is\n"
794 "provided with the stock system and gated is provided\n"
795 "as an optional package which this installation system\n"
796 "will attempt to load if you select gated. Any other\n"
797 "choice of routing daemon will be assumed to be something\n"
798 "the user intends to install themselves before rebooting\n"
799 "the system. If you don't want any routing daemon, choose NO", 1)
800 ? DITEM_SUCCESS : DITEM_FAILURE;
802 if (ret == DITEM_SUCCESS) {
803 char *cp = variable_get(VAR_ROUTER);
805 if (cp && strcmp(cp, "NO")) {
806 variable_set2(VAR_ROUTER_ENABLE, "YES", 1);
807 if (!strcmp(cp, "gated")) {
808 if (package_add("gated") != DITEM_SUCCESS) {
809 msgConfirm("Unable to load gated package. Falling back to no router.");
810 variable_unset(VAR_ROUTER);
811 variable_unset(VAR_ROUTERFLAGS);
812 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
817 /* Now get the flags, if they chose a router */
818 ret = variable_get_value(VAR_ROUTERFLAGS,
819 "Please Specify the routing daemon flags; if you're running routed\n"
820 "then -q is the right choice for nodes and -s for gateway hosts.\n", 1)
821 ? DITEM_SUCCESS : DITEM_FAILURE;
822 if (ret != DITEM_SUCCESS)
823 variable_unset(VAR_ROUTERFLAGS);
828 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
829 variable_unset(VAR_ROUTERFLAGS);
830 variable_unset(VAR_ROUTER);
834 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
835 variable_unset(VAR_ROUTERFLAGS);
836 variable_unset(VAR_ROUTER);
841 /* Shared between us and index_initialize() */
842 extern PkgNode Top, Plist;
845 configPackages(dialogMenuItem *self)
847 int i, restoreflag = 0;
850 /* Did we get an INDEX? */
851 i = index_initialize("packages/INDEX");
852 if (DITEM_STATUS(i) == DITEM_FAILURE)
856 int ret, pos, scroll;
858 /* Bring up the packages menu */
860 index_menu(&Top, &Top, &Plist, &pos, &scroll);
862 if (Plist.kids && Plist.kids->name) {
863 /* Now show the packing list menu */
865 ret = index_menu(&Plist, &Plist, NULL, &pos, &scroll);
866 if (ret & DITEM_LEAVE_MENU)
868 else if (DITEM_STATUS(ret) != DITEM_FAILURE) {
871 for (tmp = Plist.kids; tmp && tmp->name; tmp = tmp->next)
872 (void)index_extract(mediaDevice, &Top, tmp, FALSE);
877 msgConfirm("No packages were selected for extraction.");
883 PkgNodePtr tmp2 = tmp->next;
888 index_init(NULL, &Plist);
889 return DITEM_SUCCESS | (restoreflag ? DITEM_RESTORE : 0);
892 /* Load pcnfsd package */
894 configPCNFSD(dialogMenuItem *self)
898 ret = package_add("pcnfsd");
899 if (DITEM_STATUS(ret) == DITEM_SUCCESS) {
900 variable_set2(VAR_PCNFSD, "YES", 0);
901 variable_set2("mountd_flags", "-n", 1);
907 configInetd(dialogMenuItem *self)
911 WINDOW *w = savescr();
913 if (msgYesNo("The Internet Super Server (inetd) allows a number of simple Internet\n"
914 "services to be enabled, including finger, ftp, and telnetd. Enabling\n"
915 "these services may increase risk of security problems by increasing\n"
916 "the exposure of your system.\n\n"
917 "With this in mind, do you wish to enable inetd?\n")) {
918 variable_set2("inetd_enable", "NO", 1);
920 /* If inetd is enabled, we'll need an inetd.conf */
922 if (!msgYesNo("inetd(8) relies on its configuration file, /etc/inetd.conf, to determine\n"
923 "which of its Internet services will be available. The default FreeBSD\n"
924 "inetd.conf(5) leaves all services disabled by default, so they must be\n"
925 "specifically enabled in the configuration file before they will\n"
926 "function, even once inetd(8) is enabled. Note that services for\n"
927 "IPv6 must be seperately enabled from IPv4 services.\n\n"
928 "Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to\n"
929 "use the current settings.\n")) {
930 sprintf(cmd, "%s /etc/inetd.conf", variable_get(VAR_EDITOR));
933 variable_set2("inetd_enable", "YES", 1);
937 return DITEM_SUCCESS;
941 configNFSServer(dialogMenuItem *self)
945 /* If we're an NFS server, we need an exports file */
946 if (!file_readable("/etc/exports")) {
947 WINDOW *w = savescr();
949 if (file_readable("/etc/exports.disabled"))
950 vsystem("mv /etc/exports.disabled /etc/exports");
952 dialog_clear_norefresh();
953 msgConfirm("Operating as an NFS server means that you must first configure\n"
954 "an /etc/exports file to indicate which hosts are allowed certain\n"
955 "kinds of access to your local file systems.\n"
956 "Press [ENTER] now to invoke an editor on /etc/exports\n");
957 vsystem("echo '#The following examples export /usr to 3 machines named after ducks,' > /etc/exports");
958 vsystem("echo '#/usr/src and /usr/ports read-only to machines named after trouble makers' >> /etc/exports");
959 vsystem("echo '#/home and all directories under it to machines named after dead rock stars' >> /etc/exports");
960 vsystem("echo '#and, /a to a network of privileged machines allowed to write on it as root.' >> /etc/exports");
961 vsystem("echo '#/usr huey louie dewie' >> /etc/exports");
962 vsystem("echo '#/usr/src /usr/obj -ro calvin hobbes' >> /etc/exports");
963 vsystem("echo '#/home -alldirs janice jimmy frank' >> /etc/exports");
964 vsystem("echo '#/a -maproot=0 -network 10.0.1.0 -mask 255.255.248.0' >> /etc/exports");
965 vsystem("echo '#' >> /etc/exports");
966 vsystem("echo '# You should replace these lines with your actual exported filesystems.' >> /etc/exports");
967 vsystem("echo '# Note that BSD's export synatx is \"host-centric\" vs. Sun\'s \"FS-centric\" one.' >> /etc/exports");
968 vsystem("echo >> /etc/exports");
969 sprintf(cmd, "%s /etc/exports", variable_get(VAR_EDITOR));
973 variable_set2(VAR_NFS_SERVER, "YES", 1);
976 else if (variable_get(VAR_NFS_SERVER)) { /* We want to turn it off again? */
977 vsystem("mv -f /etc/exports /etc/exports.disabled");
978 variable_unset(VAR_NFS_SERVER);
980 return DITEM_SUCCESS;
984 configEtcTtys(dialogMenuItem *self)
988 WINDOW *w = savescr();
990 /* Simply prompt for confirmation, then edit away. */
991 if (msgYesNo("Configuration of system TTYs requires editing the /etc/ttys file.\n"
992 "Typical configuration activities might include enabling getty(8)\n"
993 "on the first serial port to allow login via serial console after\n"
994 "reboot, or to enable xdm. The default ttys file enables normal\n"
995 "virtual consoles, and most sites will not need to perform manual\n"
997 "To load /etc/ttys in the editor, select [Yes], otherwise, [No].")) {
1000 sprintf(cmd, "%s /etc/ttys", variable_get(VAR_EDITOR));
1006 return DITEM_SUCCESS;