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 configSecurity(dialogMenuItem *self)
485 WINDOW *w = savescr();
487 dialog_clear_norefresh();
488 dmenuOpenSimple(&MenuSecurity, FALSE);
490 return DITEM_SUCCESS;
494 configSecurityProfile(dialogMenuItem *self)
496 WINDOW *w = savescr();
498 dialog_clear_norefresh();
499 dmenuOpenSimple(&MenuSecurityProfile, FALSE);
501 return DITEM_SUCCESS;
504 /* Use the most extreme security settings */
506 configSecurityExtreme(dialogMenuItem *self)
508 WINDOW *w = savescr();
510 variable_set2("nfs_server_enable", "NO", 1);
511 variable_set2("sendmail_enable", "NO", 1);
512 variable_set2("sshd_enable", "NO", 1);
513 variable_set2("kern_securelevel_enable", "YES", 1);
514 variable_set2("kern_securelevel", "2", 1);
517 msgConfirm("Extreme security settings have been selected.\n\n"
518 "Sendmail, sshd, and NFS services have been disabled, and\n"
519 "securelevels have been enabled.\n\n"
520 "PLEASE NOTE that this still does not save you from having\n"
521 "to properly secure your system in other ways or exercise\n"
522 "due diligence in your administration, this simply picks\n"
523 "a more secure set of out-of-box defaults to start with.\n\n"
524 "To change any of these settings later, edit /etc/rc.conf");
527 return DITEM_SUCCESS;
531 configSecurityModerate(dialogMenuItem *self)
533 WINDOW *w = savescr();
535 variable_set2("sendmail_enable", "YES", 1);
536 variable_set2("sshd_enable", "YES", 1);
537 variable_set2("kern_securelevel_enable", "NO", 1);
540 msgConfirm("Moderate security settings have been selected.\n\n"
541 "Sendmail and sshd have been enabled, securelevels are\n"
542 "disabled, and NFS server settings have been left intact.\n\n"
543 "PLEASE NOTE that this still does not save you from having\n"
544 "to properly secure your system in other ways or exercise\n"
545 "due diligence in your administration, this simply picks\n"
546 "a standard set of out-of-box defaults to start with.\n\n"
547 "To change any of these settings later, edit /etc/rc.conf");
550 return DITEM_SUCCESS;
554 write_root_xprofile(char *str)
559 static char *flist[] = { /* take care of both xdm and startx */
562 "/usr/share/skel/dot.xinitrc",
563 "/usr/share/skel/dot.xsession",
568 for (cp = flist; *cp; cp++) {
569 fp = fopen(*cp, "w");
571 fwrite(str, 1, len, fp);
572 fchmod(fileno(fp), 0755);
581 char tmp[FILENAME_MAX];
583 snprintf(tmp, sizeof tmp, "/usr/X11R6/bin/%s", fname);
584 if (file_executable(tmp))
586 snprintf(tmp, sizeof tmp, "/usr/local/bin/%s", fname);
587 return file_executable(tmp);
591 configXDesktop(dialogMenuItem *self)
594 int ret = DITEM_SUCCESS;
595 WINDOW *w = savescr();
597 dialog_clear_norefresh();
598 if (!dmenuOpenSimple(&MenuXDesktops, FALSE) || !(desk = variable_get(VAR_DESKSTYLE))) {
600 return DITEM_FAILURE;
602 if (!strcmp(desk, "kde")) {
603 ret = package_add("kde");
604 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("startkde"))
605 write_root_xprofile("exec startkde\n");
607 else if (!strcmp(desk, "gnome")) {
608 ret = package_add("gnomecore");
609 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("gnome-session")) {
610 ret = package_add("sawfish-gnome");
611 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("sawfish"))
612 write_root_xprofile("exec gnome-session\n");
615 else if (!strcmp(desk, "enlightenment")) {
616 ret = package_add("gnomecore");
617 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("gnome-session")) {
618 ret = package_add("enlightenment");
619 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("enlightenment"))
620 write_root_xprofile("exec gnome-session\n");
623 else if (!strcmp(desk, "afterstep")) {
624 ret = package_add("afterstep");
625 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("afterstep"))
626 write_root_xprofile("exec afterstep\n");
628 else if (!strcmp(desk, "windowmaker")) {
629 ret = package_add("windowmaker");
630 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("wmaker.inst")) {
631 write_root_xprofile("xterm &\n[ ! -d $HOME/GNUstep/Library/WindowMaker ] && /usr/X11R6/bin/wmaker.inst\nexec /usr/X11R6/bin/wmaker\n");
634 else if (!strcmp(desk, "fvwm2")) {
635 ret = package_add("fvwm");
636 if (DITEM_STATUS(ret) != DITEM_FAILURE && gotit("fvwm"))
637 write_root_xprofile("exec fvwm\n");
639 if (DITEM_STATUS(ret) == DITEM_FAILURE)
640 msgConfirm("An error occurred while adding the package(s) required\n"
641 "by this desktop type. Please change installation media\n"
642 "and/or select a different, perhaps simpler, desktop\n"
643 "environment and try again.");
649 configXSetup(dialogMenuItem *self)
651 char *config, *execfile, *style;
653 WINDOW *w = savescr();
655 setenv("XWINHOME", "/usr/X11R6", 1);
657 variable_unset(VAR_DESKSTYLE);
658 variable_unset(VAR_XF86_CONFIG);
659 dialog_clear_norefresh();
660 if (!dmenuOpenSimple(&MenuXF86Config, FALSE)) {
662 return DITEM_FAILURE;
664 config = variable_get(VAR_XF86_CONFIG);
665 style = variable_get(VAR_DESKSTYLE);
671 return DITEM_FAILURE;
675 if (file_readable("/var/run/ld-elf.so.hints"))
676 vsystem("/sbin/ldconfig -m /usr/lib /usr/X11R6/lib /usr/local/lib /usr/lib/compat");
678 vsystem("/sbin/ldconfig /usr/lib /usr/X11R6/lib /usr/local/lib /usr/lib/compat");
679 if (file_readable("/var/run/ld.so.hints"))
680 vsystem("ldconfig -m -aout /usr/lib/aout /usr/lib/compat/aout /usr/local/lib/aout /usr/X11R6/lib/aout");
682 vsystem("ldconfig -aout /usr/lib/aout /usr/lib/compat/aout /usr/local/lib/aout /usr/X11R6/lib/aout");
684 vsystem("/sbin/ifconfig lo0 127.0.0.1");
685 execfile = string_concat("/usr/X11R6/bin/", config);
686 if (file_executable(execfile)) {
687 moused = variable_get(VAR_MOUSED);
688 while (!moused || strcmp(moused, "YES")) {
689 if (msgYesNo("The X server may access the mouse in two ways: direct access\n"
690 "or indirect access via the mouse daemon. You have not\n"
691 "configured the mouse daemon. Would you like to configure it\n"
692 "now? If you intend to let the X server access the mouse\n"
693 "directly, choose \"No\" at this time."))
695 dialog_clear_norefresh();
696 dmenuOpenSimple(&MenuMouse, FALSE);
697 moused = variable_get(VAR_MOUSED);
699 if (moused && !strcmp(moused, "YES"))
700 msgConfirm("You have configured and are now running the mouse daemon.\n"
701 "Choose \"/dev/sysmouse\" as the mouse port and \"SysMouse\" or\n"
702 "\"MouseSystems\" as the mouse protocol in the X configuration\n"
704 systemExecute(execfile);
705 if (!file_readable("/etc/XF86Config")) {
706 if (!msgYesNo("The XFree86 configuration process seems to have\nfailed. Would you like to try again?"))
710 return DITEM_FAILURE;
714 configXDesktop(self);
716 return DITEM_SUCCESS;
719 msgConfirm("The XFree86 setup utility you chose does not appear to be installed!\n"
720 "Please install this before attempting to configure XFree86.");
722 return DITEM_FAILURE;
727 configResolv(dialogMenuItem *ditem)
730 char *cp, *c6p, *dp, *hp;
732 cp = variable_get(VAR_NAMESERVER);
736 fp = fopen("/etc/resolv.conf", "w");
738 return DITEM_FAILURE;
739 if (variable_get(VAR_DOMAINNAME))
740 fprintf(fp, "domain\t%s\n", variable_get(VAR_DOMAINNAME));
741 fprintf(fp, "nameserver\t%s\n", cp);
744 msgDebug("Wrote out /etc/resolv.conf\n");
747 dp = variable_get(VAR_DOMAINNAME);
748 cp = variable_get(VAR_IPADDR);
749 c6p = variable_get(VAR_IPV6ADDR);
750 hp = variable_get(VAR_HOSTNAME);
751 /* Tack ourselves into /etc/hosts */
752 fp = fopen("/etc/hosts", "w");
754 return DITEM_FAILURE;
755 /* Add an entry for localhost */
756 if (!variable_cmp(VAR_IPV6_ENABLE, "YES")) {
758 fprintf(fp, "::1\t\t\tlocalhost.%s localhost\n", dp);
760 fprintf(fp, "::1\t\t\tlocalhost\n");
763 fprintf(fp, "127.0.0.1\t\tlocalhost.%s localhost\n", dp);
765 fprintf(fp, "127.0.0.1\t\tlocalhost\n");
766 /* Now the host entries, if applicable */
767 if (((cp && cp[0] != '0') || (c6p && c6p[0] != '0')) && hp) {
773 SAFE_STRCPY(cp2, hp);
774 *(index(cp2, '.')) = '\0';
776 if (c6p && c6p[0] != '0') {
777 fprintf(fp, "%s\t%s %s\n", c6p, hp, cp2);
778 fprintf(fp, "%s\t%s.\n", c6p, hp);
780 if (cp && cp[0] != '0') {
781 fprintf(fp, "%s\t\t%s %s\n", cp, hp, cp2);
782 fprintf(fp, "%s\t\t%s.\n", cp, hp);
787 msgDebug("Wrote out /etc/hosts\n");
788 return DITEM_SUCCESS;
792 configRouter(dialogMenuItem *self)
796 ret = variable_get_value(VAR_ROUTER,
797 "Please specify the router you wish to use. Routed is\n"
798 "provided with the stock system and gated is provided\n"
799 "as an optional package which this installation system\n"
800 "will attempt to load if you select gated. Any other\n"
801 "choice of routing daemon will be assumed to be something\n"
802 "the user intends to install themselves before rebooting\n"
803 "the system. If you don't want any routing daemon, choose NO", 1)
804 ? DITEM_SUCCESS : DITEM_FAILURE;
806 if (ret == DITEM_SUCCESS) {
807 char *cp = variable_get(VAR_ROUTER);
809 if (cp && strcmp(cp, "NO")) {
810 variable_set2(VAR_ROUTER_ENABLE, "YES", 1);
811 if (!strcmp(cp, "gated")) {
812 if (package_add("gated") != DITEM_SUCCESS) {
813 msgConfirm("Unable to load gated package. Falling back to no router.");
814 variable_unset(VAR_ROUTER);
815 variable_unset(VAR_ROUTERFLAGS);
816 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
821 /* Now get the flags, if they chose a router */
822 ret = variable_get_value(VAR_ROUTERFLAGS,
823 "Please Specify the routing daemon flags; if you're running routed\n"
824 "then -q is the right choice for nodes and -s for gateway hosts.\n", 1)
825 ? DITEM_SUCCESS : DITEM_FAILURE;
826 if (ret != DITEM_SUCCESS)
827 variable_unset(VAR_ROUTERFLAGS);
832 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
833 variable_unset(VAR_ROUTERFLAGS);
834 variable_unset(VAR_ROUTER);
838 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
839 variable_unset(VAR_ROUTERFLAGS);
840 variable_unset(VAR_ROUTER);
845 /* Shared between us and index_initialize() */
846 extern PkgNode Top, Plist;
849 configPackages(dialogMenuItem *self)
851 int i, restoreflag = 0;
854 /* Did we get an INDEX? */
855 i = index_initialize("packages/INDEX");
856 if (DITEM_STATUS(i) == DITEM_FAILURE)
860 int ret, pos, scroll;
862 /* Bring up the packages menu */
864 index_menu(&Top, &Top, &Plist, &pos, &scroll);
866 if (Plist.kids && Plist.kids->name) {
867 /* Now show the packing list menu */
869 ret = index_menu(&Plist, &Plist, NULL, &pos, &scroll);
870 if (ret & DITEM_LEAVE_MENU)
872 else if (DITEM_STATUS(ret) != DITEM_FAILURE) {
875 for (tmp = Plist.kids; tmp && tmp->name; tmp = tmp->next)
876 (void)index_extract(mediaDevice, &Top, tmp, FALSE);
881 msgConfirm("No packages were selected for extraction.");
887 PkgNodePtr tmp2 = tmp->next;
892 index_init(NULL, &Plist);
893 return DITEM_SUCCESS | (restoreflag ? DITEM_RESTORE : 0);
896 /* Load pcnfsd package */
898 configPCNFSD(dialogMenuItem *self)
902 ret = package_add("pcnfsd");
903 if (DITEM_STATUS(ret) == DITEM_SUCCESS) {
904 variable_set2(VAR_PCNFSD, "YES", 0);
905 variable_set2("mountd_flags", "-n", 1);
911 configInetd(dialogMenuItem *self)
915 WINDOW *w = savescr();
917 if (msgYesNo("The Internet Super Server (inetd) allows a number of simple Internet\n"
918 "services to be enabled, including finger, ftp, and telnetd. Enabling\n"
919 "these services may increase risk of security problems by increasing\n"
920 "the exposure of your system.\n\n"
921 "With this in mind, do you wish to enable inetd?\n")) {
922 variable_set2("inetd_enable", "NO", 1);
924 /* If inetd is enabled, we'll need an inetd.conf */
926 if (!msgYesNo("inetd(8) relies on its configuration file, /etc/inetd.conf, to determine\n"
927 "which of its Internet services will be available. The default FreeBSD\n"
928 "inetd.conf(5) leaves all services disabled by default, so they must be\n"
929 "specifically enabled in the configuration file before they will\n"
930 "function, even once inetd(8) is enabled. Note that services for\n"
931 "IPv6 must be seperately enabled from IPv4 services.\n\n"
932 "Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to\n"
933 "use the current settings.\n")) {
934 sprintf(cmd, "%s /etc/inetd.conf", variable_get(VAR_EDITOR));
937 variable_set2("inetd_enable", "YES", 1);
941 return DITEM_SUCCESS;
945 configNFSServer(dialogMenuItem *self)
949 /* If we're an NFS server, we need an exports file */
950 if (!file_readable("/etc/exports")) {
951 WINDOW *w = savescr();
953 if (file_readable("/etc/exports.disabled"))
954 vsystem("mv /etc/exports.disabled /etc/exports");
956 dialog_clear_norefresh();
957 msgConfirm("Operating as an NFS server means that you must first configure\n"
958 "an /etc/exports file to indicate which hosts are allowed certain\n"
959 "kinds of access to your local file systems.\n"
960 "Press [ENTER] now to invoke an editor on /etc/exports\n");
961 vsystem("echo '#The following examples export /usr to 3 machines named after ducks,' > /etc/exports");
962 vsystem("echo '#/usr/src and /usr/ports read-only to machines named after trouble makers' >> /etc/exports");
963 vsystem("echo '#/home and all directories under it to machines named after dead rock stars' >> /etc/exports");
964 vsystem("echo '#and, /a to a network of privileged machines allowed to write on it as root.' >> /etc/exports");
965 vsystem("echo '#/usr huey louie dewie' >> /etc/exports");
966 vsystem("echo '#/usr/src /usr/obj -ro calvin hobbes' >> /etc/exports");
967 vsystem("echo '#/home -alldirs janice jimmy frank' >> /etc/exports");
968 vsystem("echo '#/a -maproot=0 -network 10.0.1.0 -mask 255.255.248.0' >> /etc/exports");
969 vsystem("echo '#' >> /etc/exports");
970 vsystem("echo '# You should replace these lines with your actual exported filesystems.' >> /etc/exports");
971 vsystem("echo '# Note that BSD's export synatx is \"host-centric\" vs. Sun\'s \"FS-centric\" one.' >> /etc/exports");
972 vsystem("echo >> /etc/exports");
973 sprintf(cmd, "%s /etc/exports", variable_get(VAR_EDITOR));
977 variable_set2(VAR_NFS_SERVER, "YES", 1);
980 else if (variable_get(VAR_NFS_SERVER)) { /* We want to turn it off again? */
981 vsystem("mv -f /etc/exports /etc/exports.disabled");
982 variable_unset(VAR_NFS_SERVER);
984 return DITEM_SUCCESS;
988 configEtcTtys(dialogMenuItem *self)
992 WINDOW *w = savescr();
994 /* Simply prompt for confirmation, then edit away. */
995 if (msgYesNo("Configuration of system TTYs requires editing the /etc/ttys file.\n"
996 "Typical configuration activities might include enabling getty(8)\n"
997 "on the first serial port to allow login via serial console after\n"
998 "reboot, or to enable xdm. The default ttys file enables normal\n"
999 "virtual consoles, and most sites will not need to perform manual\n"
1000 "configuration.\n\n"
1001 "To load /etc/ttys in the editor, select [Yes], otherwise, [No].")) {
1004 sprintf(cmd, "%s /etc/ttys", variable_get(VAR_EDITOR));
1010 return DITEM_SUCCESS;