Swap-Abfrage gefixt.
[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];
66294b69 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 354 /* Calculating Swap-Size dependend of Ram Size */
66294b69
MT
355 if (memory < 128)
356 swap_file = 32;
58c7871a 357 else if (memory >= 1024)
66294b69
MT
358 swap_file = 512;
359 else
360 swap_file = memory;
ffd4d196
CS
361
362 /* Calculating Root-Size dependend of Max Disk Space */
a5997a4c 363 if ( disk < 756 )
66294b69 364 root_partition = 256;
58c7871a 365 else if ( disk >= 1024 && disk <= 3072 )
66294b69
MT
366 root_partition = 512;
367 else
368 root_partition = 2048;
369
ffd4d196
CS
370
371 /* Calculating the amount of free space */
372 boot_partition = 20; /* in MB */
373 system_partition = disk - ( root_partition + swap_file + boot_partition );
d3fb18db 374
66294b69
MT
375 fprintf(flog, ", boot = %ld, swap = %ld, mylog = %ld, root = %ld\n",
376 boot_partition, swap_file, system_partition, root_partition);
377
a5997a4c
MT
378 if ( (!unattended) && (((disk - (root_partition + swap_file + boot_partition)) < 256 ) && ((disk - (root_partition + boot_partition + 32 )) > 256)) ) {
379 rc = newtWinChoice(title, ctr[TR_OK], ctr[TR_CANCEL], ctr[TR_CONTINUE_NO_SWAP]);
380 if (rc != 0){
381 swap_file = 32;
382 system_partition = disk - ( root_partition + swap_file + boot_partition );
383 fprintf(flog, "Changing Swap Size to 32 MB.\n");
384 }
385 else {
386 fprintf(flog, "Disk is too small.\n");
387 errorbox(ctr[TR_DISK_TOO_SMALL]);goto EXIT;
388 }
66294b69 389 }
58c7871a 390 else if (disk - (root_partition + swap_file + boot_partition) >= 256) {
66294b69
MT
391
392 }
393 else {
394 fprintf(flog, "Disk is too small.\n");
395 errorbox(ctr[TR_DISK_TOO_SMALL]);goto EXIT;
396 }
a5997a4c 397
72d80898
MT
398 handle = fopen("/tmp/partitiontable", "w");
399
72d80898
MT
400 /* Make swapfile */
401 if (swap_file) {
9607771a 402 fprintf(handle, ",%ld,L,*\n,%ld,S,\n,%ld,L,\n,,L,\n",
72d80898
MT
403 boot_partition, swap_file, root_partition);
404 } else {
9607771a 405 fprintf(handle, ",%ld,L,*\n,0,0,\n,%ld,L,\n,,L,\n",
72d80898
MT
406 boot_partition, root_partition);
407 }
408
409 fclose(handle);
410
1cdddb12 411 snprintf(commandstring, STRING_SIZE, "/bin/sfdisk -L -uM %s < /tmp/partitiontable", hdparams.devnode_disk);
72d80898
MT
412 if (runcommandwithstatus(commandstring, ctr[TR_PARTITIONING_DISK]))
413 {
414 errorbox(ctr[TR_UNABLE_TO_PARTITION]);
415 goto EXIT;
416 }
cd8dd8dd
MT
417
418 if (fstype == REISER4) {
419 mysystem("/sbin/modprobe reiser4");
420 sprintf(mkfscommand, "/sbin/mkfs.reiser4 -y");
421 } else if (fstype == REISERFS) {
422 mysystem("/sbin/modprobe reiserfs");
423 sprintf(mkfscommand, "/sbin/mkreiserfs -f");
424 } else if (fstype == EXT3) {
425 mysystem("/sbin/modprobe ext3");
6027d6b8 426 sprintf(mkfscommand, "/sbin/mke2fs -T ext3 -c");
cd8dd8dd 427 }
72d80898 428
6027d6b8 429 snprintf(commandstring, STRING_SIZE, "/sbin/mke2fs -T ext2 -c %s1", hdparams.devnode_part);
72d80898
MT
430 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_BOOT_FILESYSTEM]))
431 {
432 errorbox(ctr[TR_UNABLE_TO_MAKE_BOOT_FILESYSTEM]);
433 goto EXIT;
434 }
435
436 if (swap_file) {
1cdddb12 437 snprintf(commandstring, STRING_SIZE, "/sbin/mkswap %s2", hdparams.devnode_part);
72d80898
MT
438 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_SWAPSPACE]))
439 {
440 errorbox(ctr[TR_UNABLE_TO_MAKE_SWAPSPACE]);
441 goto EXIT;
442 }
443 }
444
cd8dd8dd 445 snprintf(commandstring, STRING_SIZE, "%s %s3", mkfscommand, hdparams.devnode_part);
72d80898
MT
446 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_ROOT_FILESYSTEM]))
447 {
448 errorbox(ctr[TR_UNABLE_TO_MAKE_ROOT_FILESYSTEM]);
449 goto EXIT;
450 }
451
cd8dd8dd 452 snprintf(commandstring, STRING_SIZE, "%s %s4", mkfscommand, hdparams.devnode_part);
72d80898
MT
453 if (runcommandwithstatus(commandstring, ctr[TR_MAKING_LOG_FILESYSTEM]))
454 {
cd8dd8dd 455 errorbox(ctr[TR_UNABLE_TO_MAKE_LOG_FILESYSTEM]);
72d80898 456 goto EXIT;
9607771a 457 }
72d80898 458
1cdddb12 459 snprintf(commandstring, STRING_SIZE, "/bin/mount %s3 /harddisk", hdparams.devnode_part);
72d80898
MT
460 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_ROOT_FILESYSTEM]))
461 {
462 errorbox(ctr[TR_UNABLE_TO_MOUNT_ROOT_FILESYSTEM]);
463 goto EXIT;
464 }
465
466 mkdir("/harddisk/boot", S_IRWXU|S_IRWXG|S_IRWXO);
467 mkdir("/harddisk/var", S_IRWXU|S_IRWXG|S_IRWXO);
468 mkdir("/harddisk/var/log", S_IRWXU|S_IRWXG|S_IRWXO);
469
1cdddb12 470 snprintf(commandstring, STRING_SIZE, "/bin/mount %s1 /harddisk/boot", hdparams.devnode_part);
72d80898
MT
471 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_BOOT_FILESYSTEM]))
472 {
473 errorbox(ctr[TR_UNABLE_TO_MOUNT_BOOT_FILESYSTEM]);
474 goto EXIT;
475 }
476 if (swap_file) {
1cdddb12 477 snprintf(commandstring, STRING_SIZE, "/sbin/swapon %s2", hdparams.devnode_part);
72d80898
MT
478 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_SWAP_PARTITION]))
479 {
480 errorbox(ctr[TR_UNABLE_TO_MOUNT_SWAP_PARTITION]);
481 goto EXIT;
482 }
483 }
1cdddb12 484 snprintf(commandstring, STRING_SIZE, "/bin/mount %s4 /harddisk/var", hdparams.devnode_part);
72d80898
MT
485 if (runcommandwithstatus(commandstring, ctr[TR_MOUNTING_LOG_FILESYSTEM]))
486 {
487 errorbox(ctr[TR_UNABLE_TO_MOUNT_LOG_FILESYSTEM]);
488 goto EXIT;
9607771a 489 }
c78a77eb
MT
490
491 if (installtype == URL_INSTALL) {
492 snprintf(commandstring, STRING_SIZE,
493 "/bin/wget -q -O - %s/" SNAME "-" VERSION ".tbz2 | /bin/tar -C /harddisk -xvjf -", url);
494 }
495
1cdddb12 496 if (installtype == CDROM_INSTALL) {
c78a77eb
MT
497 snprintf(commandstring, STRING_SIZE,
498 "/bin/tar -C /harddisk -xvjf /cdrom/" SNAME "-" VERSION ".tbz2");
499 }
d6aaa55d 500
edd536b6
MT
501 if (runcommandwithprogress(60, 4, title, commandstring, INST_FILECOUNT,
502 ctr[TR_INSTALLING_FILES]))
d6aaa55d
MT
503 {
504 errorbox(ctr[TR_UNABLE_TO_INSTALL_FILES]);
505 goto EXIT;
506 }
406f019f
MT
507
508 /* Save language und local settings */
509 write_lang_configs(shortlangname);
d6aaa55d
MT
510
511 /* touch the modules.dep files */
10bc6f06 512 snprintf(commandstring, STRING_SIZE,
c78a77eb 513 "/bin/touch /harddisk/lib/modules/%s-ipfire/modules.dep",
10bc6f06
MT
514 KERNEL_VERSION);
515 mysystem(commandstring);
10bc6f06 516 snprintf(commandstring, STRING_SIZE,
c78a77eb 517 "/bin/touch /harddisk/lib/modules/%s-ipfire-smp/modules.dep",
10bc6f06
MT
518 KERNEL_VERSION);
519 mysystem(commandstring);
d6aaa55d
MT
520
521 /* Rename uname */
522 rename ("/harddisk/bin/uname.bak", "/harddisk/bin/uname");
523
9607771a
MT
524 /* mount proc filesystem */
525 mysystem("mkdir /harddisk/proc");
ee78a5ef
MT
526 mysystem("/bin/mount --bind /proc /harddisk/proc");
527 mysystem("/bin/mount --bind /dev /harddisk/dev");
528 mysystem("/bin/mount --bind /sys /harddisk/sys");
9607771a 529
330345c2
MT
530 /* Build cache lang file */
531 snprintf(commandstring, STRING_SIZE, "/sbin/chroot /harddisk /usr/bin/perl -e \"require '" CONFIG_ROOT "/lang.pl'; &Lang::BuildCacheLang\"");
532 if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_LANG_CACHE]))
533 {
534 errorbox(ctr[TR_UNABLE_TO_INSTALL_LANG_CACHE]);
535 goto EXIT;
536 }
537
538 /* Update /etc/fstab */
1cdddb12 539 replace("/harddisk/etc/fstab", "DEVICE", hdparams.devnode_part_run);
cd8dd8dd
MT
540
541 if (fstype == REISER4) {
542 replace("/harddisk/etc/fstab", "FSTYPE", "reiser4");
543 replace("/harddisk/etc/mkinitcpio.conf", "MODULES=\"", "MODULES=\"reiser4 ");
d3fb18db 544 replace("/harddisk/boot/grub/grub.conf", "MOUNT", "rw");
cd8dd8dd
MT
545 } else if (fstype == REISERFS) {
546 replace("/harddisk/etc/fstab", "FSTYPE", "reiserfs");
d3fb18db 547 replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
cd8dd8dd 548 } else if (fstype == EXT3) {
db101f0c 549 snprintf(commandstring, STRING_SIZE, "tune2fs -j %s3", hdparams.devnode_part);
1700769c 550 if (runcommandwithstatus(commandstring, ctr[TR_JOURNAL_EXT3]))
db101f0c 551 {
1700769c 552 errorbox(ctr[TR_JOURNAL_ERROR]);
db101f0c
MT
553 replace("/harddisk/etc/fstab", "FSTYPE", "ext2");
554 goto NOJOURNAL;
555 }
556 snprintf(commandstring, STRING_SIZE, "tune2fs -j %s4", hdparams.devnode_part);
1700769c 557 if (runcommandwithstatus(commandstring, ctr[TR_JOURNAL_EXT3]))
db101f0c 558 {
1700769c 559 errorbox(ctr[TR_JOURNAL_ERROR]);
db101f0c
MT
560 replace("/harddisk/etc/fstab", "FSTYPE", "ext2");
561 goto NOJOURNAL;
562 }
cd8dd8dd 563 replace("/harddisk/etc/fstab", "FSTYPE", "ext3");
db101f0c 564 NOJOURNAL:
0a0bdf6e 565 replace("/harddisk/etc/mkinitcpio.conf", "MODULES=\"", "MODULES=\"ext3 ");
d3fb18db 566 replace("/harddisk/boot/grub/grub.conf", "MOUNT", "ro");
cd8dd8dd 567 }
73d9a908 568
ee78a5ef 569 /* Going to make our initrd... */
db101f0c 570 snprintf(commandstring, STRING_SIZE, "/sbin/chroot /harddisk /sbin/mkinitcpio -g /boot/ipfirerd.img -k %s-ipfire", KERNEL_VERSION);
ee78a5ef 571 runcommandwithstatus(commandstring, ctr[TR_BUILDING_INITRD]);
db101f0c 572 snprintf(commandstring, STRING_SIZE, "/sbin/chroot /harddisk /sbin/mkinitcpio -g /boot/ipfirerd-smp.img -k %s-ipfire-smp", KERNEL_VERSION);
ee78a5ef 573 runcommandwithstatus(commandstring, ctr[TR_BUILDING_INITRD]);
edd536b6 574
1cdddb12 575 sprintf(string, "root=%s3", hdparams.devnode_part_run);
edd536b6 576 replace( "/harddisk/boot/grub/grub.conf", "root=ROOT", string);
1cdddb12 577 replace( "/harddisk/boot/grub/grubbatch", "DEVICE", hdparams.devnode_disk);
fd0763dc 578
edd536b6
MT
579 /* restore permissions */
580 chmod("/harddisk/boot/grub/grubbatch", S_IXUSR | S_IRUSR | S_IXGRP | S_IRGRP | S_IXOTH | S_IROTH);
581
edd536b6 582 snprintf(commandstring, STRING_SIZE,
532a3663 583 "/sbin/chroot /harddisk /boot/grub/grubbatch");
edd536b6
MT
584 if (runcommandwithstatus(commandstring, ctr[TR_INSTALLING_GRUB])) {
585 errorbox(ctr[TR_UNABLE_TO_INSTALL_GRUB]);
586 goto EXIT;
587 }
588
22b9e405 589 mysystem("ln -s grub.conf /harddisk/boot/grub/menu.lst");
8de160ff
MT
590
591 mysystem("umount /cdrom");
3ef6c343
MT
592 snprintf(commandstring, STRING_SIZE, "eject /dev/%s", sourcedrive);
593 mysystem(commandstring);
22b9e405 594
73d9a908
MT
595 if (!unattended) {
596 sprintf(message, ctr[TR_CONGRATULATIONS_LONG],
3ad8835c 597 NAME, SNAME, NAME);
73d9a908
MT
598 newtWinMessage(ctr[TR_CONGRATULATIONS], ctr[TR_OK], message);
599 }
cd8dd8dd 600
22b9e405 601 allok = 1;
edd536b6 602
d6aaa55d 603EXIT:
10bc6f06 604 fprintf(flog, "Install program ended.\n");
d6aaa55d 605
10bc6f06 606 if (!(allok))
d6aaa55d 607 newtWinMessage(title, ctr[TR_OK], ctr[TR_PRESS_OK_TO_REBOOT]);
10bc6f06 608
d6aaa55d 609 freekeyvalues(ethernetkv);
d6aaa55d 610
10bc6f06 611 if (allok && !allok_fastexit)
d6aaa55d 612 {
ee78a5ef
MT
613 if (unattended) {
614 fprintf(flog, "Entering unattended setup\n");
615 if (unattended_setup(unattendedkv)) {
c78a77eb
MT
616 snprintf(commandstring, STRING_SIZE, "/bin/sleep 10");
617 runcommandwithstatus(commandstring, "Unattended installation finished, system will reboot");
ee78a5ef 618 } else {
c78a77eb
MT
619 errorbox("Unattended setup failed.");
620 goto EXIT;
c78a77eb 621 }
ee78a5ef 622 }
c78a77eb 623
ee78a5ef
MT
624 fflush(flog);
625 fclose(flog);
626 newtFinished();
627
628 if (!unattended) {
ee78a5ef
MT
629 if (system("/sbin/chroot /harddisk /usr/local/sbin/setup /dev/tty2 INSTALL"))
630 printf("Unable to run setup.\n");
ee78a5ef 631 }
3a1019f6 632
ee78a5ef
MT
633 if (system("/bin/umount /harddisk/proc"))
634 printf("Unable to umount /harddisk/proc.\n");
5057b611
HS
635 } else {
636 fflush(flog);
637 fclose(flog);
638 newtFinished();
d6aaa55d 639 }
5057b611 640
d6aaa55d
MT
641 fcloseall();
642
3a1019f6 643 if (swap_file) {
1cdddb12 644 snprintf(commandstring, STRING_SIZE, "/bin/swapoff %s2", hdparams.devnode_part);
3a1019f6
MT
645 }
646
647 newtFinished();
648
5057b611
HS
649 system("/bin/umount /harddisk/proc");
650 system("/bin/umount /harddisk/dev");
ee78a5ef 651 system("/bin/umount /harddisk/sys");
5057b611 652
532a3663
MT
653 system("/bin/umount /harddisk/var");
654 system("/bin/umount /harddisk/boot");
655 system("/bin/umount /harddisk");
10bc6f06 656
d6aaa55d
MT
657 system("/etc/halt");
658
659 return 0;
660}