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