Noch ein paar kleine Aenderungen wegen dem mkinitcpio...
[people/pmueller/ipfire-2.x.git] / src / install+setup / install / main.c
CommitLineData
d6aaa55d
MT
1/* SmoothWall install program.
2 *
3 * This program is distributed under the terms of the GNU General Public
4 * Licence. See the file COPYING for details.
5 *
6 * (c) Lawrence Manning, 2001
7 * Contains main entry point, and misc functions.
8 *
d6aaa55d 9 */
10bc6f06 10
d6aaa55d 11#include "install.h"
72d80898
MT
12#define _GNU_SOURCE
13
d6aaa55d
MT
14#define CDROM_INSTALL 0
15#define URL_INSTALL 1
72d80898 16#define DISK_INSTALL 2
9833e7d8 17#define INST_FILECOUNT 7000
33634aa8 18#define UNATTENDED_CONF "/cdrom/boot/unattended.conf"
d6aaa55d
MT
19
20int raid_disk = 0;
21FILE *flog = NULL;
22char *mylog;
10bc6f06 23
d6aaa55d
MT
24char **ctr;
25
d6aaa55d
MT
26extern char url[STRING_SIZE];
27
5057b611
HS
28struct nic nics[20] = { { "" , "" } }; // only defined for compile
29struct knic knics[20] = { { "" , "" , "" } }; // only defined for compile
30
10bc6f06 31extern char *en_tr[];
10bc6f06 32extern char *de_tr[];
d6aaa55d 33
72d80898
MT
34int detect_smp() {
35 FILE *fd = NULL;
36 char line[STRING_SIZE];
37 int cpu_count = 0;
38
39 if ((fd = fopen("/proc/cpuinfo", "r")) == NULL) {
40 return 0;
41 }
42 while (fgets(line, STRING_SIZE, fd) != NULL) {
43 if (strstr(line, "processor") == line) {
44 cpu_count++;
45 }
46 }
47 (void)fclose(fd);
48 return (cpu_count > 1);
49}
50
72d80898
MT
51long calc_swapsize(long memory, long disk) {
52 if (memory < 128) {
53 return 256;
54 }
55 if (memory > 1024) {
56 return 512;
57 }
58
59 return memory*2;
60}
61
d6aaa55d
MT
62int main(int argc, char *argv[])
63{
b4e3cd7f
HS
64 char *langnames[] = { "Deutsch", "English", NULL };
65 char *shortlangnames[] = { "de", "en", NULL };
66 char **langtrs[] = { de_tr, en_tr, NULL };
c78a77eb 67 char hdletter;
72d80898
MT
68 char harddrive[5], sourcedrive[5]; /* Device holder. */
69 struct devparams hdparams, cdromparams; /* Params for CDROM and HD */
70 int cdmounted = 0; /* Loop flag for inserting a cd. */
71 int rc = 0;
d6aaa55d 72 char commandstring[STRING_SIZE];
aa2870e6 73 char *installtypes[] = { "CDROM/USB", "HTTP/FTP", NULL };
72d80898 74 int installtype = CDROM_INSTALL;
d6aaa55d 75 int choice;
ee78a5ef
MT
76 int i;
77 int found = 0;
78 int firstrun = 0;
d6aaa55d
MT
79 char shortlangname[10];
80 char message[1000];
81 char title[STRING_SIZE];
82 int allok = 0;
10bc6f06 83 int allok_fastexit=0;
d6aaa55d
MT
84 struct keyvalue *ethernetkv = initkeyvalues();
85 FILE *handle, *cmdfile;
86 char line[STRING_SIZE];
87 char string[STRING_SIZE];
72d80898
MT
88 long maximum_free = 0, current_free;
89 long memory = 0;
8e2e5cf3 90 long system_partition, boot_partition, root_partition, swap_file;
d6aaa55d 91 int scsi_disk = 0;
5057b611
HS
92 char *yesnoharddisk[3]; // char *yesnoharddisk = { "NO", "YES", NULL };
93
72d80898
MT
94 int unattended = 0;
95 struct keyvalue *unattendedkv = initkeyvalues();
c78a77eb 96 int hardyn = 0;
d6aaa55d
MT
97
98 setlocale (LC_ALL, "");
10bc6f06 99 sethostname( SNAME , 10);
72d80898 100
d6aaa55d
MT
101 memset(&hdparams, 0, sizeof(struct devparams));
102 memset(&cdromparams, 0, sizeof(struct devparams));
103
104 /* Log file/terminal stuff. */
105 if (argc >= 2)
106 {
107 if (!(flog = fopen(argv[1], "w+")))
108 return 0;
109 }
110 else
111 return 0;
112
113 mylog = argv[1];
114
115 fprintf(flog, "Install program started.\n");
116
117 newtInit();
118 newtCls();
119
120 /* Do usb detection first for usb keyboard */
121 if (! (cmdfile = fopen("/proc/cmdline", "r")))
122 {
123 fprintf(flog, "Couldn't open commandline: /proc/cmdline\n");
124 } else {
125 fgets(line, STRING_SIZE, cmdfile);
ee78a5ef
MT
126 if (strstr (line, "noide") == NULL) {
127 fprintf(flog, "Initializing IDE controllers.\n");
128 initialize_ide();
129 } else {
130 fprintf(flog, "Skipping IDE detection.\n");
131 }
d6aaa55d
MT
132 if (strstr (line, "nousb") == NULL) {
133 fprintf(flog, "Initializing USB controllers.\n");
134 initialize_usb();
135 } else {
136 fprintf(flog, "Skipping USB detection.\n");
137 }
72d80898 138 // check if we have to make an unattended install
ee78a5ef 139 if (strstr (line, "unattended") != NULL) {
72d80898
MT
140 unattended = 1;
141 }
ee78a5ef
MT
142 // Loading the cdrom-filesystem
143 mysystem("/sbin/modprobe iso9660");
d6aaa55d 144 }
72d80898 145
72d80898 146 if (unattended) {
33634aa8 147 runcommandwithstatus("/bin/sleep 10", "WARNING: Unattended installation will start in 10 seconds...");
72d80898 148 }
d6aaa55d 149
72d80898 150 /* German is the default */
d6aaa55d
MT
151 for (choice = 0; langnames[choice]; choice++)
152 {
b4e3cd7f 153 if (strcmp(langnames[choice], "Deutsch") == 0)
d6aaa55d
MT
154 break;
155 }
156 if (!langnames[choice])
157 goto EXIT;
158
72d80898
MT
159 if (!unattended) {
160 rc = newtWinMenu("Language selection",
161 "Select the language you wish to use for the " NAME ".", 50, 5, 5, 8,
162 langnames, &choice, "Ok", NULL);
163 }
164
d6aaa55d
MT
165 ctr = langtrs[choice];
166 strcpy(shortlangname, shortlangnames[choice]);
406f019f 167 fprintf(flog, "Selected language: %s\n", shortlangname);
3d6e1202 168
33634aa8 169 newtDrawRootText(14, 0, NAME " " VERSION " - " SLOGAN );
d6aaa55d 170 newtPushHelpLine(ctr[TR_HELPLINE]);
4809e64e 171 sprintf (title, "%s %s - %s", NAME, VERSION, SLOGAN);
d6aaa55d 172
72d80898
MT
173 if (!unattended) {
174 sprintf(message, ctr[TR_WELCOME], NAME);
72d80898
MT
175 newtWinMessage(title, ctr[TR_OK], message);
176
177 sprintf(message, ctr[TR_SELECT_INSTALLATION_MEDIA_LONG], NAME);
178 rc = newtWinMenu(ctr[TR_SELECT_INSTALLATION_MEDIA], message,
179 50, 5, 5, 6, installtypes, &installtype, ctr[TR_OK],
180 ctr[TR_CANCEL], NULL);
330345c2 181 } else {
72d80898
MT
182 rc = 1;
183 installtype = CDROM_INSTALL;
184 }
185
186 if (rc == 2)
187 goto EXIT;
188
189 // Starting hardware detection
190 runcommandwithstatus("/bin/probehw.sh", ctr[TR_PROBING_HARDWARE]);
59de0b00 191 runcommandwithstatus("/bin/probenic.sh install", ctr[TR_PROBING_HARDWARE]);
72d80898 192
9607771a
MT
193 /* CDROM INSTALL */
194 if (installtype == CDROM_INSTALL) {
9607771a
MT
195 switch (mysystem("/bin/mountsource.sh")) {
196 case 0:
197 installtype = CDROM_INSTALL;
198 cdmounted = 1;
199 break;
200 case 1:
201 installtype = DISK_INSTALL;
202 break;
203 case 10:
204 errorbox(ctr[TR_NO_CDROM]);
205 goto EXIT;
206 }
207
208 /* read source drive letter */
0b59f25c 209 if ((handle = fopen("/tmp/source_device", "r")) == NULL) {
33634aa8
MT
210 errorbox(ctr[TR_ERROR_PROBING_CDROM]);
211 goto EXIT;
9607771a
MT
212 }
213 fgets(sourcedrive, 5, handle);
214 fprintf(flog, "Source drive: %s\n", sourcedrive);
215 fclose(handle);
72d80898 216 }
9607771a
MT
217
218 /* Configure the network now! */
219 if (installtype == URL_INSTALL) {
220 /* Network driver and params. */
221 if (!(networkmenu(ethernetkv))) {
222 errorbox(ctr[TR_NETWORK_SETUP_FAILED]);
223 goto EXIT;
224 }
225
330345c2 226 /* Check for ipfire-<VERSION>.tbz2 */
9607771a
MT
227 if (checktarball(SNAME "-" VERSION ".tbz2", ctr[TR_ENTER_URL])) {
228 errorbox(ctr[TR_NO_IPCOP_TARBALL_FOUND]);
229 goto EXIT;
230 }
72d80898 231 }
1cdddb12 232
ee78a5ef
MT
233 i = 0;
234 while (found == 0) {
235 i++;
236 fprintf(flog, "Harddisk scan pass %i\n", i);
237
aee3027d 238 switch (mysystem("/bin/mountdest.sh") % 255) {
ee78a5ef
MT
239 case 0: // Found IDE disk
240 scsi_disk = 0;
241 found = 1;
242 break;
243 case 1: // Found SCSI disk
244 scsi_disk = 1;
245 found = 1;
246 break;
247 case 10: // No harddisk found
248 if (firstrun == 1) {
249 errorbox(ctr[TR_NO_HARDDISK]);
250 goto EXIT;
251 }
252 // Do this if the kudzu-scan fails...
253 runcommandwithstatus("/bin/probehw.sh deep-scan", ctr[TR_PROBING_HARDWARE]);
254 firstrun = 1;
aee3027d 255 }
ee78a5ef
MT
256 }
257
258 /*
259 // Need to clean this up at some point
260 // scsi disk is sdb/sdc when sda/sdb is used for usb-key
261 // if scsi-disk is sdd or more, it is not discovered
262 // Support only 2 usb keys, none could be unplugged
1cdddb12
MT
263 if (checkusb("sdb") && try_scsi("sdc")) {
264 scsi_disk = 1;
265 sprintf(harddrive, "sdc");
266 goto FOUND_DESTINATION;
267 }
268 if (checkusb("sda") && try_scsi("sdb")) {
269 scsi_disk = 1;
270 sprintf(harddrive, "sdb");
271 goto FOUND_DESTINATION;
272 }
273 if (try_scsi("sda")) {
274 scsi_disk = 1;
275 sprintf(harddrive, "sda");
276 goto FOUND_DESTINATION;
277 }
278 if (try_scsi("ida/c0d0")) {
279 raid_disk = 1;
280 sprintf(harddrive, "ida/c0d0");
281 goto FOUND_DESTINATION;
282 }
283 if (try_scsi("cciss/c0d0")) {
284 raid_disk = 1;
285 sprintf(harddrive, "cciss/c0d0");
286 goto FOUND_DESTINATION;
287 }
288 if (try_scsi("rd/c0d0")) {
289 raid_disk = 1;
290 sprintf(harddrive, "rd/c0d0");
291 goto FOUND_DESTINATION;
292 }
293 if (try_scsi("ataraid/d0")) {
294 raid_disk = 1;
295 sprintf(harddrive, "ataraid/d0");
296 goto FOUND_DESTINATION;
ee78a5ef 297 } */
1cdddb12
MT
298
299 FOUND_DESTINATION:
ee78a5ef
MT
300 if ((handle = fopen("/tmp/dest_device", "r")) == NULL) {
301 errorbox(ctr[TR_NO_HARDDISK]);
302 goto EXIT;
303 }
304 fgets(harddrive, 5, handle);
305 fclose(handle);
306
72d80898
MT
307 /* load unattended configuration */
308 if (unattended) {
309 fprintf(flog, "unattended: Reading unattended.conf\n");
310
311 (void) readkeyvalues(unattendedkv, UNATTENDED_CONF);
312 }
72d80898 313
1cdddb12
MT
314 /* Make the hdparms struct and print the contents.
315 With USB-KEY install and SCSI disk, while installing, the disk
316 is named 'sdb,sdc,...' (following keys)
317 On reboot, it will become 'sda'
318 To avoid many test, all names are built in the struct.
319 */
320 sprintf(hdparams.devnode_disk, "/dev/%s", harddrive);
321 /* Address the partition or raid partition (eg dev/sda or /dev/sdap1 */
322 sprintf(hdparams.devnode_part, "/dev/%s%s", harddrive,raid_disk ? "p" : "");
323 /* Now the names after the machine is booted. Only scsi is affected
324 and we only install on the first scsi disk. */
325 { char tmp[30];
326 strcpy(tmp, scsi_disk ? "sda" : harddrive);
327 sprintf(hdparams.devnode_disk_run, "/dev/%s", tmp);
328 sprintf(hdparams.devnode_part_run, "/dev/%s%s", tmp, raid_disk ? "p" : "");
329 }
330
331 fprintf(flog, "Destination drive: %s\n", hdparams.devnode_disk);
332
333 sprintf(message, ctr[TR_PREPARE_HARDDISK], hdparams.devnode_disk);
72d80898
MT
334 if (unattended) {
335 hardyn = 1;
336 }
5057b611
HS
337
338 yesnoharddisk[0] = ctr[TR_NO];
339 yesnoharddisk[1] = ctr[TR_YES];
340 yesnoharddisk[2] = NULL;
341
72d80898
MT
342 while (! hardyn) {
343 rc = newtWinMenu(title, message,
344 50, 5, 5, 6, yesnoharddisk,
345 &hardyn, ctr[TR_OK],
346 ctr[TR_CANCEL], NULL);
347 if (rc == 2)
348 goto EXIT;
349 }
5433e2c9
MT
350 if (rc == 2)
351 goto EXIT;
72d80898
MT
352
353 /* Calculate amount of memory in machine */
354 if ((handle = fopen("/proc/meminfo", "r")))
355 {
356 while (fgets(line, STRING_SIZE-1, handle)) {
357 if (sscanf (line, "MemTotal: %s kB", string)) {
358 memory = atoi(string) / 1024 ;
359 }
360 }
361 fclose(handle);
362 }
363
364 /* Partition, mkswp, mkfs.
365 * before partitioning, first determine the sizes of each
366 * partition. In order to do that we need to know the size of
367 * the disk.
368 */
369 /* Don't use mysystem here so we can redirect output */
0b59f25c 370 sprintf(commandstring, "/bin/sfdisk -s /dev/%s > /tmp/disksize 2> /dev/null", harddrive);
72d80898
MT
371 system(commandstring);
372
373 /* Calculate amount of disk space */
0b59f25c 374 if ((handle = fopen("/tmp/disksize", "r")))
72d80898
MT
375 {
376 fgets(line, STRING_SIZE-1, handle);
377 if (sscanf (line, "%s", string)) {
378 maximum_free = atoi(string) / 1024;
379 }
380 fclose(handle);
381 }
382
383 fprintf(flog, "maximum_free = %ld, memory = %ld",
384 maximum_free, memory);
385
386 swap_file = calc_swapsize(memory, maximum_free);
387
388 if (maximum_free < 512 + swap_file ) {
389 if (maximum_free < 512) {
390 errorbox(ctr[TR_DISK_TOO_SMALL]);
391 goto EXIT;
392 }
393
394 if (!unattended) {
395 rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], ctr[TR_CONTINUE_NO_SWAP]);
396 }
397 else {
398 rc = 1;
399 }
400
401 if (rc != 1)
402 goto EXIT;
403 swap_file = 0;
404 }
405
8e2e5cf3 406 boot_partition = 20; /* in MB */
72d80898
MT
407 current_free = maximum_free - boot_partition - swap_file;
408
8e2e5cf3
MT
409 root_partition = 2048 ;
410 if (current_free < 512) {
72d80898
MT
411 errorbox(ctr[TR_DISK_TOO_SMALL]);
412 goto EXIT;
413 }
414
415 current_free = current_free - root_partition;
416 if (!swap_file) {
417 root_partition = root_partition + swap_file;
418 }
419
8e2e5cf3 420 system_partition = current_free;
72d80898
MT
421
422 fprintf(flog, "boot = %ld, swap = %ld, mylog = %ld, root = %ld\n",
8e2e5cf3 423 boot_partition, swap_file, system_partition, root_partition);
72d80898
MT
424
425 handle = fopen("/tmp/partitiontable", "w");
426
72d80898
MT
427 /* Make swapfile */
428 if (swap_file) {
9607771a 429 fprintf(handle, ",%ld,L,*\n,%ld,S,\n,%ld,L,\n,,L,\n",
72d80898
MT
430 boot_partition, swap_file, root_partition);
431 } else {
9607771a 432 fprintf(handle, ",%ld,L,*\n,0,0,\n,%ld,L,\n,,L,\n",
72d80898
MT
433 boot_partition, root_partition);
434 }
435
436 fclose(handle);
437
1cdddb12 438 snprintf(commandstring, STRING_SIZE, "/bin/sfdisk -L -uM %s < /tmp/partitiontable", hdparams.devnode_disk);
72d80898
MT
439 if (runcommandwithstatus(commandstring, ctr[TR_PARTITIONING_DISK]))
440 {
441 errorbox(ctr[TR_UNABLE_TO_PARTITION]);
442 goto EXIT;
443 }
444
532a3663 445 mysystem("/sbin/udevstart");
72d80898 446
1cdddb12 447 snprintf(commandstring, STRING_SIZE, "/bin/mke2fs -T ext2 -c %s1", hdparams.devnode_part);
72d80898
MT
448 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_BOOT_FILESYSTEM]))
449 {
450 errorbox(ctr[TR_UNABLE_TO_MAKE_BOOT_FILESYSTEM]);
451 goto EXIT;
452 }
453
454 if (swap_file) {
1cdddb12 455 snprintf(commandstring, STRING_SIZE, "/sbin/mkswap %s2", hdparams.devnode_part);
72d80898
MT
456 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_SWAPSPACE]))
457 {
458 errorbox(ctr[TR_UNABLE_TO_MAKE_SWAPSPACE]);
459 goto EXIT;
460 }
461 }
462
1cdddb12 463 snprintf(commandstring, STRING_SIZE, "/sbin/mkreiserfs -f %s3", hdparams.devnode_part);
72d80898
MT
464 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_ROOT_FILESYSTEM]))
465 {
466 errorbox(ctr[TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM]);
467 goto EXIT;
468 }
469
1cdddb12 470 snprintf(commandstring, STRING_SIZE, "/sbin/mkreiserfs -f %s4", hdparams.devnode_part);
72d80898
MT
471 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_LOG_FILESYSTEM]))
472 {
473 errorbox(ctr[TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM]);
474 goto EXIT;
9607771a 475 }
72d80898
MT
476
477 /* Mount harddisk. */
ee78a5ef 478 mysystem("/sbin/modprobe reiserfs"); // to be banished...
1cdddb12
MT
479
480 snprintf(commandstring, STRING_SIZE, "/bin/mount %s3 /harddisk", hdparams.devnode_part);
72d80898
MT
481 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_ROOT_FILESYSTEM]))
482 {
483 errorbox(ctr[TR_UNABLE_TO_MOUNT_ROOT_FILESYSTEM]);
484 goto EXIT;
485 }
486
487 mkdir("/harddisk/boot", S_IRWXU|S_IRWXG|S_IRWXO);
488 mkdir("/harddisk/var", S_IRWXU|S_IRWXG|S_IRWXO);
489 mkdir("/harddisk/var/log", S_IRWXU|S_IRWXG|S_IRWXO);
490
1cdddb12 491 snprintf(commandstring, STRING_SIZE, "/bin/mount %s1 /harddisk/boot", hdparams.devnode_part);
72d80898
MT
492 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_BOOT_FILESYSTEM]))
493 {
494 errorbox(ctr[TR_UNABLE_TO_MOUNT_BOOT_FILESYSTEM]);
495 goto EXIT;
496 }
497 if (swap_file) {
1cdddb12 498 snprintf(commandstring, STRING_SIZE, "/sbin/swapon %s2", hdparams.devnode_part);
72d80898
MT
499 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_SWAP_PARTITION]))
500 {
501 errorbox(ctr[TR_UNABLE_TO_MOUNT_SWAP_PARTITION]);
502 goto EXIT;
503 }
504 }
1cdddb12 505 snprintf(commandstring, STRING_SIZE, "/bin/mount %s4 /harddisk/var", hdparams.devnode_part);
72d80898
MT
506 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_LOG_FILESYSTEM]))
507 {
508 errorbox(ctr[TR_UNABLE_TO_MOUNT_LOG_FILESYSTEM]);
509 goto EXIT;
9607771a 510 }
c78a77eb
MT
511
512 if (installtype == URL_INSTALL) {
513 snprintf(commandstring, STRING_SIZE,
514 "/bin/wget -q -O - %s/" SNAME "-" VERSION ".tbz2 | /bin/tar -C /harddisk -xvjf -", url);
515 }
516
1cdddb12 517 if (installtype == CDROM_INSTALL) {
c78a77eb
MT
518 snprintf(commandstring, STRING_SIZE,
519 "/bin/tar -C /harddisk -xvjf /cdrom/" SNAME "-" VERSION ".tbz2");
520 }
d6aaa55d 521
edd536b6
MT
522 if (runcommandwithprogress(60, 4, title, commandstring, INST_FILECOUNT,
523 ctr[TR_INSTALLING_FILES]))
d6aaa55d
MT
524 {
525 errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);
526 goto EXIT;
527 }
e57bc1fd 528
d6aaa55d
MT
529 /* Save USB controller type to modules.conf */
530 write_usb_modules_conf();
406f019f
MT
531
532 /* Save language und local settings */
533 write_lang_configs(shortlangname);
d6aaa55d
MT
534
535 /* touch the modules.dep files */
10bc6f06 536 snprintf(commandstring, STRING_SIZE,
c78a77eb 537 "/bin/touch /harddisk/lib/modules/%s-ipfire/modules.dep",
10bc6f06
MT
538 KERNEL_VERSION);
539 mysystem(commandstring);
10bc6f06 540 snprintf(commandstring, STRING_SIZE,
c78a77eb 541 "/bin/touch /harddisk/lib/modules/%s-ipfire-smp/modules.dep",
10bc6f06
MT
542 KERNEL_VERSION);
543 mysystem(commandstring);
d6aaa55d
MT
544
545 /* Rename uname */
546 rename ("/harddisk/bin/uname.bak", "/harddisk/bin/uname");
547
9607771a
MT
548 /* mount proc filesystem */
549 mysystem("mkdir /harddisk/proc");
ee78a5ef
MT
550 mysystem("/bin/mount --bind /proc /harddisk/proc");
551 mysystem("/bin/mount --bind /dev /harddisk/dev");
552 mysystem("/bin/mount --bind /sys /harddisk/sys");
9607771a 553
330345c2
MT
554 /* Build cache lang file */
555 snprintf(commandstring, STRING_SIZE, "/sbin/chroot /harddisk /usr/bin/perl -e \"require '" CONFIG_ROOT "/lang.pl'; &Lang::BuildCacheLang\"");
556 if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_LANG_CACHE]))
557 {
558 errorbox(ctr[TR_UNABLE_TO_INSTALL_LANG_CACHE]);
559 goto EXIT;
560 }
561
562 /* Update /etc/fstab */
1cdddb12 563 replace("/harddisk/etc/fstab", "DEVICE", hdparams.devnode_part_run);
73d9a908 564
ee78a5ef
MT
565 /* Going to make our initrd... */
566 snprintf(commandstring, STRING_SIZE, "/sbin/chroot /harddisk /sbin/mkinitcpio -v -g /boot/ipfirerd.img -k %s-ipfire", KERNEL_VERSION);
567 runcommandwithstatus(commandstring, ctr[TR_BUILDING_INITRD]);
aee3027d 568 snprintf(commandstring, STRING_SIZE, "/sbin/chroot /harddisk /sbin/mkinitcpio -v -g /boot/ipfirerd-smp.img -k %s-ipfire-smp", KERNEL_VERSION);
ee78a5ef 569 runcommandwithstatus(commandstring, ctr[TR_BUILDING_INITRD]);
edd536b6 570
1cdddb12 571 sprintf(string, "root=%s3", hdparams.devnode_part_run);
edd536b6 572 replace( "/harddisk/boot/grub/grub.conf", "root=ROOT", string);
1cdddb12 573 replace( "/harddisk/boot/grub/grubbatch", "DEVICE", hdparams.devnode_disk);
fd0763dc 574
edd536b6
MT
575 /* restore permissions */
576 chmod("/harddisk/boot/grub/grubbatch", S_IXUSR | S_IRUSR | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH);
577
edd536b6 578 snprintf(commandstring, STRING_SIZE,
532a3663 579 "/sbin/chroot /harddisk /boot/grub/grubbatch");
edd536b6
MT
580 if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_GRUB])) {
581 errorbox(ctr[TR_UNABLE_TO_INSTALL_GRUB]);
582 goto EXIT;
583 }
584
22b9e405 585 /* Install bootsplash */
ee78a5ef 586 // mysystem("/bin/installbootsplash.sh"); We cannot use this at the moment, it conflicts with our initrds...
22b9e405
MT
587
588 mysystem("ln -s grub.conf /harddisk/boot/grub/menu.lst");
22b9e405 589
73d9a908
MT
590 if (!unattended) {
591 sprintf(message, ctr[TR_CONGRATULATIONS_LONG],
3ad8835c 592 NAME, SNAME, NAME);
73d9a908
MT
593 newtWinMessage(ctr[TR_CONGRATULATIONS], ctr[TR_OK], message);
594 }
22b9e405
MT
595
596 allok = 1;
edd536b6 597
d6aaa55d 598EXIT:
10bc6f06 599 fprintf(flog, "Install program ended.\n");
d6aaa55d 600
10bc6f06 601 if (!(allok))
d6aaa55d 602 newtWinMessage(title, ctr[TR_OK], ctr[TR_PRESS_OK_TO_REBOOT]);
10bc6f06 603
d6aaa55d 604 freekeyvalues(ethernetkv);
d6aaa55d 605
10bc6f06 606 if (allok && !allok_fastexit)
d6aaa55d 607 {
ee78a5ef
MT
608 if (unattended) {
609 fprintf(flog, "Entering unattended setup\n");
610 if (unattended_setup(unattendedkv)) {
c78a77eb
MT
611 snprintf(commandstring, STRING_SIZE, "/bin/sleep 10");
612 runcommandwithstatus(commandstring, "Unattended installation finished, system will reboot");
ee78a5ef 613 } else {
c78a77eb
MT
614 errorbox("Unattended setup failed.");
615 goto EXIT;
c78a77eb 616 }
ee78a5ef 617 }
c78a77eb 618
ee78a5ef
MT
619 fflush(flog);
620 fclose(flog);
621 newtFinished();
622
623 if (!unattended) {
624 // Copy our scanned nics to the disk and lock because scan doesn't work in chroot
625 system("touch /harddisk/var/ipfire/ethernet/scan_lock");
626 system("cp -f /tmp/scanned_nics /harddisk/var/ipfire/ethernet/scanned_nics");
627 if (system("/sbin/chroot /harddisk /usr/local/sbin/setup /dev/tty2 INSTALL"))
628 printf("Unable to run setup.\n");
629 system("rm -f /harddisk/var/ipfire/ethernet/scan_lock");
630 }
3a1019f6 631
ee78a5ef
MT
632 if (system("/bin/umount /harddisk/proc"))
633 printf("Unable to umount /harddisk/proc.\n");
5057b611
HS
634 } else {
635 fflush(flog);
636 fclose(flog);
637 newtFinished();
d6aaa55d 638 }
5057b611 639
d6aaa55d
MT
640 fcloseall();
641
3a1019f6 642 if (swap_file) {
1cdddb12 643 snprintf(commandstring, STRING_SIZE, "/bin/swapoff %s2", hdparams.devnode_part);
3a1019f6
MT
644 }
645
646 newtFinished();
647
5057b611
HS
648 system("/bin/umount /harddisk/proc");
649 system("/bin/umount /harddisk/dev");
ee78a5ef 650 system("/bin/umount /harddisk/sys");
5057b611 651
532a3663
MT
652 system("/bin/umount /harddisk/var");
653 system("/bin/umount /harddisk/boot");
654 system("/bin/umount /harddisk");
10bc6f06 655
d6aaa55d
MT
656 system("/etc/halt");
657
658 return 0;
659}