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