]> git.ipfire.org Git - ipfire-2.x.git/blame - src/install+setup/install/main.c
installer: skip empty blockdevices.
[ipfire-2.x.git] / src / install+setup / install / main.c
CommitLineData
2bb7b134 1
d6aaa55d
MT
2/* SmoothWall install program.
3 *
4 * This program is distributed under the terms of the GNU General Public
5 * Licence. See the file COPYING for details.
6 *
7 * (c) Lawrence Manning, 2001
f9cc0d70 8 * Contains main entry point, and misc functions.6
d6aaa55d 9 *
d6aaa55d 10 */
10bc6f06 11
d6aaa55d 12#include "install.h"
72d80898
MT
13#define _GNU_SOURCE
14
fe683b74 15#define INST_FILECOUNT 10700
33634aa8 16#define UNATTENDED_CONF "/cdrom/boot/unattended.conf"
918546e2 17#define LICENSE_FILE "/cdrom/COPYING"
d6aaa55d 18
ddd1589d 19#define EXT2 0
ddd1589d 20#define EXT3 1
c8d680dc
AF
21#define EXT4 2
22#define REISERFS 3
cd8dd8dd 23
d6aaa55d
MT
24FILE *flog = NULL;
25char *mylog;
10bc6f06 26
d6aaa55d
MT
27char **ctr;
28
d6aaa55d
MT
29extern char url[STRING_SIZE];
30
f9cc0d70
HS
31struct nic nics[20] = { { "" , "" , "" } }; // only defined for compile
32struct knic knics[20] = { { "" , "" , "" , "" } }; // only defined for compile
5057b611 33
10bc6f06 34extern char *en_tr[];
cf4dd3c0 35extern char *es_tr[];
10bc6f06 36extern char *de_tr[];
462515e4 37extern char *fr_tr[];
b6c9668f 38extern char *pl_tr[];
2bb7b134 39extern char *ru_tr[];
d6aaa55d
MT
40
41int main(int argc, char *argv[])
42{
e0bbaf87
AF
43
44 char discl_msg[40000] = "Disclaimer\n";
45
2bb7b134
AF
46 char *langnames[] = { "Deutsch", "English", "Français", "Español", "Polski", "Русский", NULL };
47 char *shortlangnames[] = { "de", "en", "fr", "es", "pl", "ru", NULL };
48 char **langtrs[] = { de_tr, en_tr, fr_tr, es_tr, pl_tr, ru_tr, NULL };
c78a77eb 49 char hdletter;
77f1c55f 50 char harddrive[30], sourcedrive[5]; /* Device holder. */
72d80898 51 struct devparams hdparams, cdromparams; /* Params for CDROM and HD */
72d80898 52 int rc = 0;
d6aaa55d 53 char commandstring[STRING_SIZE];
cd8dd8dd 54 char mkfscommand[STRING_SIZE];
c8d680dc 55 char *fstypes[] = { "ext2", "ext3", "ext4", "ReiserFS", NULL };
eea897b3 56 int fstype = EXT4;
d6aaa55d 57 int choice;
ee78a5ef
MT
58 int i;
59 int found = 0;
d6aaa55d
MT
60 char shortlangname[10];
61 char message[1000];
62 char title[STRING_SIZE];
63 int allok = 0;
10bc6f06 64 int allok_fastexit=0;
56b548f1 65 int raid_disk = 0;
d6aaa55d 66 struct keyvalue *ethernetkv = initkeyvalues();
e0bbaf87 67 FILE *handle, *cmdfile, *copying;
d6aaa55d
MT
68 char line[STRING_SIZE];
69 char string[STRING_SIZE];
66294b69 70 long memory = 0, disk = 0, free;
8e2e5cf3 71 long system_partition, boot_partition, root_partition, swap_file;
d6aaa55d 72 int scsi_disk = 0;
5057b611
HS
73 char *yesnoharddisk[3]; // char *yesnoharddisk = { "NO", "YES", NULL };
74
72d80898 75 int unattended = 0;
5faa66cf 76 int serialconsole = 0;
72d80898 77 struct keyvalue *unattendedkv = initkeyvalues();
c78a77eb 78 int hardyn = 0;
66335974 79 char restore_file[STRING_SIZE] = "";
d6aaa55d
MT
80
81 setlocale (LC_ALL, "");
10bc6f06 82 sethostname( SNAME , 10);
72d80898 83
d6aaa55d
MT
84 memset(&hdparams, 0, sizeof(struct devparams));
85 memset(&cdromparams, 0, sizeof(struct devparams));
86
87 /* Log file/terminal stuff. */
88 if (argc >= 2)
89 {
90 if (!(flog = fopen(argv[1], "w+")))
91 return 0;
92 }
93 else
94 return 0;
95
96 mylog = argv[1];
97
98 fprintf(flog, "Install program started.\n");
99
100 newtInit();
101 newtCls();
102
7ea444c8
AF
103 newtDrawRootText(14, 0, NAME " " VERSION " - " SLOGAN );
104 sprintf (title, "%s %s - %s", NAME, VERSION, SLOGAN);
105
d6aaa55d
MT
106 if (! (cmdfile = fopen("/proc/cmdline", "r")))
107 {
108 fprintf(flog, "Couldn't open commandline: /proc/cmdline\n");
109 } else {
110 fgets(line, STRING_SIZE, cmdfile);
61e3d218 111
72d80898 112 // check if we have to make an unattended install
ee78a5ef 113 if (strstr (line, "unattended") != NULL) {
72d80898 114 unattended = 1;
bba7212c
MT
115 runcommandwithstatus("/bin/sleep 10", "WARNING: Unattended installation will start in 10 seconds...");
116 }
5faa66cf
AF
117 // check if we have to patch for serial console
118 if (strstr (line, "console=ttyS0") != NULL) {
119 serialconsole = 1;
120 }
d6aaa55d 121 }
0db33b56 122
7ea444c8 123 // Load common modules
bba7212c 124 mysystem("/sbin/modprobe iso9660"); // CDROM
337726bf 125// mysystem("/sbin/modprobe ext2"); // Boot patition
bba7212c 126 mysystem("/sbin/modprobe vfat"); // USB key
d6aaa55d 127
72d80898 128 /* German is the default */
d6aaa55d
MT
129 for (choice = 0; langnames[choice]; choice++)
130 {
215bd18d 131 if (strcmp(langnames[choice], "English") == 0)
d6aaa55d
MT
132 break;
133 }
134 if (!langnames[choice])
135 goto EXIT;
136
72d80898 137 if (!unattended) {
51f3b7f5 138 rc = newtWinMenu("Language selection", "Select the language you wish to use for the " NAME ".", 50, 5, 5, 8,
72d80898
MT
139 langnames, &choice, "Ok", NULL);
140 }
141
d6aaa55d
MT
142 ctr = langtrs[choice];
143 strcpy(shortlangname, shortlangnames[choice]);
3d6e1202 144
d6aaa55d 145 newtPushHelpLine(ctr[TR_HELPLINE]);
0db33b56 146
e0bbaf87 147 if (!unattended) {
c5685c24
MT
148 sprintf(message, ctr[TR_WELCOME], NAME);
149 newtWinMessage(title, ctr[TR_OK], message);
e0bbaf87
AF
150 }
151
0f680bcc 152 mysystem("/bin/mountsource.sh");
9607771a 153
03d956be 154 if ((handle = fopen("/tmp/source_device", "r")) == NULL) {
0f680bcc
AF
155 newtWinMessage(title, ctr[TR_OK], ctr[TR_NO_LOCAL_SOURCE]);
156 runcommandwithstatus("/bin/downloadsource.sh",ctr[TR_DOWNLOADING_ISO]);
157 if ((handle = fopen("/tmp/source_device", "r")) == NULL) {
158 errorbox(ctr[TR_DOWNLOAD_ERROR]);
159 goto EXIT;
160 }
72d80898 161 }
0f680bcc 162
03d956be
MT
163 fgets(sourcedrive, 5, handle);
164 fprintf(flog, "Source drive: %s\n", sourcedrive);
165 fclose(handle);
918546e2
MT
166
167 if (!unattended) {
168 // Read the license file.
169 if (!(copying = fopen(LICENSE_FILE, "r"))) {
170 sprintf(discl_msg, "Could not open license file: %s\n", LICENSE_FILE);
171 fprintf(flog, discl_msg);
172 } else {
173 fread(discl_msg, 1, 40000, copying);
174 fclose(copying);
175
176 if (disclaimerbox(discl_msg)==0) {
177 errorbox(ctr[TR_LICENSE_NOT_ACCEPTED]);
178 goto EXIT;
179 }
180 }
181 }
182
ee78a5ef
MT
183 i = 0;
184 while (found == 0) {
185 i++;
186 fprintf(flog, "Harddisk scan pass %i\n", i);
187
aee3027d 188 switch (mysystem("/bin/mountdest.sh") % 255) {
ee78a5ef
MT
189 case 0: // Found IDE disk
190 scsi_disk = 0;
56b548f1 191 raid_disk = 0;
ee78a5ef
MT
192 found = 1;
193 break;
194 case 1: // Found SCSI disk
195 scsi_disk = 1;
56b548f1
MT
196 raid_disk = 0;
197 found = 1;
198 break;
199 case 2: // Found RAID disk
200 scsi_disk = 0;
201 raid_disk= 1;
ee78a5ef
MT
202 found = 1;
203 break;
204 case 10: // No harddisk found
0ebec256
AF
205 errorbox(ctr[TR_NO_HARDDISK]);
206 goto EXIT;
aee3027d 207 }
ee78a5ef
MT
208 }
209
ee78a5ef
MT
210 if ((handle = fopen("/tmp/dest_device", "r")) == NULL) {
211 errorbox(ctr[TR_NO_HARDDISK]);
212 goto EXIT;
213 }
77f1c55f 214 fgets(harddrive, 30, handle);
ee78a5ef
MT
215 fclose(handle);
216
72d80898
MT
217 /* load unattended configuration */
218 if (unattended) {
219 fprintf(flog, "unattended: Reading unattended.conf\n");
220
221 (void) readkeyvalues(unattendedkv, UNATTENDED_CONF);
c25a0343 222 findkey(unattendedkv, "RESTORE_FILE", restore_file);
72d80898 223 }
72d80898 224
1cdddb12
MT
225 /* Make the hdparms struct and print the contents.
226 With USB-KEY install and SCSI disk, while installing, the disk
227 is named 'sdb,sdc,...' (following keys)
228 On reboot, it will become 'sda'
229 To avoid many test, all names are built in the struct.
230 */
231 sprintf(hdparams.devnode_disk, "/dev/%s", harddrive);
232 /* Address the partition or raid partition (eg dev/sda or /dev/sdap1 */
233 sprintf(hdparams.devnode_part, "/dev/%s%s", harddrive,raid_disk ? "p" : "");
234 /* Now the names after the machine is booted. Only scsi is affected
235 and we only install on the first scsi disk. */
1cdddb12
MT
236
237 fprintf(flog, "Destination drive: %s\n", hdparams.devnode_disk);
238
239 sprintf(message, ctr[TR_PREPARE_HARDDISK], hdparams.devnode_disk);
72d80898
MT
240 if (unattended) {
241 hardyn = 1;
be91126f
MT
242 } else {
243 yesnoharddisk[0] = ctr[TR_NO];
244 yesnoharddisk[1] = ctr[TR_YES];
245 yesnoharddisk[2] = NULL;
72d80898 246 }
5057b611 247
72d80898
MT
248 while (! hardyn) {
249 rc = newtWinMenu(title, message,
250 50, 5, 5, 6, yesnoharddisk,
251 &hardyn, ctr[TR_OK],
252 ctr[TR_CANCEL], NULL);
253 if (rc == 2)
254 goto EXIT;
255 }
5433e2c9
MT
256 if (rc == 2)
257 goto EXIT;
72d80898 258
c8d680dc
AF
259 fstypes[0]=ctr[TR_EXT2FS_DESCR];
260 fstypes[1]=ctr[TR_EXT3FS_DESCR];
261 fstypes[2]=ctr[TR_EXT4FS_DESCR];
262 fstypes[3]=ctr[TR_REISERFS_DESCR];
263 fstypes[4]=NULL;
264
cd8dd8dd 265 if (!unattended) {
1700769c
CS
266 sprintf(message, ctr[TR_CHOOSE_FILESYSTEM]);
267 rc = newtWinMenu( ctr[TR_CHOOSE_FILESYSTEM], message,
cd8dd8dd
MT
268 50, 5, 5, 6, fstypes, &fstype, ctr[TR_OK],
269 ctr[TR_CANCEL], NULL);
270 } else {
271 rc = 1;
c8d680dc 272 fstype = EXT3;
cd8dd8dd
MT
273 }
274 if (rc == 2)
275 goto EXIT;
276
72d80898
MT
277 /* Calculate amount of memory in machine */
278 if ((handle = fopen("/proc/meminfo", "r")))
279 {
280 while (fgets(line, STRING_SIZE-1, handle)) {
281 if (sscanf (line, "MemTotal: %s kB", string)) {
282 memory = atoi(string) / 1024 ;
283 }
284 }
285 fclose(handle);
286 }
287
288 /* Partition, mkswp, mkfs.
289 * before partitioning, first determine the sizes of each
290 * partition. In order to do that we need to know the size of
291 * the disk.
292 */
293 /* Don't use mysystem here so we can redirect output */
6cf9e770 294 sprintf(commandstring, "/sbin/sfdisk -s /dev/%s > /tmp/disksize 2> /dev/null", harddrive);
72d80898
MT
295 system(commandstring);
296
297 /* Calculate amount of disk space */
d3fb18db
MT
298 if ((handle = fopen("/tmp/disksize", "r"))) {
299 fgets(line, STRING_SIZE-1, handle);
300 if (sscanf (line, "%s", string)) {
ffd4d196 301 disk = atoi(string) / 1024;
d3fb18db
MT
302 }
303 fclose(handle);
304 }
72d80898 305
ffd4d196 306 fprintf(flog, "Disksize = %ld, memory = %ld", disk, memory);
72d80898 307
ffd4d196 308 /* Calculating Swap-Size dependend of Ram Size */
841323bc 309 if (memory <= 256)
6380cbd1 310 swap_file = 128;
841323bc 311 else if (memory <= 1024 && memory > 256)
ddd1589d 312 swap_file = 256;
66294b69 313 else
ddd1589d 314 swap_file = memory / 4;
ffd4d196
CS
315
316 /* Calculating Root-Size dependend of Max Disk Space */
a5997a4c 317 if ( disk < 756 )
25943d3b
CS
318 root_partition = 200;
319 else if ( disk >= 756 && disk <= 3072 )
66294b69
MT
320 root_partition = 512;
321 else
322 root_partition = 2048;
323
ffd4d196
CS
324
325 /* Calculating the amount of free space */
326 boot_partition = 20; /* in MB */
327 system_partition = disk - ( root_partition + swap_file + boot_partition );
d3fb18db 328
66294b69
MT
329 fprintf(flog, ", boot = %ld, swap = %ld, mylog = %ld, root = %ld\n",
330 boot_partition, swap_file, system_partition, root_partition);
9cd0c7fd 331 rc = 0;
66294b69 332
9cd0c7fd 333 if ( (!unattended) && (((disk - (root_partition + swap_file + boot_partition)) < 256 ) && ((disk - (root_partition + boot_partition )) > 256)) ) {
a5997a4c 334 rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], ctr[TR_CONTINUE_NO_SWAP]);
9cd0c7fd
MT
335 if (rc == 1){
336 swap_file = 0;
a5997a4c 337 system_partition = disk - ( root_partition + swap_file + boot_partition );
9cd0c7fd 338 fprintf(flog, "Changing Swap Size to 0 MB.\n");
a5997a4c 339 }
9cd0c7fd 340 else if (rc == 2){
a5997a4c
MT
341 fprintf(flog, "Disk is too small.\n");
342 errorbox(ctr[TR_DISK_TOO_SMALL]);goto EXIT;
343 }
66294b69 344 }
58c7871a 345 else if (disk - (root_partition + swap_file + boot_partition) >= 256) {
66294b69
MT
346
347 }
348 else {
349 fprintf(flog, "Disk is too small.\n");
350 errorbox(ctr[TR_DISK_TOO_SMALL]);goto EXIT;
351 }
a5997a4c 352
72d80898
MT
353 handle = fopen("/tmp/partitiontable", "w");
354
72d80898 355 /* Make swapfile */
9cd0c7fd
MT
356 if (swap_file) {
357 fprintf(handle, ",%ld,L,*\n,%ld,S,\n,%ld,L,\n,,L,\n",
358 boot_partition, swap_file, root_partition);
359 } else {
360 fprintf(handle, ",%ld,L,*\n,0,0,\n,%ld,L,\n,,L,\n",
361 boot_partition, root_partition);
362 }
72d80898
MT
363
364 fclose(handle);
365
6cf9e770 366 snprintf(commandstring, STRING_SIZE, "/sbin/sfdisk -L -uM %s < /tmp/partitiontable", hdparams.devnode_disk);
72d80898
MT
367 if (runcommandwithstatus(commandstring, ctr[TR_PARTITIONING_DISK]))
368 {
369 errorbox(ctr[TR_UNABLE_TO_PARTITION]);
370 goto EXIT;
371 }
9a3d3d95 372
ddd1589d 373 if (fstype == EXT2) {
337726bf 374// mysystem("/sbin/modprobe ext2");
6cf9e770 375 sprintf(mkfscommand, "/sbin/mke2fs -T ext2");
cd8dd8dd
MT
376 } else if (fstype == REISERFS) {
377 mysystem("/sbin/modprobe reiserfs");
378 sprintf(mkfscommand, "/sbin/mkreiserfs -f");
379 } else if (fstype == EXT3) {
337726bf 380// mysystem("/sbin/modprobe ext3");
6cf9e770 381 sprintf(mkfscommand, "/sbin/mke2fs -T ext3");
c8d680dc 382 } else if (fstype == EXT4) {
337726bf 383// mysystem("/sbin/modprobe ext4");
c8d680dc 384 sprintf(mkfscommand, "/sbin/mke2fs -T ext4");
cd8dd8dd 385 }
72d80898 386
6cf9e770 387 snprintf(commandstring, STRING_SIZE, "/sbin/mke2fs -T ext2 -I 128 %s1", hdparams.devnode_part);
72d80898
MT
388 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_BOOT_FILESYSTEM]))
389 {
390 errorbox(ctr[TR_UNABLE_TO_MAKE_BOOT_FILESYSTEM]);
391 goto EXIT;
392 }
393
394 if (swap_file) {
1cdddb12 395 snprintf(commandstring, STRING_SIZE, "/sbin/mkswap %s2", hdparams.devnode_part);
72d80898
MT
396 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_SWAPSPACE]))
397 {
398 errorbox(ctr[TR_UNABLE_TO_MAKE_SWAPSPACE]);
399 goto EXIT;
400 }
401 }
402
cd8dd8dd 403 snprintf(commandstring, STRING_SIZE, "%s %s3", mkfscommand, hdparams.devnode_part);
72d80898
MT
404 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_ROOT_FILESYSTEM]))
405 {
406 errorbox(ctr[TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM]);
407 goto EXIT;
408 }
409
cd8dd8dd 410 snprintf(commandstring, STRING_SIZE, "%s %s4", mkfscommand, hdparams.devnode_part);
72d80898
MT
411 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_LOG_FILESYSTEM]))
412 {
cd8dd8dd 413 errorbox(ctr[TR_UNABLE_TO_MAKE_LOG_FILESYSTEM]);
72d80898 414 goto EXIT;
9607771a 415 }
72d80898 416
1cdddb12 417 snprintf(commandstring, STRING_SIZE, "/bin/mount %s3 /harddisk", hdparams.devnode_part);
72d80898
MT
418 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_ROOT_FILESYSTEM]))
419 {
420 errorbox(ctr[TR_UNABLE_TO_MOUNT_ROOT_FILESYSTEM]);
421 goto EXIT;
422 }
423
424 mkdir("/harddisk/boot", S_IRWXU|S_IRWXG|S_IRWXO);
425 mkdir("/harddisk/var", S_IRWXU|S_IRWXG|S_IRWXO);
426 mkdir("/harddisk/var/log", S_IRWXU|S_IRWXG|S_IRWXO);
427
1cdddb12 428 snprintf(commandstring, STRING_SIZE, "/bin/mount %s1 /harddisk/boot", hdparams.devnode_part);
72d80898
MT
429 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_BOOT_FILESYSTEM]))
430 {
431 errorbox(ctr[TR_UNABLE_TO_MOUNT_BOOT_FILESYSTEM]);
432 goto EXIT;
433 }
434 if (swap_file) {
1cdddb12 435 snprintf(commandstring, STRING_SIZE, "/sbin/swapon %s2", hdparams.devnode_part);
72d80898
MT
436 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_SWAP_PARTITION]))
437 {
438 errorbox(ctr[TR_UNABLE_TO_MOUNT_SWAP_PARTITION]);
439 goto EXIT;
440 }
441 }
1cdddb12 442 snprintf(commandstring, STRING_SIZE, "/bin/mount %s4 /harddisk/var", hdparams.devnode_part);
72d80898
MT
443 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_LOG_FILESYSTEM]))
444 {
445 errorbox(ctr[TR_UNABLE_TO_MOUNT_LOG_FILESYSTEM]);
446 goto EXIT;
9607771a 447 }
c78a77eb 448
03d956be 449 snprintf(commandstring, STRING_SIZE,
23ed79cb 450 "/bin/tar -C /harddisk -xvf /cdrom/" SNAME "-" VERSION ".tlz --lzma 2>/dev/null");
d6aaa55d 451
edd536b6
MT
452 if (runcommandwithprogress(60, 4, title, commandstring, INST_FILECOUNT,
453 ctr[TR_INSTALLING_FILES]))
d6aaa55d
MT
454 {
455 errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);
456 goto EXIT;
457 }
406f019f
MT
458
459 /* Save language und local settings */
460 write_lang_configs(shortlangname);
d6aaa55d 461
9607771a
MT
462 /* mount proc filesystem */
463 mysystem("mkdir /harddisk/proc");
ee78a5ef
MT
464 mysystem("/bin/mount --bind /proc /harddisk/proc");
465 mysystem("/bin/mount --bind /dev /harddisk/dev");
466 mysystem("/bin/mount --bind /sys /harddisk/sys");
9607771a 467
330345c2 468 /* Build cache lang file */
6cf9e770 469 snprintf(commandstring, STRING_SIZE, "/usr/sbin/chroot /harddisk /usr/bin/perl -e \"require '" CONFIG_ROOT "/lang.pl'; &Lang::BuildCacheLang\"");
330345c2
MT
470 if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_LANG_CACHE]))
471 {
472 errorbox(ctr[TR_UNABLE_TO_INSTALL_LANG_CACHE]);
473 goto EXIT;
474 }
475
476 /* Update /etc/fstab */
a9a26c5a
AF
477 snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#DEVICE1#UUID=$(/sbin/blkid %s1 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/etc/fstab", hdparams.devnode_part);
478 system(commandstring);
479 snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#DEVICE2#UUID=$(/sbin/blkid %s2 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/etc/fstab", hdparams.devnode_part);
480 system(commandstring);
481 snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#DEVICE3#UUID=$(/sbin/blkid %s3 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/etc/fstab", hdparams.devnode_part);
482 system(commandstring);
483 snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#DEVICE4#UUID=$(/sbin/blkid %s4 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/etc/fstab", hdparams.devnode_part);
484 system(commandstring);
485
ddd1589d
CS
486 if (fstype == EXT2) {
487 replace("/harddisk/etc/fstab", "FSTYPE", "ext2");
488 replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
cd8dd8dd
MT
489 } else if (fstype == REISERFS) {
490 replace("/harddisk/etc/fstab", "FSTYPE", "reiserfs");
d3fb18db 491 replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
cd8dd8dd
MT
492 } else if (fstype == EXT3) {
493 replace("/harddisk/etc/fstab", "FSTYPE", "ext3");
c8d680dc
AF
494 replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
495 } else if (fstype == EXT4) {
496 replace("/harddisk/etc/fstab", "FSTYPE", "ext4");
d3fb18db 497 replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
cd8dd8dd 498 }
73d9a908 499
a869b064
AF
500 replace("/harddisk/boot/grub/grub.conf", "KVER", KERNEL_VERSION);
501
a9a26c5a
AF
502 snprintf(commandstring, STRING_SIZE, "/bin/sed -i -e \"s#root=ROOT#root=UUID=$(/sbin/blkid %s3 -sUUID | /usr/bin/cut -d'\"' -f2)#g\" /harddisk/boot/grub/grub.conf", hdparams.devnode_part);
503 system(commandstring);
504
f4e27420 505 mysystem("ln -s grub.conf /harddisk/boot/grub/menu.lst");
fd0763dc 506
a9a26c5a 507 system("/bin/sed -e 's#/harddisk#/#g' -e 's#//#/#g' < /proc/mounts > /harddisk/etc/mtab");
edd536b6 508
423400cf
MT
509 /*
510 * Generate device.map to help grub finding the device to install itself on.
511 */
512 FILE *f = NULL;
513 if (f = fopen("/harddisk/boot/grub/device.map", "w")) {
9a3d3d95 514 fprintf(f, "(hd0) %s\n", hdparams.devnode_disk);
423400cf
MT
515 fclose(f);
516 }
517
edd536b6 518 snprintf(commandstring, STRING_SIZE,
6cf9e770 519 "/usr/sbin/chroot /harddisk /usr/sbin/grub-install --no-floppy %s", hdparams.devnode_disk);
edd536b6
MT
520 if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_GRUB])) {
521 errorbox(ctr[TR_UNABLE_TO_INSTALL_GRUB]);
522 goto EXIT;
523 }
5faa66cf
AF
524
525 /* Serial console ? */
526 if (serialconsole) {
527 /* grub */
528 replace("/harddisk/boot/grub/grub.conf", "splashimage", "#splashimage");
529 replace("/harddisk/boot/grub/grub.conf", "#serial", "serial");
530 replace("/harddisk/boot/grub/grub.conf", "#terminal", "terminal");
06f626f9 531 replace("/harddisk/boot/grub/grub.conf", " panic=10 ", " console=ttyS0,38400n8 panic=10 ");
5faa66cf
AF
532
533 /*inittab*/
534 replace("/harddisk/etc/inittab", "1:2345:respawn:", "#1:2345:respawn:");
535 replace("/harddisk/etc/inittab", "2:2345:respawn:", "#2:2345:respawn:");
536 replace("/harddisk/etc/inittab", "3:2345:respawn:", "#3:2345:respawn:");
537 replace("/harddisk/etc/inittab", "4:2345:respawn:", "#4:2345:respawn:");
538 replace("/harddisk/etc/inittab", "5:2345:respawn:", "#5:2345:respawn:");
539 replace("/harddisk/etc/inittab", "6:2345:respawn:", "#6:2345:respawn:");
540 replace("/harddisk/etc/inittab", "#7:2345:respawn:", "7:2345:respawn:");
541 }
542
dfa59dbd
AF
543 /* Set marker that the user has already accepted the gpl */
544 mysystem("/usr/bin/touch /harddisk/var/ipfire/main/gpl_accepted");
545
c25a0343 546 /* Copy restore file from cdrom */
7062cecd 547 if (unattended && (strlen(restore_file) > 0)) {
c25a0343 548 fprintf(flog, "unattended: Copy restore file\n");
dca095e1 549 snprintf(commandstring, STRING_SIZE,
c25a0343 550 "cp /cdrom/%s /harddisk/var/ipfire/backup", restore_file);
dca095e1 551 mysystem(commandstring);
c25a0343
DG
552 }
553
8de160ff 554 mysystem("umount /cdrom");
23ed79cb 555 snprintf(commandstring, STRING_SIZE, "/usr/bin/eject /dev/%s", sourcedrive);
3ef6c343 556 mysystem(commandstring);
22b9e405 557
73d9a908
MT
558 if (!unattended) {
559 sprintf(message, ctr[TR_CONGRATULATIONS_LONG],
3ad8835c 560 NAME, SNAME, NAME);
fac85ccd 561 newtWinMessage(ctr[TR_CONGRATULATIONS], ctr[TR_PRESS_OK_TO_REBOOT], message);
73d9a908 562 }
cd8dd8dd 563
22b9e405 564 allok = 1;
edd536b6 565
d6aaa55d 566EXIT:
10bc6f06 567 fprintf(flog, "Install program ended.\n");
d6aaa55d 568
10bc6f06 569 if (!(allok))
d6aaa55d 570 newtWinMessage(title, ctr[TR_OK], ctr[TR_PRESS_OK_TO_REBOOT]);
10bc6f06 571
d6aaa55d 572 freekeyvalues(ethernetkv);
d6aaa55d 573
10bc6f06 574 if (allok && !allok_fastexit)
d6aaa55d 575 {
ee78a5ef
MT
576 if (unattended) {
577 fprintf(flog, "Entering unattended setup\n");
578 if (unattended_setup(unattendedkv)) {
c78a77eb
MT
579 snprintf(commandstring, STRING_SIZE, "/bin/sleep 10");
580 runcommandwithstatus(commandstring, "Unattended installation finished, system will reboot");
ee78a5ef 581 } else {
c78a77eb
MT
582 errorbox("Unattended setup failed.");
583 goto EXIT;
c78a77eb 584 }
ee78a5ef 585 }
c78a77eb 586
ee78a5ef
MT
587 fflush(flog);
588 fclose(flog);
589 newtFinished();
590
40fff54d
AF
591 if (unattended) {
592 // Remove Setup autorun after boot
593 if (system("rm -f /harddisk/etc/rc.d/rcsysinit.d/S75firstsetup"))
594 printf("Unable to disable setup autorun.\n");
595 }
3a1019f6 596
ee78a5ef
MT
597 if (system("/bin/umount /harddisk/proc"))
598 printf("Unable to umount /harddisk/proc.\n");
5057b611
HS
599 } else {
600 fflush(flog);
601 fclose(flog);
602 newtFinished();
d6aaa55d 603 }
5057b611 604
d6aaa55d
MT
605 fcloseall();
606
3a1019f6 607 if (swap_file) {
1cdddb12 608 snprintf(commandstring, STRING_SIZE, "/bin/swapoff %s2", hdparams.devnode_part);
3a1019f6
MT
609 }
610
611 newtFinished();
612
942d7058
MT
613 system("/bin/umount /harddisk/proc >/dev/null 2>&1");
614 system("/bin/umount /harddisk/dev >/dev/null 2>&1");
615 system("/bin/umount /harddisk/sys >/dev/null 2>&1");
5057b611 616
942d7058
MT
617 system("/bin/umount /harddisk/var >/dev/null 2>&1");
618 system("/bin/umount /harddisk/boot >/dev/null 2>&1");
619 system("/bin/umount /harddisk >/dev/null 2>&1");
6cf9e770
AF
620
621 if (!(allok))
622 system("/etc/halt");
d6aaa55d
MT
623
624 return 0;
625}