summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysinstall
diff options
context:
space:
mode:
authorgrog <grog@FreeBSD.org>2009-03-13 03:51:41 +0000
committergrog <grog@FreeBSD.org>2009-03-13 03:51:41 +0000
commit5e19c4ab439a8851aab86b55404a7fca7ddefe9a (patch)
tree2bc062bdc7b9f10797b66bf36364ba6c24e81d26 /usr.sbin/sysinstall
parent6204638785a09f1228eacedc7ac5e8fe6a4fc377 (diff)
downloadFreeBSD-src-5e19c4ab439a8851aab86b55404a7fca7ddefe9a.zip
FreeBSD-src-5e19c4ab439a8851aab86b55404a7fca7ddefe9a.tar.gz
Add menus to read install.cfg from any disk device sysinstall can see
(eg USB key, CD) rather than just floppy. Handle \r\n line termination in a cfg file. Add keeprcconf variable. Submitted by: Daniel O'Connor
Diffstat (limited to 'usr.sbin/sysinstall')
-rw-r--r--usr.sbin/sysinstall/config.c8
-rw-r--r--usr.sbin/sysinstall/dispatch.c205
-rw-r--r--usr.sbin/sysinstall/menus.c17
-rw-r--r--usr.sbin/sysinstall/modules.c15
-rw-r--r--usr.sbin/sysinstall/sysinstall.814
-rw-r--r--usr.sbin/sysinstall/sysinstall.h4
6 files changed, 241 insertions, 22 deletions
diff --git a/usr.sbin/sysinstall/config.c b/usr.sbin/sysinstall/config.c
index 7693833..ff4c1f9 100644
--- a/usr.sbin/sysinstall/config.c
+++ b/usr.sbin/sysinstall/config.c
@@ -428,8 +428,12 @@ configRC_conf(void)
while(fgets(line, sizeof(line), rcOld)) {
if(line[0] == '#' || variable_check2(line) != 0)
fprintf(rcSite, "%s", line);
- else
- fprintf(rcSite, "#REMOVED: %s", line);
+ else {
+ if (variable_get(VAR_KEEPRCCONF) != NULL)
+ fprintf(rcSite, "%s", line);
+ else
+ fprintf(rcSite, "#REMOVED: %s", line);
+ }
}
fclose(rcOld);
} else if (write_header) {
diff --git a/usr.sbin/sysinstall/dispatch.c b/usr.sbin/sysinstall/dispatch.c
index 3a891c9..79d9cf3 100644
--- a/usr.sbin/sysinstall/dispatch.c
+++ b/usr.sbin/sysinstall/dispatch.c
@@ -47,6 +47,7 @@ static int dispatch_systemExecute(dialogMenuItem *unused);
static int dispatch_msgConfirm(dialogMenuItem *unused);
static int dispatch_mediaOpen(dialogMenuItem *unused);
static int dispatch_mediaClose(dialogMenuItem *unused);
+static int cfgModuleFire(dialogMenuItem *self);
static struct _word {
char *name;
@@ -90,6 +91,7 @@ static struct _word {
{ "installVarDefaults", installVarDefaults },
{ "loadConfig", dispatch_load_file },
{ "loadFloppyConfig", dispatch_load_floppy },
+ { "loadCDROMConfig", dispatch_load_cdrom },
{ "mediaOpen", dispatch_mediaOpen },
{ "mediaClose", dispatch_mediaClose },
{ "mediaSetCDROM", mediaSetCDROM },
@@ -242,8 +244,9 @@ dispatchCommand(char *str)
msgConfirm("Null or zero-length string passed to dispatchCommand");
return DITEM_FAILURE;
}
- /* If it's got a newline, trim it */
- if ((cp = index(str, '\n')) != NULL)
+
+ /* Fixup DOS abuse */
+ if ((cp = index(str, '\r')) != NULL)
*cp = '\0';
/* If it's got a `=' sign in there, assume it's a variable setting */
@@ -294,9 +297,12 @@ dispatch_load_fp(FILE *fp)
INITQUE(*head);
while (fgets(buf, sizeof buf, fp)) {
-
- if ((cp = strchr(buf, '\n')) != NULL)
+ /* Fix up DOS abuse */
+ if ((cp = index(buf, '\r')) != NULL)
*cp = '\0';
+ /* If it's got a new line, trim it */
+ if ((cp = index(buf, '\n')) != NULL)
+ *cp = '\0';
if (*buf == '\0' || *buf == '#')
continue;
@@ -326,7 +332,7 @@ dispatch_execute(qelement *head)
while (!EMPTYQUE(*head)) {
item = (command_buffer *) head->q_forw;
-
+
if (DITEM_STATUS(dispatchCommand(item->string)) != DITEM_SUCCESS) {
msgConfirm("Command `%s' failed - rest of script aborted.\n",
item->string);
@@ -401,8 +407,7 @@ dispatch_load_floppy(dialogMenuItem *self)
mediaClose();
cp = variable_get_value(VAR_INSTALL_CFG,
- "Specify the name of a configuration file\n"
- "residing on a MSDOS or UFS floppy.", 0);
+ "Specify the name of a configuration file", 0);
if (!cp || !*cp) {
variable_unset(VAR_INSTALL_CFG);
what |= DITEM_FAILURE;
@@ -443,3 +448,189 @@ dispatch_load_floppy(dialogMenuItem *self)
return what;
}
+int
+dispatch_load_cdrom(dialogMenuItem *self)
+{
+ int what = DITEM_SUCCESS;
+ extern char *distWanted;
+ char *cp;
+ FILE *fp;
+ qelement *list;
+
+ mediaClose();
+ cp = variable_get_value(VAR_INSTALL_CFG,
+ "Specify the name of a configuration file\n"
+ "residing on the CDROM.", 0);
+ if (!cp || !*cp) {
+ variable_unset(VAR_INSTALL_CFG);
+ what |= DITEM_FAILURE;
+ return what;
+ }
+
+ distWanted = cp;
+ /* Try to open the floppy drive */
+ if (DITEM_STATUS(mediaSetCDROM(NULL)) == DITEM_FAILURE) {
+ msgConfirm("Unable to set media device to CDROM.");
+ what |= DITEM_FAILURE;
+ mediaClose();
+ return what;
+ }
+
+ if (!DEVICE_INIT(mediaDevice)) {
+ msgConfirm("Unable to CDROM filesystem.");
+ what |= DITEM_FAILURE;
+ mediaClose();
+ return what;
+ }
+
+ fp = DEVICE_GET(mediaDevice, cp, TRUE);
+ if (fp) {
+ list = dispatch_load_fp(fp);
+ fclose(fp);
+ mediaClose();
+
+ what |= dispatch_execute(list);
+ }
+ else {
+ if (!variable_get(VAR_NO_ERROR))
+ msgConfirm("Configuration file '%s' not found.", cp);
+ variable_unset(VAR_INSTALL_CFG);
+ what |= DITEM_FAILURE;
+ mediaClose();
+ }
+ return what;
+}
+
+/*
+ * Create a menu based on available disk devices
+ */
+int
+dispatch_load_menu(dialogMenuItem *self)
+{
+ DMenu *menu;
+ Device **devlist;
+ char *err;
+ int what, i, j, msize, count;
+ DeviceType dtypes[] = {DEVICE_TYPE_FLOPPY, DEVICE_TYPE_CDROM, DEVICE_TYPE_DOS, DEVICE_TYPE_UFS};
+
+ fprintf(stderr, "dispatch_load_menu called\n");
+
+ msize = sizeof(DMenu) + (sizeof(dialogMenuItem) * 2);
+ count = 0;
+ err = NULL;
+ what = DITEM_SUCCESS;
+
+ if ((menu = malloc(msize)) == NULL) {
+ err = "Failed to allocate memory for menu";
+ goto errout;
+ }
+
+ bcopy(&MenuConfig, menu, sizeof(DMenu));
+
+ bzero(&menu->items[count], sizeof(menu->items[0]));
+ menu->items[count].prompt = strdup("X Exit");
+ menu->items[count].title = strdup("Exit this menu (returning to previous)");
+ menu->items[count].fire = dmenuExit;
+ count++;
+
+ for (i = 0; i < sizeof(dtypes) / sizeof(dtypes[0]); i++) {
+ if ((devlist = deviceFind(NULL, dtypes[i])) == NULL) {
+ fprintf(stderr, "No devices found for type %d\n", dtypes[i]);
+ continue;
+ }
+
+ for (j = 0; devlist[j] != NULL; j++) {
+ fprintf(stderr, "device type %d device name %s\n", dtypes[i], devlist[j]->name);
+ msize += sizeof(dialogMenuItem);
+ if ((menu = realloc(menu, msize)) == NULL) {
+ err = "Failed to allocate memory for menu item";
+ goto errout;
+ }
+
+ bzero(&menu->items[count], sizeof(menu->items[0]));
+ menu->items[count].fire = cfgModuleFire;
+
+ menu->items[count].prompt = strdup(devlist[j]->name);
+ menu->items[count].title = strdup(devlist[j]->description);
+ /* XXX: dialog(3) sucks */
+ menu->items[count].aux = (long)devlist[j];
+ count++;
+ }
+ }
+
+ menu->items[count].prompt = NULL;
+ menu->items[count].title = NULL;
+
+ dmenuOpenSimple(menu, FALSE);
+
+ errout:
+ for (i = 0; i < count; i++) {
+ free(menu->items[i].prompt);
+ free(menu->items[i].title);
+ }
+
+ free(menu);
+
+ if (err != NULL) {
+ what |= DITEM_FAILURE;
+ if (!variable_get(VAR_NO_ERROR))
+ msgConfirm(err);
+ }
+
+ return (what);
+
+}
+
+static int
+cfgModuleFire(dialogMenuItem *self) {
+ Device *d;
+ FILE *fp;
+ int what = DITEM_SUCCESS;
+ extern char *distWanted;
+ qelement *list;
+ char *cp;
+
+ d = (Device *)self->aux;
+
+ msgDebug("cfgModuleFire: User selected %s (%s)\n", self->prompt, d->devname);
+
+ mediaClose();
+
+ cp = variable_get_value(VAR_INSTALL_CFG,
+ "Specify the name of a configuration file", 0);
+ if (!cp || !*cp) {
+ variable_unset(VAR_INSTALL_CFG);
+ what |= DITEM_FAILURE;
+ return what;
+ }
+
+ distWanted = cp;
+
+ mediaDevice = d;
+ if (!DEVICE_INIT(mediaDevice)) {
+ msgConfirm("Unable to mount filesystem.");
+ what |= DITEM_FAILURE;
+ mediaClose();
+ return what;
+ }
+ msgDebug("getting fp for %s\n", cp);
+
+ fp = DEVICE_GET(mediaDevice, cp, TRUE);
+ if (fp) {
+ msgDebug("opened OK, processing..\n");
+
+ list = dispatch_load_fp(fp);
+ fclose(fp);
+ mediaClose();
+
+ what |= dispatch_execute(list);
+ } else {
+ if (!variable_get(VAR_NO_ERROR))
+ msgConfirm("Configuration file '%s' not found.", cp);
+ variable_unset(VAR_INSTALL_CFG);
+ what |= DITEM_FAILURE;
+ mediaClose();
+ }
+
+ return(what);
+ }
diff --git a/usr.sbin/sysinstall/menus.c b/usr.sbin/sysinstall/menus.c
index 459d664..9269216 100644
--- a/usr.sbin/sysinstall/menus.c
+++ b/usr.sbin/sysinstall/menus.c
@@ -152,7 +152,9 @@ DMenu MenuIndex = {
{ " Console settings", "Customize system console behavior.", NULL, dmenuSubmenu, NULL, &MenuSyscons },
#endif
{ " Configure", "The system configuration menu.", NULL, dmenuSubmenu, NULL, &MenuConfigure },
- { " Defaults, Load", "Load default settings.", NULL, dispatch_load_floppy },
+ { " Defaults, Load (FDD)","Load default settings from floppy.", NULL, dispatch_load_floppy },
+ { " Defaults, Load (CD)", "Load default settings from CDROM.", NULL, dispatch_load_cdrom },
+ { " Defaults, Load", "Load default settings (all devices).", NULL, dispatch_load_menu },
#ifdef WITH_MICE
{ " Device, Mouse", "The mouse configuration menu.", NULL, dmenuSubmenu, NULL, &MenuMouse },
#endif
@@ -256,7 +258,7 @@ DMenu MenuInitial = {
{ "Options", "View/Set various installation options", NULL, optionsEditor },
{ "Fixit", "Repair mode with CDROM/DVD/floppy or start shell", NULL, dmenuSubmenu, NULL, &MenuFixit },
{ "Upgrade", "Upgrade an existing system", NULL, installUpgrade },
- { "Load Config","Load default install configuration", NULL, dispatch_load_floppy },
+ { "Load Config..","Load default install configuration", NULL, dispatch_load_menu },
{ "Index", "Glossary of functions", NULL, dmenuSubmenu, NULL, &MenuIndex },
{ NULL } },
};
@@ -818,6 +820,17 @@ DMenu MenuKLD = {
{ { NULL } },
};
+/* Prototype config file load menu */
+DMenu MenuConfig = {
+ DMENU_NORMAL_TYPE,
+ "Config Menu",
+ "Please select the device to load your configuration file from.\n"
+ "Note that a USB key will show up as daNs1.",
+ NULL,
+ NULL,
+ { { NULL } },
+};
+
/* The media selection menu */
DMenu MenuMedia = {
DMENU_NORMAL_TYPE | DMENU_SELECTION_RETURNS,
diff --git a/usr.sbin/sysinstall/modules.c b/usr.sbin/sysinstall/modules.c
index 859994a..211c51e 100644
--- a/usr.sbin/sysinstall/modules.c
+++ b/usr.sbin/sysinstall/modules.c
@@ -132,17 +132,13 @@ kldBrowser(dialogMenuItem *self)
err = NULL;
if (DITEM_STATUS(mediaSetFloppy(NULL)) == DITEM_FAILURE) {
- msgConfirm("Unable to set media device to floppy.");
- what |= DITEM_FAILURE;
- mediaClose();
- return what;
+ err = "Unable to set media device to floppy.";
+ goto errout;
}
if (!DEVICE_INIT(mediaDevice)) {
- msgConfirm("Unable to mount floppy filesystem.");
- what |= DITEM_FAILURE;
- mediaClose();
- return what;
+ err = "Unable to mount floppy filesystem.";
+ goto errout;
}
msize = sizeof(DMenu) + (sizeof(dialogMenuItem) * 2);
@@ -191,11 +187,10 @@ kldBrowser(dialogMenuItem *self)
dmenuOpenSimple(menu, FALSE);
- mediaClose();
-
deviceRescan();
errout:
+ mediaClose();
for (i = 0; i < count; i++)
free(menu->items[i].prompt);
diff --git a/usr.sbin/sysinstall/sysinstall.8 b/usr.sbin/sysinstall/sysinstall.8
index ab1cc12..7cb55aa 100644
--- a/usr.sbin/sysinstall/sysinstall.8
+++ b/usr.sbin/sysinstall/sysinstall.8
@@ -534,7 +534,16 @@ functions.
.Pp
.Sy Variables :
None
-.It installExpress
+.It installConfigure
+Commit any rc.conf changes to disk.
+.Pp
+.Sy Variables :
+.Bl -tag -width indent
+.It keeprcconf
+Preserve existing rc.conf parameters.
+This is useful if you have a post-install script which modifies rc.conf.
+.El
+ .It installExpress
Start an "express" installation, asking few questions of
the user.
.Pp
@@ -894,3 +903,6 @@ for these tasks.
.Pp
This utility is a prototype which lasted several years past
its expiration date and is greatly in need of death.
+.Pp
+There are a (great) number of undocumented variables.
+UTSL.
diff --git a/usr.sbin/sysinstall/sysinstall.h b/usr.sbin/sysinstall/sysinstall.h
index 6165160..6f860f5 100644
--- a/usr.sbin/sysinstall/sysinstall.h
+++ b/usr.sbin/sysinstall/sysinstall.h
@@ -191,6 +191,7 @@
#define VAR_HOME_SIZE "homeSize"
#define VAR_TERM "TERM"
#define VAR_CONSTERM "_consterm"
+#define VAR_KEEPRCCONF "keeprcconf"
#ifdef PC98
#define DEFAULT_COUNTRY "jp"
@@ -433,6 +434,7 @@ extern DMenu MenuIndex; /* Index menu */
extern DMenu MenuOptions; /* Installation options */
extern DMenu MenuOptionsLanguage; /* Language options menu */
extern DMenu MenuKLD; /* Prototype KLD menu */
+extern DMenu MenuConfig; /* Prototype config menu */
extern DMenu MenuMedia; /* Media type menu */
#ifdef WITH_MICE
extern DMenu MenuMouse; /* Mouse type menu */
@@ -577,8 +579,10 @@ extern int diskGetSelectCount(Device ***devs);
/* dispatch.c */
extern int dispatchCommand(char *command);
extern int dispatch_load_floppy(dialogMenuItem *self);
+extern int dispatch_load_cdrom(dialogMenuItem *self);
extern int dispatch_load_file_int(int);
extern int dispatch_load_file(dialogMenuItem *self);
+extern int dispatch_load_menu(dialogMenuItem *self);
/* dist.c */
OpenPOWER on IntegriCloud