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