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