From: Michael Tremer Date: Sat, 11 Oct 2014 16:59:31 +0000 (+0200) Subject: installer: Enable new partitioning code to be run in unattended mode X-Git-Tag: v2.17-core87~103^2~51^2~6 X-Git-Url: http://git.ipfire.org/?p=ipfire-2.x.git;a=commitdiff_plain;h=a3e135c8bdecb2061d3eb515772b82981d349b74 installer: Enable new partitioning code to be run in unattended mode The first disk of the system will automatically be used and a standard installation will be done. After that is done, the system will reboot into the freshly installed system and execute setup. --- diff --git a/config/syslinux/syslinux.cfg b/config/syslinux/syslinux.cfg index 3c7ae87d23..cfb8113cf6 100644 --- a/config/syslinux/syslinux.cfg +++ b/config/syslinux/syslinux.cfg @@ -58,7 +58,7 @@ Run an unattended installation. ENDTEXT KERNEL vmlinuz INITRD instroot - APPEND unattended + APPEND installer.unattended MENU END MENU BEGIN tools diff --git a/src/installer/hw.c b/src/installer/hw.c index e453e23cbe..ecc4dc3924 100644 --- a/src/installer/hw.c +++ b/src/installer/hw.c @@ -323,6 +323,27 @@ struct hw_disk** hw_select_disks(struct hw_disk** disks, int* selection) { return ret; } +struct hw_disk** hw_select_first_disk(const struct hw_disk** disks) { + struct hw_disk** ret = hw_create_disks(); + struct hw_disk** selected_disks = ret; + + unsigned int num_disks = hw_count_disks(disks); + assert(num_disks > 0); + + for (unsigned int i = 0; i < num_disks; i++) { + struct hw_disk *disk = disks[i]; + disk->ref++; + + *selected_disks++ = disk; + break; + } + + // Set sentinel + *selected_disks = NULL; + + return ret; +} + static unsigned long long hw_swap_size(struct hw_destination* dest) { unsigned long long memory = hw_memory(); diff --git a/src/installer/hw.h b/src/installer/hw.h index e4bb18b920..c5285d543e 100644 --- a/src/installer/hw.h +++ b/src/installer/hw.h @@ -109,6 +109,7 @@ struct hw_disk** hw_find_disks(struct hw* hw, const char* sourcedrive); void hw_free_disks(struct hw_disk** disks); unsigned int hw_count_disks(struct hw_disk** disks); struct hw_disk** hw_select_disks(struct hw_disk** disks, int* selection); +struct hw_disk** hw_select_first_disk(const struct hw_disk** disks); struct hw_destination* hw_make_destination(int part_type, struct hw_disk** disks); diff --git a/src/installer/main.c b/src/installer/main.c index 513ebf41a2..f197dc351c 100644 --- a/src/installer/main.c +++ b/src/installer/main.c @@ -281,17 +281,16 @@ int main(int argc, char *argv[]) { snprintf(title, sizeof(title), "%s - %s", NAME, SLOGAN); - if (! (cmdfile = fopen("/proc/cmdline", "r"))) - { + if (! (cmdfile = fopen("/proc/cmdline", "r"))) { fprintf(flog, "Couldn't open commandline: /proc/cmdline\n"); } else { fgets(line, STRING_SIZE, cmdfile); - + // check if we have to make an unattended install - if (strstr (line, "unattended") != NULL) { + if (strstr(line, "installer.unattended") != NULL) { + splashWindow(title, _("Warning: Unattended installation will start in 10 seconds..."), 10); unattended = 1; - runcommandwithstatus("/bin/sleep 10", title, "WARNING: Unattended installation will start in 10 seconds...", NULL); - } + } // check if we have to patch for serial console if (strstr (line, "console=ttyS0") != NULL) { serialconsole = 1; @@ -314,7 +313,7 @@ int main(int argc, char *argv[]) { } langnames[NUM_LANGS] = NULL; - rc = newtWinMenu(_("Language selection"), _("Select the language you wish to use for the installation."), + rc = newtWinMenu(_("Language selection"), _("Select the language you wish to use for the installation."), 50, 5, 5, 8, langnames, &choice, _("OK"), NULL); assert(choice <= NUM_LANGS); @@ -406,8 +405,10 @@ int main(int argc, char *argv[]) { goto EXIT; // exactly one disk has been found - } else if (num_disks == 1) { - selected_disks = hw_select_disks(disks, NULL); + // or if we are running in unattended mode, we will select + // the first disk and go with that one + } else if ((num_disks == 1) || (unattended && num_disks >= 1)) { + selected_disks = hw_select_first_disk(disks); // more than one usable disk has been found and // the user needs to choose what to do with them @@ -442,6 +443,11 @@ int main(int argc, char *argv[]) { } } + // Don't print the auto-selected harddisk setup in + // unattended mode. + if (unattended) + break; + num_selected_disks = hw_count_disks(selected_disks); if (num_selected_disks == 1) { diff --git a/src/libsmooth/libsmooth.h b/src/libsmooth/libsmooth.h index d731e548af..6003bc0651 100644 --- a/src/libsmooth/libsmooth.h +++ b/src/libsmooth/libsmooth.h @@ -52,6 +52,7 @@ int runcommandwithprogress(int width, int height, const char *title, const char int lines, char *text, ...); int runcommandwithstatus(const char *command, const char* title, const char *message, const char* output); int runhiddencommandwithstatus(const char *command, const char* title, const char *message, const char* output); +int splashWindow(const char* title, const char* message, unsigned int timeout); int checkformodule(const char *module); int replace(char filename1[], char *from, char *to); char* get_version(void); diff --git a/src/libsmooth/main.c b/src/libsmooth/main.c index 1d2a5002e5..fedff109d5 100644 --- a/src/libsmooth/main.c +++ b/src/libsmooth/main.c @@ -90,6 +90,16 @@ int runhiddencommandwithstatus(const char *command, const char* title, const cha return rc; } +int splashWindow(const char* title, const char* message, unsigned int timeout) { + statuswindow(60, 4, title, message); + + // Wait so the user can read this message + sleep(timeout); + newtPopWindow(); + + return 0; +} + /* This one borrowed from redhat installer. */ int runcommandwithprogress(int width, int height, const char *title, const char *command, int lines, char *text, ...) {