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 Mkdir("/etc/X11"); /* XXX:Remove this later after we are happy mtree will have created this for us. */
713 systemExecute(execcmd);
714 if (!file_readable("/etc/X11/XF86Config")) {
715 if (!msgYesNo("The XFree86 configuration process seems to have\nfailed. Would you like to try again?"))
719 return DITEM_FAILURE;
723 configXDesktop(self);
725 return DITEM_SUCCESS;
729 msgConfirm("The XFree86 setup utility you chose does not appear to be installed!\n"
730 "Please install this before attempting to configure XFree86.");
732 return DITEM_FAILURE;
737 configResolv(dialogMenuItem *ditem)
740 char *cp, *c6p, *dp, *hp;
742 cp = variable_get(VAR_NAMESERVER);
746 fp = fopen("/etc/resolv.conf", "w");
748 return DITEM_FAILURE;
749 if (variable_get(VAR_DOMAINNAME))
750 fprintf(fp, "domain\t%s\n", variable_get(VAR_DOMAINNAME));
751 fprintf(fp, "nameserver\t%s\n", cp);
754 msgDebug("Wrote out /etc/resolv.conf\n");
757 dp = variable_get(VAR_DOMAINNAME);
758 cp = variable_get(VAR_IPADDR);
759 c6p = variable_get(VAR_IPV6ADDR);
760 hp = variable_get(VAR_HOSTNAME);
761 /* Tack ourselves into /etc/hosts */
762 fp = fopen("/etc/hosts", "w");
764 return DITEM_FAILURE;
765 /* Add an entry for localhost */
766 if (!variable_cmp(VAR_IPV6_ENABLE, "YES")) {
768 fprintf(fp, "::1\t\t\tlocalhost.%s localhost\n", dp);
770 fprintf(fp, "::1\t\t\tlocalhost\n");
773 fprintf(fp, "127.0.0.1\t\tlocalhost.%s localhost\n", dp);
775 fprintf(fp, "127.0.0.1\t\tlocalhost\n");
776 /* Now the host entries, if applicable */
777 if (((cp && cp[0] != '0') || (c6p && c6p[0] != '0')) && hp) {
783 SAFE_STRCPY(cp2, hp);
784 *(index(cp2, '.')) = '\0';
786 if (c6p && c6p[0] != '0') {
787 fprintf(fp, "%s\t%s %s\n", c6p, hp, cp2);
788 fprintf(fp, "%s\t%s.\n", c6p, hp);
790 if (cp && cp[0] != '0') {
791 fprintf(fp, "%s\t\t%s %s\n", cp, hp, cp2);
792 fprintf(fp, "%s\t\t%s.\n", cp, hp);
797 msgDebug("Wrote out /etc/hosts\n");
798 return DITEM_SUCCESS;
802 configRouter(dialogMenuItem *self)
806 ret = variable_get_value(VAR_ROUTER,
807 "Please specify the router you wish to use. Routed is\n"
808 "provided with the stock system and gated is provided\n"
809 "as an optional package which this installation system\n"
810 "will attempt to load if you select gated. Any other\n"
811 "choice of routing daemon will be assumed to be something\n"
812 "the user intends to install themselves before rebooting\n"
813 "the system. If you don't want any routing daemon, choose NO", 1)
814 ? DITEM_SUCCESS : DITEM_FAILURE;
816 if (ret == DITEM_SUCCESS) {
817 char *cp = variable_get(VAR_ROUTER);
819 if (cp && strcmp(cp, "NO")) {
820 variable_set2(VAR_ROUTER_ENABLE, "YES", 1);
821 if (!strcmp(cp, "gated")) {
822 if (package_add("gated") != DITEM_SUCCESS) {
823 msgConfirm("Unable to load gated package. Falling back to no router.");
824 variable_unset(VAR_ROUTER);
825 variable_unset(VAR_ROUTERFLAGS);
826 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
831 /* Now get the flags, if they chose a router */
832 ret = variable_get_value(VAR_ROUTERFLAGS,
833 "Please Specify the routing daemon flags; if you're running routed\n"
834 "then -q is the right choice for nodes and -s for gateway hosts.\n", 1)
835 ? DITEM_SUCCESS : DITEM_FAILURE;
836 if (ret != DITEM_SUCCESS)
837 variable_unset(VAR_ROUTERFLAGS);
842 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
843 variable_unset(VAR_ROUTERFLAGS);
844 variable_unset(VAR_ROUTER);
848 variable_set2(VAR_ROUTER_ENABLE, "NO", 1);
849 variable_unset(VAR_ROUTERFLAGS);
850 variable_unset(VAR_ROUTER);
855 /* Shared between us and index_initialize() */
856 extern PkgNode Top, Plist;
859 configPackages(dialogMenuItem *self)
861 int i, restoreflag = 0;
864 /* Did we get an INDEX? */
865 i = index_initialize("packages/INDEX");
866 if (DITEM_STATUS(i) == DITEM_FAILURE)
870 int ret, pos, scroll;
872 /* Bring up the packages menu */
874 index_menu(&Top, &Top, &Plist, &pos, &scroll);
876 if (Plist.kids && Plist.kids->name) {
877 /* Now show the packing list menu */
879 ret = index_menu(&Plist, &Plist, NULL, &pos, &scroll);
880 if (ret & DITEM_LEAVE_MENU)
882 else if (DITEM_STATUS(ret) != DITEM_FAILURE) {
885 for (tmp = Plist.kids; tmp && tmp->name; tmp = tmp->next)
886 (void)index_extract(mediaDevice, &Top, tmp, FALSE);
891 msgConfirm("No packages were selected for extraction.");
897 PkgNodePtr tmp2 = tmp->next;
902 index_init(NULL, &Plist);
903 return DITEM_SUCCESS | (restoreflag ? DITEM_RESTORE : 0);
906 /* Load pcnfsd package */
908 configPCNFSD(dialogMenuItem *self)
912 ret = package_add("pcnfsd");
913 if (DITEM_STATUS(ret) == DITEM_SUCCESS) {
914 variable_set2(VAR_PCNFSD, "YES", 0);
915 variable_set2("mountd_flags", "-n", 1);
921 configInetd(dialogMenuItem *self)
925 WINDOW *w = savescr();
927 if (msgYesNo("The Internet Super Server (inetd) allows a number of simple Internet\n"
928 "services to be enabled, including finger, ftp, and telnetd. Enabling\n"
929 "these services may increase risk of security problems by increasing\n"
930 "the exposure of your system.\n\n"
931 "With this in mind, do you wish to enable inetd?\n")) {
932 variable_set2("inetd_enable", "NO", 1);
934 /* If inetd is enabled, we'll need an inetd.conf */
936 if (!msgYesNo("inetd(8) relies on its configuration file, /etc/inetd.conf, to determine\n"
937 "which of its Internet services will be available. The default FreeBSD\n"
938 "inetd.conf(5) leaves all services disabled by default, so they must be\n"
939 "specifically enabled in the configuration file before they will\n"
940 "function, even once inetd(8) is enabled. Note that services for\n"
941 "IPv6 must be separately enabled from IPv4 services.\n\n"
942 "Select [Yes] now to invoke an editor on /etc/inetd.conf, or [No] to\n"
943 "use the current settings.\n")) {
944 sprintf(cmd, "%s /etc/inetd.conf", variable_get(VAR_EDITOR));
947 variable_set2("inetd_enable", "YES", 1);
951 return DITEM_SUCCESS;
955 configNFSServer(dialogMenuItem *self)
959 /* If we're an NFS server, we need an exports file */
960 if (!file_readable("/etc/exports")) {
961 WINDOW *w = savescr();
963 if (file_readable("/etc/exports.disabled"))
964 vsystem("mv /etc/exports.disabled /etc/exports");
966 dialog_clear_norefresh();
967 msgConfirm("Operating as an NFS server means that you must first configure\n"
968 "an /etc/exports file to indicate which hosts are allowed certain\n"
969 "kinds of access to your local file systems.\n"
970 "Press [ENTER] now to invoke an editor on /etc/exports\n");
971 vsystem("echo '#The following examples export /usr to 3 machines named after ducks,' > /etc/exports");
972 vsystem("echo '#/usr/src and /usr/ports read-only to machines named after trouble makers' >> /etc/exports");
973 vsystem("echo '#/home and all directories under it to machines named after dead rock stars' >> /etc/exports");
974 vsystem("echo '#and, /a to a network of privileged machines allowed to write on it as root.' >> /etc/exports");
975 vsystem("echo '#/usr huey louie dewie' >> /etc/exports");
976 vsystem("echo '#/usr/src /usr/obj -ro calvin hobbes' >> /etc/exports");
977 vsystem("echo '#/home -alldirs janice jimmy frank' >> /etc/exports");
978 vsystem("echo '#/a -maproot=0 -network 10.0.1.0 -mask 255.255.248.0' >> /etc/exports");
979 vsystem("echo '#' >> /etc/exports");
980 vsystem("echo '# You should replace these lines with your actual exported filesystems.' >> /etc/exports");
981 vsystem("echo '# Note that BSD's export synatx is \"host-centric\" vs. Sun\'s \"FS-centric\" one.' >> /etc/exports");
982 vsystem("echo >> /etc/exports");
983 sprintf(cmd, "%s /etc/exports", variable_get(VAR_EDITOR));
987 variable_set2(VAR_NFS_SERVER, "YES", 1);
990 else if (variable_get(VAR_NFS_SERVER)) { /* We want to turn it off again? */
991 vsystem("mv -f /etc/exports /etc/exports.disabled");
992 variable_unset(VAR_NFS_SERVER);
994 return DITEM_SUCCESS;
998 configEtcTtys(dialogMenuItem *self)
1002 WINDOW *w = savescr();
1004 /* Simply prompt for confirmation, then edit away. */
1005 if (msgYesNo("Configuration of system TTYs requires editing the /etc/ttys file.\n"
1006 "Typical configuration activities might include enabling getty(8)\n"
1007 "on the first serial port to allow login via serial console after\n"
1008 "reboot, or to enable xdm. The default ttys file enables normal\n"
1009 "virtual consoles, and most sites will not need to perform manual\n"
1010 "configuration.\n\n"
1011 "To load /etc/ttys in the editor, select [Yes], otherwise, [No].")) {
1014 sprintf(cmd, "%s /etc/ttys", variable_get(VAR_EDITOR));
1020 return DITEM_SUCCESS;