Merge remote-tracking branch 'origin/seventeen' into seventeen
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 16 Nov 2014 10:38:45 +0000 (11:38 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 16 Nov 2014 10:38:45 +0000 (11:38 +0100)
src/installer/dracut-module/run-installer.sh
src/installer/hw.c
src/installer/main.c

index 1a7bd13..ea9669a 100644 (file)
@@ -3,6 +3,11 @@
 # IPFire Installer RC
 #
 
+unattended=0
+if grep -q "installer.unattended" /proc/cmdline; then
+       unattended=1
+fi
+
 # Enable Unicode
 echo -en '\033%G' && kbd_mode -u
 
@@ -22,14 +27,16 @@ echo "Loading Installer..."
 ret=$?
 
 case "${ret}" in
-       0)
-               # The installer has finished without a problem.
-               ;;
-       *)
+       139)
                echo "The installer has crashed. You will be dropped to a debugging shell"
                /bin/bash --login
                ;;
 esac
 
+# Poweroff after an unattended installation
+if [ "${unattended}" = "1" ]; then
+       /shutdown poweroff
+fi
+
 # Reboot the system
 /shutdown reboot
index d745260..ce97775 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <assert.h>
 #include <blkid/blkid.h>
+#include <errno.h>
 #include <fcntl.h>
 #include <libudev.h>
 #include <linux/loop.h>
@@ -138,7 +139,16 @@ int hw_mount(const char* source, const char* target, const char* fs, int flags)
 }
 
 int hw_umount(const char* target) {
-       return umount2(target, 0);
+       int r = umount2(target, 0);
+
+       if (r && errno == EBUSY) {
+               // Give it a moment to settle
+               sleep(1);
+
+               r = umount2(target, MNT_FORCE);
+       }
+
+       return r;
 }
 
 static int hw_test_source_medium(const char* path) {
@@ -869,36 +879,47 @@ int hw_mount_filesystems(struct hw_destination* dest, const char* prefix) {
 }
 
 int hw_umount_filesystems(struct hw_destination* dest, const char* prefix) {
+       int r;
+       char target[STRING_SIZE];
+
        // Write all buffers to disk before umounting
        hw_sync();
 
        // boot
        if (*dest->part_boot) {
-               hw_umount(dest->part_boot);
+               snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_BOOT);
+               r = hw_umount(target);
+               if (r)
+                       return -1;
        }
 
        // data
        if (*dest->part_data) {
-               hw_umount(dest->part_data);
+               snprintf(target, sizeof(target), "%s%s", prefix, HW_PATH_DATA);
+               r = hw_umount(target);
+               if (r)
+                       return -1;
        }
 
-       // root
-       hw_umount(dest->part_root);
-
        // swap
        if (*dest->part_swap) {
                swapoff(dest->part_swap);
        }
 
        // misc filesystems
-       char target[STRING_SIZE];
        char** otherfs = other_filesystems;
-
        while (*otherfs) {
                snprintf(target, sizeof(target), "%s%s", prefix, *otherfs++);
-               hw_umount(target);
+               r = hw_umount(target);
+               if (r)
+                       return -1;
        }
 
+       // root
+       r = hw_umount(prefix);
+       if (r)
+               return -1;
+
        return 0;
 }
 
@@ -1012,6 +1033,8 @@ int hw_install_bootloader(struct hw_destination* dest, const char* output) {
                r = system_chroot(output, DESTINATION_MOUNT_PATH, cmd);
        }
 
+       hw_sync();
+
        return r;
 }
 
index 01a9cc6..d02db28 100644 (file)
@@ -289,7 +289,7 @@ static void parse_command_line(struct config* c) {
                        char* key = strsep(&val, "=");
 
                        // serial console
-                       if (strcmp(token, "console=ttyS0") == 0)
+                       if ((strcmp(key, "console") == 0) && (strncmp(val, "ttyS", 4) == 0))
                                c->serial_console = 1;
 
                        // enable networking?
@@ -839,12 +839,28 @@ int main(int argc, char *argv[]) {
                free(backup_file);
        }
 
+       // Download and execute the postinstall script
+       if (*config.postinstall) {
+               snprintf(commandstring, sizeof(commandstring),
+                       "/usr/bin/execute-postinstall.sh %s %s", DESTINATION_MOUNT_PATH, config.postinstall);
+
+               if (runcommandwithstatus(commandstring, title, _("Running post-install script..."), logfile)) {
+                       errorbox(_("Post-install script failed."));
+                       goto EXIT;
+               }
+       }
+
        // Umount the destination drive
-       hw_umount_filesystems(destination, DESTINATION_MOUNT_PATH);
+       statuswindow(60, 4, title, _("Umounting filesystems..."));
 
-       // Stop the RAID array if we are using RAID
-       if (destination->is_raid)
-               hw_stop_all_raid_arrays(logfile);
+       rc = hw_umount_filesystems(destination, DESTINATION_MOUNT_PATH);
+       if (rc) {
+               // Show an error message if filesystems could not be umounted properly
+               snprintf(message, sizeof(message),
+                       _("Could not umount all filesystems successfully:\n\n  %s"), strerror(errno));
+               errorbox(message);
+               goto EXIT;
+       }
 
        // Umount source drive and eject
        hw_umount(SOURCE_MOUNT_PATH);
@@ -860,19 +876,18 @@ int main(int argc, char *argv[]) {
                snprintf(commandstring, STRING_SIZE, "/usr/bin/eject %s", sourcedrive);
                mysystem(logfile, commandstring);
        }
+       newtPopWindow();
 
-       // Download and execute the postinstall script
-       if (*config.postinstall) {
-               snprintf(commandstring, sizeof(commandstring),
-                       "/usr/bin/execute-postinstall.sh %s %s", DESTINATION_MOUNT_PATH, config.postinstall);
+       // Stop the RAID array if we are using RAID
+       if (destination->is_raid)
+               hw_stop_all_raid_arrays(logfile);
 
-               if (runcommandwithstatus(commandstring, title, _("Running post-install script..."), logfile)) {
-                       errorbox(_("Post-install script failed."));
-                       goto EXIT;
-               }
-       }
+       // Show a short message that the installation went well and
+       // wait a moment so that all disk caches get flushed.
+       if (config.unattended) {
+               splashWindow(title, _("Unattended installation has finished. The system will be shutting down in a moment..."), 5);
 
-       if (!config.unattended) {
+       } else {
                snprintf(message, sizeof(message), _(
                        "%s was successfully installed!\n\n"
                        "Please remove any installation mediums from this system and hit the reboot button. "