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