From e5b4ea994b4cf66d418494d33abd89300d291c6d Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Sun, 17 Dec 2000 23:32:50 +0000 Subject: automatic mode added (a.k.a get rid of redhat kickstart) --- mdk-stage1/Makefile | 2 +- mdk-stage1/automatic.c | 123 ++++++++++++++++++++++++++++++++++++++++++++ mdk-stage1/automatic.h | 31 +++++++++++ mdk-stage1/network.c | 67 ++++++++++++------------ mdk-stage1/newt-frontend.c | 6 ++- mdk-stage1/stage1.c | 36 +++++++------ mdk-stage1/stage1.h | 6 ++- mdk-stage1/stdio-frontend.c | 6 ++- mdk-stage1/tools.c | 39 +++++++------- mdk-stage1/tools.h | 7 +++ 10 files changed, 248 insertions(+), 75 deletions(-) create mode 100644 mdk-stage1/automatic.c create mode 100644 mdk-stage1/automatic.h diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile index 5df003dbd..ce3c04879 100644 --- a/mdk-stage1/Makefile +++ b/mdk-stage1/Makefile @@ -64,7 +64,7 @@ STAGE1_NETWORK_LIBS = /usr/lib/libresolv.a #- stage1 itself -STAGE1SRC = stage1.c log.c tools.c modules.c probing.c mount.c +STAGE1SRC = stage1.c log.c tools.c modules.c probing.c mount.c automatic.c CDROMSRC = cdrom.c DISKSRC = disk.c NETWORKSRC = network.c dns.c nfsmount.c diff --git a/mdk-stage1/automatic.c b/mdk-stage1/automatic.c new file mode 100644 index 000000000..3571614a0 --- /dev/null +++ b/mdk-stage1/automatic.c @@ -0,0 +1,123 @@ +/* + * Guillaume Cottenceau (gc@mandrakesoft.com) + * + * Copyright 2000 MandrakeSoft + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* + * This is supposed to replace the redhat "kickstart", by name but + * also by design (less code pollution). + * + */ + + +#include +#include +#include "tools.h" +#include "stage1.h" +#include "frontend.h" +#include "log.h" + +#include "automatic.h" + + +static struct param_elem * automatic_params; +static char * value_not_bound = ""; + +void grab_automatic_params(char * line) +{ + int i, p; + struct param_elem tmp_params[50]; + + i = 0; p = 0; + while (line[i] != '\0') { + char *name, *value; + int k; + int j = i; + while (line[i] != ':' && line[i] != '\0') + i++; + name = memdup(&line[j], i-j + 1); + name[i-j] = 0; + + k = i+1; + i++; + while (line[i] != ',' && line[i] != '\0') + i++; + value = memdup(&line[k], i-k + 1); + value[i-k] = 0; + + tmp_params[p].name = name; + tmp_params[p].value = value; + p++; + if (line[i] == '\0') + break; + i++; + } + + tmp_params[p++].name = NULL; + automatic_params = memdup(tmp_params, sizeof(struct param_elem) * p); + + log_message("AUTOMATIC MODE: got %d params", p-1); +} + + +char * get_auto_value(char * auto_param) +{ + struct param_elem * ptr = automatic_params; + + while (ptr->name) { + if (!strcmp(ptr->name, auto_param)) + return ptr->value; + ptr++; + } + + return value_not_bound; +} + + +enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto) +{ + if (!IS_AUTOMATIC || IS_AUTOMATIC_ERROR_OCCURED) + return ask_from_list(msg, elems, choice); + else { + char * tmp = get_auto_value(auto_param); + while (elems && *elems) { + if (!strcmp(tmp, *elems_auto)) { + *choice = *elems; + log_message("AUTOMATIC: parameter %s for %s means returning %s", tmp, auto_param, *elems); + break; + } + elems++; + elems_auto++; + } + return RETURN_OK; + } +} + +enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** answers, int entry_size, char ** questions_auto) +{ + if (!IS_AUTOMATIC || IS_AUTOMATIC_ERROR_OCCURED) + return ask_from_entries(msg, questions, answers, entry_size); + else { + char * tmp_answers[50]; + int i = 0; + while (questions && *questions) { + tmp_answers[i] = get_auto_value(*questions_auto); + log_message("AUTOMATIC: question %s answers %s because of param %s", *questions, tmp_answers[i], *questions_auto); + i++; + questions++; + questions_auto++; + + } + *answers = memdup(tmp_answers, sizeof(char *) * i); + return RETURN_OK; + } +} diff --git a/mdk-stage1/automatic.h b/mdk-stage1/automatic.h new file mode 100644 index 000000000..507876072 --- /dev/null +++ b/mdk-stage1/automatic.h @@ -0,0 +1,31 @@ +/* + * Guillaume Cottenceau (gc@mandrakesoft.com) + * + * Copyright 2000 MandrakeSoft + * + * This software may be freely redistributed under the terms of the GNU + * public license. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* + * This is supposed to replace the redhat "kickstart", by name but + * also by design (no code pollution). + * + */ + +#ifndef _AUTOMATIC_H_ +#define _AUTOMATIC_H_ + +#include "stage1.h" + +void grab_automatic_params(char * line); + +enum return_type ask_from_list_auto(char *msg, char ** elems, char ** choice, char * auto_param, char ** elems_auto); +enum return_type ask_from_entries_auto(char *msg, char ** questions, char *** answers, int entry_size, char ** questions_auto); + +#endif diff --git a/mdk-stage1/network.c b/mdk-stage1/network.c index dbce28113..a2932863c 100644 --- a/mdk-stage1/network.c +++ b/mdk-stage1/network.c @@ -38,6 +38,7 @@ #include "log.h" #include "dns.h" #include "mount.h" +#include "automatic.h" #include "network.h" @@ -268,18 +269,20 @@ static enum return_type setup_network_interface(struct interface_info * intf) { enum return_type results; char * bootprotos[] = { "Static", "DHCP", NULL }; + char * bootprotos_auto[] = { "static", "dhcp" }; char * choice; - results = ask_from_list("Please choose the desired IP attribution.", bootprotos, &choice); + results = ask_from_list_auto("Please choose the desired IP attribution.", bootprotos, &choice, "network", bootprotos_auto); if (results != RETURN_OK) return results; if (!strcmp(choice, "Static")) { char * questions[] = { "IP of this machine", "IP of Domain Name Server", "IP of default gateway", NULL }; + char * questions_auto[] = { "ip", "dns", "gateway" }; char ** answers; struct in_addr addr; - results = ask_from_entries("Please enter the network information.", questions, &answers, 16); + results = ask_from_entries_auto("Please enter the network information.", questions, &answers, 16, questions_auto); if (results != RETURN_OK) return setup_network_interface(intf); @@ -331,6 +334,7 @@ static enum return_type setup_network_interface(struct interface_info * intf) } else { error_message("DHCP not implemented yet"); intf->boot_proto = BOOTPROTO_DHCP; + return RETURN_ERROR; } if (configure_net_device(intf)) @@ -352,15 +356,16 @@ static enum return_type configure_network(struct interface_info * intf) if (!name) { enum return_type results; char * questions[] = { "Host name", "Domain name", NULL }; + char * questions_auto[] = { "hostname", "domain" }; char ** answers; char * boulet; log_message("reverse name lookup on self failed"); - results = ask_from_entries("I could not guess hostname and domain name; please fill in this information. " - "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for domain name, " - "for a machine called `mybox.mynetwork.com' on the Internet.", - questions, &answers, 32); + results = ask_from_entries_auto("I could not guess hostname and domain name; please fill in this information. " + "Valid answers are for example: `mybox' for hostname and `mynetwork.com' for domain name, " + "for a machine called `mybox.mynetwork.com' on the Internet.", + questions, &answers, 32, questions_auto); if (results != RETURN_OK) return results; @@ -475,32 +480,25 @@ static enum return_type intf_select_and_up(void) { static struct interface_info intf[20]; static int num_interfaces = 0; - enum return_type results; - - do { - struct interface_info * sel_intf = NULL; - int i; - char * iface = interface_select(); - - if (iface == NULL) - return RETURN_BACK; - - for (i = 0; i < num_interfaces ; i++) - if (!strcmp(intf[i].device, iface)) - sel_intf = &(intf[i]); - - if (sel_intf == NULL) { - sel_intf = &(intf[num_interfaces]); - strcpy(sel_intf->device, iface); - sel_intf->is_up = 0; - num_interfaces++; - } - - results = bringup_networking(sel_intf); + struct interface_info * sel_intf = NULL; + int i; + char * iface = interface_select(); + + if (iface == NULL) + return RETURN_BACK; + + for (i = 0; i < num_interfaces ; i++) + if (!strcmp(intf[i].device, iface)) + sel_intf = &(intf[i]); + + if (sel_intf == NULL) { + sel_intf = &(intf[num_interfaces]); + strcpy(sel_intf->device, iface); + sel_intf->is_up = 0; + num_interfaces++; } - while (results == RETURN_BACK); - - return RETURN_OK; + + return bringup_networking(sel_intf); } @@ -508,6 +506,7 @@ static enum return_type intf_select_and_up(void) enum return_type nfs_prepare(void) { char * questions[] = { "NFS server name", "Linux-Mandrake directory", NULL }; + char * questions_auto[] = { "server", "directory", NULL }; char ** answers; char * nfsmount_location; enum return_type results = intf_select_and_up(); @@ -516,9 +515,9 @@ enum return_type nfs_prepare(void) return results; do { - results = ask_from_entries("Please enter the name or IP address of your NFS server, " - "and the directory containing the Linux-Mandrake installation.", - questions, &answers, 40); + results = ask_from_entries_auto("Please enter the name or IP address of your NFS server, " + "and the directory containing the Linux-Mandrake installation.", + questions, &answers, 40, questions_auto); if (results != RETURN_OK) return nfs_prepare(); diff --git a/mdk-stage1/newt-frontend.c b/mdk-stage1/newt-frontend.c index 4f62f87f0..cae1c1c1a 100644 --- a/mdk-stage1/newt-frontend.c +++ b/mdk-stage1/newt-frontend.c @@ -60,6 +60,7 @@ void error_message(char *msg, ...) va_start(args, msg); va_end(args); newtWinMessagev("Error", "Ok", msg, args); + set_param(MODE_AUTOMATIC_ERROR_OCCURED); } void info_message(char *msg, ...) @@ -67,7 +68,10 @@ void info_message(char *msg, ...) va_list args; va_start(args, msg); va_end(args); - newtWinMessagev("Notice", "Ok", msg, args); + if (!IS_AUTOMATIC) + newtWinMessagev("Notice", "Ok", msg, args); + else + vlog_message(msg, args); } void wait_message(char *msg, ...) diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c index 4f72ab9d1..528132ace 100644 --- a/mdk-stage1/stage1.c +++ b/mdk-stage1/stage1.c @@ -42,6 +42,7 @@ #include "frontend.h" #include "modules.h" #include "tools.h" +#include "automatic.h" #ifndef DISABLE_CDROM #include "cdrom.h" @@ -110,37 +111,38 @@ void spawn_shell(void) enum return_type method_select_and_prepare(void) { + enum return_type results; + char * choice; + char * means[10], * means_auto[10]; + int i; + #ifndef DISABLE_DISK - char * disk_install = "Hard disk"; + char * disk_install = "Hard disk"; char * disk_install_auto = "disk"; #endif #ifndef DISABLE_CDROM - char * cdrom_install = "CDROM drive"; + char * cdrom_install = "CDROM drive"; char * cdrom_install_auto = "cdrom"; #endif #ifndef DISABLE_NETWORK - char * network_nfs_install = "NFS server"; - char * network_ftp_install = "FTP server"; - char * network_http_install = "HTTP server"; + char * network_nfs_install = "NFS server"; char * network_nfs_install_auto = "nfs"; + char * network_ftp_install = "FTP server"; char * network_ftp_install_auto = "ftp"; + char * network_http_install = "HTTP server"; char * network_http_install_auto = "http"; #endif - enum return_type results; - char * choice; - char * means[10]; - int i; i = 0; #ifndef DISABLE_NETWORK - means[i] = network_nfs_install; i++; - means[i] = network_ftp_install; i++; - means[i] = network_http_install; i++; -#endif -#ifndef DISABLE_DISK - means[i] = disk_install; i++; + means[i] = network_nfs_install; means_auto[i++] = network_nfs_install_auto; + means[i] = network_ftp_install; means_auto[i++] = network_ftp_install_auto; + means[i] = network_http_install; means_auto[i++] = network_http_install_auto; #endif #ifndef DISABLE_CDROM - means[i] = cdrom_install; i++; + means[i] = cdrom_install; means_auto[i++] = cdrom_install_auto; +#endif +#ifndef DISABLE_DISK + means[i] = disk_install; means_auto[i++] = disk_install_auto; #endif means[i] = NULL; - results = ask_from_list("Please choose the mean of installation.", means, &choice); + results = ask_from_list_auto("Please choose the mean of installation.", means, &choice, "method", means_auto); if (results != RETURN_OK) return results; diff --git a/mdk-stage1/stage1.h b/mdk-stage1/stage1.h index d224babea..01620c266 100644 --- a/mdk-stage1/stage1.h +++ b/mdk-stage1/stage1.h @@ -36,18 +36,20 @@ extern char * method_name; #define MODE_EXPERT (1 << 1) #define MODE_TEXT (1 << 2) #define MODE_RESCUE (1 << 3) -#define MODE_KICKSTART (1 << 4) +#define MODE_AUTOMATIC (1 << 4) #define MODE_PCMCIA (1 << 5) #define MODE_CDROM (1 << 6) #define MODE_LIVE (1 << 7) #define MODE_SPECIAL_STAGE2 (1 << 8) #define MODE_RAMDISK (1 << 9) +#define MODE_AUTOMATIC_ERROR_OCCURED (1 << 10) #define IS_TESTING (get_param(MODE_TESTING)) #define IS_EXPERT (get_param(MODE_EXPERT)) #define IS_TEXT (get_param(MODE_TEXT)) #define IS_RESCUE (get_param(MODE_RESCUE)) -#define IS_KICKSTART (get_param(MODE_KICKSTART)) +#define IS_AUTOMATIC (get_param(MODE_AUTOMATIC)) +#define IS_AUTOMATIC_ERROR_OCCURED (get_param(MODE_AUTOMATIC_ERROR_OCCURED)) #define IS_PCMCIA (get_param(MODE_PCMCIA)) #define IS_CDROM (get_param(MODE_CDROM)) #define IS_LIVE (get_param(MODE_LIVE)) diff --git a/mdk-stage1/stdio-frontend.c b/mdk-stage1/stdio-frontend.c index ae7a57af1..8f8b68c17 100644 --- a/mdk-stage1/stdio-frontend.c +++ b/mdk-stage1/stdio-frontend.c @@ -87,6 +87,7 @@ void error_message(char *msg, ...) va_start(args, msg); va_end(args); blocking_msg("> Error! ", msg, args); + set_param(MODE_AUTOMATIC_ERROR_OCCURED); } void info_message(char *msg, ...) @@ -94,7 +95,10 @@ void info_message(char *msg, ...) va_list args; va_start(args, msg); va_end(args); - blocking_msg("> Notice: ", msg, args); + if (!IS_AUTOMATIC) + blocking_msg("> Notice: ", msg, args); + else + vlog_message(msg, args); } void wait_message(char *msg, ...) diff --git a/mdk-stage1/tools.c b/mdk-stage1/tools.c index 9420ed1dd..f4da3b50b 100644 --- a/mdk-stage1/tools.c +++ b/mdk-stage1/tools.c @@ -31,23 +31,18 @@ #include "log.h" #include "mount.h" #include "frontend.h" +#include "automatic.h" #include "tools.h" -struct cmdline_elem -{ - char * name; - char * value; -}; - -struct cmdline_elem * params; +static struct param_elem * params; void process_cmdline(void) { char buf[512]; int fd, size, i, p; - struct cmdline_elem tmp_params[50]; + struct param_elem tmp_params[50]; log_message("opening /proc/cmdline... "); @@ -61,36 +56,42 @@ void process_cmdline(void) log_message("\t%s", buf); i = 0; p = 0; - while (buf[i] != 0) { + while (buf[i] != '\0') { char *name, *value = NULL; int j = i; - while (buf[i] != ' ' && buf[i] != '=' && buf[i] != 0) + while (buf[i] != ' ' && buf[i] != '=' && buf[i] != '\0') i++; if (i == j) { i++; continue; } name = memdup(&buf[j], i-j + 1); - name[i-j] = 0; + name[i-j] = '\0'; if (buf[i] == '=') { int k = i+1; i++; - while (buf[i] != ' ' && buf[i] != 0) + while (buf[i] != ' ' && buf[i] != '\0') i++; value = memdup(&buf[k], i-k + 1); - value[i-k] = 0; + value[i-k] = '\0'; } tmp_params[p].name = name; tmp_params[p].value = value; - p++; - i++; if (!strcmp(name, "expert")) set_param(MODE_EXPERT); if (!strcmp(name, "rescue")) set_param(MODE_RESCUE); if (!strcmp(name, "pcmcia")) set_param(MODE_PCMCIA); if (!strcmp(name, "cdrom")) set_param(MODE_CDROM); if (!strcmp(name, "special_stage2")) set_param(MODE_SPECIAL_STAGE2); + if (!strcmp(name, "automatic")) { + set_param(MODE_AUTOMATIC); + grab_automatic_params(value); + } + p++; + if (buf[i] == '\0') + break; + i++; } if (IS_RESCUE) { @@ -102,9 +103,9 @@ void process_cmdline(void) tmp_params[p++].name = NULL; - params = memdup(tmp_params, sizeof(struct cmdline_elem) * p); + params = memdup(tmp_params, sizeof(struct param_elem) * p); - log_message("\tgot %d args", p); + log_message("\tgot %d args", p-1); } @@ -117,7 +118,7 @@ int get_param(int i) char * get_param_valued(char *param_name) { - struct cmdline_elem * ptr = params; + struct param_elem * ptr = params; while (ptr->name) { if (!strcmp(ptr->name, param_name)) @@ -179,7 +180,7 @@ int ramdisk_possible(void) if (total_memory() > MEM_LIMIT_RAMDISK) return 1; else { - log_message("Warning, ramdisk is not possible due to low mem!"); + log_message("warning, ramdisk is not possible due to low mem!"); return 0; } } diff --git a/mdk-stage1/tools.h b/mdk-stage1/tools.h index a21615891..7f34c8c5d 100644 --- a/mdk-stage1/tools.h +++ b/mdk-stage1/tools.h @@ -22,6 +22,7 @@ #ifndef _TOOLS_H_ #define _TOOLS_H_ +#include void process_cmdline(void); int get_param(int i); @@ -31,5 +32,11 @@ int ramdisk_possible(void); enum return_type load_ramdisk(void); void * memdup(void *src, size_t size); +struct param_elem +{ + char * name; + char * value; +}; + #endif -- cgit v1.2.1