X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Finstall%2Bsetup%2Finstall%2Fmain.c;h=b1d512a71b8e00a7a3156ae66c2569f9201e8228;hb=91b20d84de68c80e230838e81a470c7bf5d3457b;hp=a46de921f70bebbe9aafd46712c3c97f5a42d578;hpb=23c6672b8c7c555b1455aebc08b51585770152da;p=people%2Fteissler%2Fipfire-2.x.git diff --git a/src/install+setup/install/main.c b/src/install+setup/install/main.c index a46de921f..b1d512a71 100644 --- a/src/install+setup/install/main.c +++ b/src/install+setup/install/main.c @@ -1,3 +1,4 @@ + /* SmoothWall install program. * * This program is distributed under the terms of the GNU General Public @@ -11,12 +12,14 @@ #include "install.h" #define _GNU_SOURCE -#define INST_FILECOUNT 8400 +#define INST_FILECOUNT 14400 #define UNATTENDED_CONF "/cdrom/boot/unattended.conf" +#define LICENSE_FILE "/cdrom/COPYING" #define EXT2 0 -#define REISERFS 2 #define EXT3 1 +#define EXT4 2 +#define REISERFS 3 FILE *flog = NULL; char *mylog; @@ -32,24 +35,29 @@ extern char *en_tr[]; extern char *es_tr[]; extern char *de_tr[]; extern char *fr_tr[]; +extern char *pl_tr[]; +extern char *ru_tr[]; int main(int argc, char *argv[]) { - char *langnames[] = { "Deutsch", "English", "Français", "Español", NULL }; - char *shortlangnames[] = { "de", "en", "fr", "es", NULL }; - char **langtrs[] = { de_tr, en_tr, fr_tr, es_tr, NULL }; + + char discl_msg[40000] = "Disclaimer\n"; + + char *langnames[] = { "Deutsch", "English", "Français", "Español", "Polski", "Русский", NULL }; + char *shortlangnames[] = { "de", "en", "fr", "es", "pl", "ru", NULL }; + char **langtrs[] = { de_tr, en_tr, fr_tr, es_tr, pl_tr, ru_tr, NULL }; char hdletter; char harddrive[30], sourcedrive[5]; /* Device holder. */ + char harddrive_info[STRING_SIZE]; /* Additional infos about target */ struct devparams hdparams, cdromparams; /* Params for CDROM and HD */ int rc = 0; char commandstring[STRING_SIZE]; char mkfscommand[STRING_SIZE]; - char *fstypes[] = { "ext2", "ext3", "ReiserFS", NULL }; - int fstype = REISERFS; + char *fstypes[] = { "ext2", "ext3", "ext4", "ReiserFS", NULL }; + int fstype = EXT4; int choice; int i; int found = 0; - int firstrun = 0; char shortlangname[10]; char message[1000]; char title[STRING_SIZE]; @@ -57,7 +65,7 @@ int main(int argc, char *argv[]) int allok_fastexit=0; int raid_disk = 0; struct keyvalue *ethernetkv = initkeyvalues(); - FILE *handle, *cmdfile; + FILE *handle, *cmdfile, *copying; char line[STRING_SIZE]; char string[STRING_SIZE]; long memory = 0, disk = 0, free; @@ -66,6 +74,7 @@ int main(int argc, char *argv[]) char *yesnoharddisk[3]; // char *yesnoharddisk = { "NO", "YES", NULL }; int unattended = 0; + int serialconsole = 0; struct keyvalue *unattendedkv = initkeyvalues(); int hardyn = 0; char restore_file[STRING_SIZE] = ""; @@ -106,17 +115,21 @@ int main(int argc, char *argv[]) unattended = 1; runcommandwithstatus("/bin/sleep 10", "WARNING: Unattended installation will start in 10 seconds..."); } + // check if we have to patch for serial console + if (strstr (line, "console=ttyS0") != NULL) { + serialconsole = 1; + } } // Load common modules mysystem("/sbin/modprobe iso9660"); // CDROM - mysystem("/sbin/modprobe ext2"); // Boot patition +// mysystem("/sbin/modprobe ext2"); // Boot patition mysystem("/sbin/modprobe vfat"); // USB key /* German is the default */ for (choice = 0; langnames[choice]; choice++) { - if (strcmp(langnames[choice], "Deutsch") == 0) + if (strcmp(langnames[choice], "English") == 0) break; } if (!langnames[choice]) @@ -132,26 +145,42 @@ int main(int argc, char *argv[]) newtPushHelpLine(ctr[TR_HELPLINE]); - sprintf(message, ctr[TR_WELCOME], NAME); - newtWinMessage(title, ctr[TR_OK], message); - - switch (mysystem("/bin/mountsource.sh")) { - case 0: - break; - case 10: - errorbox(ctr[TR_NO_CDROM]); - goto EXIT; + if (!unattended) { + sprintf(message, ctr[TR_WELCOME], NAME); + newtWinMessage(title, ctr[TR_OK], message); } - /* read source drive letter */ + mysystem("/bin/mountsource.sh"); + if ((handle = fopen("/tmp/source_device", "r")) == NULL) { - errorbox(ctr[TR_ERROR_PROBING_CDROM]); - goto EXIT; + newtWinMessage(title, ctr[TR_OK], ctr[TR_NO_LOCAL_SOURCE]); + runcommandwithstatus("/bin/downloadsource.sh",ctr[TR_DOWNLOADING_ISO]); + if ((handle = fopen("/tmp/source_device", "r")) == NULL) { + errorbox(ctr[TR_DOWNLOAD_ERROR]); + goto EXIT; + } } + fgets(sourcedrive, 5, handle); fprintf(flog, "Source drive: %s\n", sourcedrive); fclose(handle); - + + if (!unattended) { + // Read the license file. + if (!(copying = fopen(LICENSE_FILE, "r"))) { + sprintf(discl_msg, "Could not open license file: %s\n", LICENSE_FILE); + fprintf(flog, discl_msg); + } else { + fread(discl_msg, 1, 40000, copying); + fclose(copying); + + if (disclaimerbox(discl_msg)==0) { + errorbox(ctr[TR_LICENSE_NOT_ACCEPTED]); + goto EXIT; + } + } + } + i = 0; while (found == 0) { i++; @@ -174,13 +203,8 @@ int main(int argc, char *argv[]) found = 1; break; case 10: // No harddisk found - if (firstrun == 1) { - errorbox(ctr[TR_NO_HARDDISK]); - goto EXIT; - } - // Do this if the kudzu-scan fails... - runcommandwithstatus("/bin/probehw.sh deep-scan", ctr[TR_PROBING_HARDWARE]); - firstrun = 1; + errorbox(ctr[TR_NO_HARDDISK]); + goto EXIT; } } @@ -190,6 +214,12 @@ int main(int argc, char *argv[]) } fgets(harddrive, 30, handle); fclose(handle); + if ((handle = fopen("/tmp/dest_device_info", "r")) == NULL) { + sprintf(harddrive_info, "%s", harddrive); + } + fgets(harddrive_info, 70, handle); + fclose(handle); + /* load unattended configuration */ if (unattended) { @@ -213,7 +243,7 @@ int main(int argc, char *argv[]) fprintf(flog, "Destination drive: %s\n", hdparams.devnode_disk); - sprintf(message, ctr[TR_PREPARE_HARDDISK], hdparams.devnode_disk); + sprintf(message, ctr[TR_PREPARE_HARDDISK], harddrive_info); if (unattended) { hardyn = 1; } else { @@ -233,6 +263,12 @@ int main(int argc, char *argv[]) if (rc == 2) goto EXIT; + fstypes[0]=ctr[TR_EXT2FS_DESCR]; + fstypes[1]=ctr[TR_EXT3FS_DESCR]; + fstypes[2]=ctr[TR_EXT4FS_DESCR]; + fstypes[3]=ctr[TR_REISERFS_DESCR]; + fstypes[4]=NULL; + if (!unattended) { sprintf(message, ctr[TR_CHOOSE_FILESYSTEM]); rc = newtWinMenu( ctr[TR_CHOOSE_FILESYSTEM], message, @@ -240,7 +276,7 @@ int main(int argc, char *argv[]) ctr[TR_CANCEL], NULL); } else { rc = 1; - fstype = REISERFS; + fstype = EXT3; } if (rc == 2) goto EXIT; @@ -340,16 +376,19 @@ int main(int argc, char *argv[]) errorbox(ctr[TR_UNABLE_TO_PARTITION]); goto EXIT; } - + if (fstype == EXT2) { - mysystem("/sbin/modprobe ext2"); +// mysystem("/sbin/modprobe ext2"); sprintf(mkfscommand, "/sbin/mke2fs -T ext2"); } else if (fstype == REISERFS) { mysystem("/sbin/modprobe reiserfs"); sprintf(mkfscommand, "/sbin/mkreiserfs -f"); } else if (fstype == EXT3) { - mysystem("/sbin/modprobe ext3"); +// mysystem("/sbin/modprobe ext3"); sprintf(mkfscommand, "/sbin/mke2fs -T ext3"); + } else if (fstype == EXT4) { +// mysystem("/sbin/modprobe ext4"); + sprintf(mkfscommand, "/sbin/mke2fs -T ext4"); } snprintf(commandstring, STRING_SIZE, "/sbin/mke2fs -T ext2 -I 128 %s1", hdparams.devnode_part); @@ -427,9 +466,6 @@ int main(int argc, char *argv[]) /* Save language und local settings */ write_lang_configs(shortlangname); - /* Rename uname */ - rename ("/harddisk/bin/uname.bak", "/harddisk/bin/uname"); - /* mount proc filesystem */ mysystem("mkdir /harddisk/proc"); mysystem("/bin/mount --bind /proc /harddisk/proc"); @@ -462,7 +498,9 @@ int main(int argc, char *argv[]) replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro"); } else if (fstype == EXT3) { replace("/harddisk/etc/fstab", "FSTYPE", "ext3"); - NOJOURNAL: + replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro"); + } else if (fstype == EXT4) { + replace("/harddisk/etc/fstab", "FSTYPE", "ext4"); replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro"); } @@ -475,13 +513,43 @@ int main(int argc, char *argv[]) system("/bin/sed -e 's#/harddisk#/#g' -e 's#//#/#g' < /proc/mounts > /harddisk/etc/mtab"); + /* + * Generate device.map to help grub finding the device to install itself on. + */ + FILE *f = NULL; + if (f = fopen("/harddisk/boot/grub/device.map", "w")) { + fprintf(f, "(hd0) %s\n", hdparams.devnode_disk); + fclose(f); + } + snprintf(commandstring, STRING_SIZE, "/usr/sbin/chroot /harddisk /usr/sbin/grub-install --no-floppy %s", hdparams.devnode_disk); if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_GRUB])) { errorbox(ctr[TR_UNABLE_TO_INSTALL_GRUB]); goto EXIT; } - + + /* Serial console ? */ + if (serialconsole) { + /* grub */ + replace("/harddisk/boot/grub/grub.conf", "splashimage", "#splashimage"); + replace("/harddisk/boot/grub/grub.conf", "#serial", "serial"); + replace("/harddisk/boot/grub/grub.conf", "#terminal", "terminal"); + replace("/harddisk/boot/grub/grub.conf", " panic=10 ", " console=ttyS0,38400n8 panic=10 "); + + /*inittab*/ + replace("/harddisk/etc/inittab", "1:2345:respawn:", "#1:2345:respawn:"); + replace("/harddisk/etc/inittab", "2:2345:respawn:", "#2:2345:respawn:"); + replace("/harddisk/etc/inittab", "3:2345:respawn:", "#3:2345:respawn:"); + replace("/harddisk/etc/inittab", "4:2345:respawn:", "#4:2345:respawn:"); + replace("/harddisk/etc/inittab", "5:2345:respawn:", "#5:2345:respawn:"); + replace("/harddisk/etc/inittab", "6:2345:respawn:", "#6:2345:respawn:"); + replace("/harddisk/etc/inittab", "#7:2345:respawn:", "7:2345:respawn:"); + } + + /* Set marker that the user has already accepted the gpl */ + mysystem("/usr/bin/touch /harddisk/var/ipfire/main/gpl_accepted"); + /* Copy restore file from cdrom */ if (unattended && (strlen(restore_file) > 0)) { fprintf(flog, "unattended: Copy restore file\n"); @@ -497,7 +565,7 @@ int main(int argc, char *argv[]) if (!unattended) { sprintf(message, ctr[TR_CONGRATULATIONS_LONG], NAME, SNAME, NAME); - newtWinMessage(ctr[TR_CONGRATULATIONS], ctr[TR_OK], message); + newtWinMessage(ctr[TR_CONGRATULATIONS], ctr[TR_PRESS_OK_TO_REBOOT], message); } allok = 1; @@ -527,10 +595,11 @@ EXIT: fclose(flog); newtFinished(); -// if (!unattended) { -// if (system("/usr/sbin/chroot /harddisk /usr/local/sbin/setup /dev/tty2 INSTALL")) -// printf("Unable to run setup.\n"); -// } + if (unattended) { + // Remove Setup autorun after boot + if (system("rm -f /harddisk/etc/rc.d/rcsysinit.d/S75firstsetup")) + printf("Unable to disable setup autorun.\n"); + } if (system("/bin/umount /harddisk/proc")) printf("Unable to umount /harddisk/proc.\n"); @@ -548,13 +617,13 @@ EXIT: newtFinished(); - system("/bin/umount /harddisk/proc"); - system("/bin/umount /harddisk/dev"); - system("/bin/umount /harddisk/sys"); + system("/bin/umount /harddisk/proc >/dev/null 2>&1"); + system("/bin/umount /harddisk/dev >/dev/null 2>&1"); + system("/bin/umount /harddisk/sys >/dev/null 2>&1"); - system("/bin/umount /harddisk/var"); - system("/bin/umount /harddisk/boot"); - system("/bin/umount /harddisk"); + system("/bin/umount /harddisk/var >/dev/null 2>&1"); + system("/bin/umount /harddisk/boot >/dev/null 2>&1"); + system("/bin/umount /harddisk >/dev/null 2>&1"); if (!(allok)) system("/etc/halt");