1 /* IPCop install2 program.
3 * This program is distributed under the terms of the GNU General Public
4 * Licence. See the file COPYING for details.
6 * (c) Lawrence Manning, 2001
7 * (c) Franck Bourdonnec, 2006
8 * Contains update/restore code
10 * $Id: install2.c,v 1.1.2.5 2006/02/10 06:53:57 gespinasse Exp $
20 To include a translated string in the final installer, you must reference
21 it here with a simplr comment. This save a lot a space in the installer
24 /* TR_BUILDING_INITRD */
27 /* TR_RESTORE_CONFIGURATION */
32 /* TR_INSTALLING_FILES */
33 /* TR_FAILED_TO_FIND */
34 /* TR_UNABLE_TO_INSTALL_FILES */
35 /* TR_LOADING_PCMCIA */
39 /* TR_ENTER_THE_IP_ADDRESS_INFORMATION */
41 /* TR_DHCP_HOSTNAME */
42 /* TR_IP_ADDRESS_PROMPT */
43 /* TR_NETMASK_PROMPT */
44 /* TR_INVALID_FIELDS */
45 /* TR_IP_ADDRESS_CR */
46 /* TR_NETWORK_MASK_CR */
47 /* TR_DHCP_HOSTNAME_CR */
48 /* TR_LOOKING_FOR_NIC */
50 /* TR_SELECT_NETWORK_DRIVER */
51 /* TR_SELECT_NETWORK_DRIVER_LONG */
52 /* TR_UNABLE_TO_LOAD_DRIVER_MODULE */
53 /* TR_THIS_DRIVER_MODULE_IS_ALREADY_LOADED */
54 /* TR_MODULE_PARAMETERS */
55 /* TR_LOADING_MODULE */
56 /* TR_MODULE_NAME_CANNOT_BE_BLANK */
59 /* TR_UNABLE_TO_OPEN_SETTINGS_FILE */
61 /* TR_ENTER_DOMAINNAME */
62 /* TR_DOMAINNAME_CANNOT_CONTAIN_SPACES */
63 /* TR_UNABLE_TO_MOUNT_PROC_FILESYSTEM */
64 /* TR_UNABLE_TO_WRITE_ETC_FSTAB */
66 // dir to find files, chrooted or not...
67 #define TMP_EXTRACT_CH "/tmp/ipcop"
68 #define TMP_EXTRACT "/harddisk" TMP_EXTRACT_CH
69 #define MOUNT_BACKUP_CH "/mnt/usb"
70 #define MOUNT_BACKUP "/harddisk" MOUNT_BACKUP_CH
72 return 0 when dev contains a backup set
75 int try_mount (char *dev
, char *testfile
) {
76 char commandstring
[STRING_SIZE
];
77 mysystem("/bin/umount " MOUNT_BACKUP
);
78 sprintf(commandstring
, "/bin/mount -t vfat -o ro %s " MOUNT_BACKUP
, dev
);
79 mysystem(commandstring
);
81 /*verify it's what we want */
82 sprintf(commandstring
, MOUNT_BACKUP
"/%s.dat", testfile
);
83 FILE *handle
= fopen(commandstring
, "r");
85 return 1; /* bad disk ! */
89 handle
= fopen(MOUNT_BACKUP
"/backup.key", "r");
91 return 1; /* bad disk ! */
97 /* try to mount usb device until backup.tgz is found except the
98 destination device (scsi names are identical with usb key)
99 check "sda sdb sdc sdd"
101 int mountbackup (char *testfile
, char *destination_device
) {
104 for (i
= 'a'; i
< 'e'; i
++) {
105 sprintf (sourcedev
,"/dev/sd%c ",i
);
106 if (strcmp (destination_device
, sourcedev
) != 0) {
107 if (!try_mount (sourcedev
, testfile
)) return 0;
109 for (j
= '1'; j
< '5'; j
++) {
111 if (strcmp (destination_device
, sourcedev
) != 0) {
112 if (!try_mount (sourcedev
, testfile
)) return 0;
119 int floppy_locate() {
120 /* Temporarily mount /proc under /harddisk/proc,
121 run updfstab to locate the floppy, and unmount /harddisk/proc
122 again. This should be run each time the user tries to restore
123 so it can properly detect removable devices */
124 if (mysystem("/bin/mount -n -t proc /proc /harddisk/proc")) {
125 errorbox(ctr
[TR_UNABLE_TO_MOUNT_PROC_FILESYSTEM
]);
128 if (mysystem("/bin/chroot /harddisk /usr/sbin/updfstab")) {
129 errorbox(ctr
[TR_UNABLE_TO_WRITE_ETC_FSTAB
]);
132 mysystem("/bin/umount /harddisk/proc");
136 /* Check the SQUID acl file exists, if not use our 1.4 copy */
137 void fixup_squidacl() {
139 if ((aclreadfile
= fopen ("/harddisk" CONFIG_ROOT
"/proxy/acl", "r"))) {
140 unlink ("/harddisk" CONFIG_ROOT
"/proxy/acl-1.4");
143 rename ("/harddisk" CONFIG_ROOT
"/proxy/acl-1.4",
144 "/harddisk" CONFIG_ROOT
"/proxy/acl");
146 chown ("/harddisk" CONFIG_ROOT
"/proxy/acl", 99, 99);
148 /* if we detected SCSI then fixup */
149 void fixup_initrd() {
151 char line
[STRING_SIZE
];
152 char commandstring
[STRING_SIZE
];
154 if (!(handle
= fopen("/scsidriver", "r")))
158 fgets(line
, STRING_SIZE
-1, handle
);
160 line
[strlen(line
) - 1] = 0;
161 driver
= strtok(line
, ".");
162 fprintf(flog
, "Detected SCSI driver %s\n", driver
);
163 if (!strlen(driver
) > 1)
166 fprintf(flog
, "Fixing up ipfirerd.img\n");
167 mysystem("/bin/chroot /harddisk /sbin/modprobe loop");
168 mkdir("/harddisk/initrd", S_IRWXU
|S_IRWXG
|S_IRWXO
);
169 sprintf(commandstring
, "/bin/chroot /harddisk /sbin/mkinitrd"
170 " --with=scsi_mod --with=%s --with=sd_mod"
171 " --with=sr_mod --with=libata"
172 " --with=ataraid /boot/ipfirerd.img "KERNEL_VERSION
,
174 runcommandwithstatus(commandstring
, ctr
[TR_BUILDING_INITRD
]);
176 sprintf(commandstring
, "/bin/chroot /harddisk /sbin/mkinitrd"
177 " --with=scsi_mod --with=%s --with=sd_mod"
178 " --with=sr_mod --with=libata"
179 " --with=ataraid /boot/ipfirerd-smp.img "KERNEL_VERSION
"-smp",
181 runcommandwithstatus(commandstring
, ctr
[TR_BUILDING_INITRD
]);
182 mysystem("/bin/chroot /harddisk /bin/mv /boot/grub/scsigrub.conf /boot/grub/grub.conf");
185 runcommandwithstatus("/bin/chroot /harddisk /bin/mv /boot/etc/scsiaboot.conf /boot/etc/aboot.conf", ctr
[TR_BUILDING_INITRD
]);
188 /* when backup is ready in tmpdir, move files to definitive location */
189 void do_copy_files() {
190 mysystem("/bin/chroot /harddisk /bin/cp -af "TMP_EXTRACT_CH
"/. /");
191 /* Upgrade necessary files from v1.2 to v1.3 to v1.4 */
194 /* Upgrade configuration files starting from 1.4.11 */
195 mysystem("/bin/chroot /harddisk /usr/local/bin/upgrade");
198 int main(int argc
, char *argv
[]) {
200 #define DEST_DEV argv[2]
204 char **langtrs
[] = { en_tr
, NULL
};
206 char **langtrs
[] = { bz_tr
, cs_tr
, da_tr
, de_tr
, en_tr
, es_tr
, fr_tr
, el_tr
, it_tr
, la_tr
, hu_tr
, nl_tr
, no_tr
, pl_tr
, pt_tr
, sk_tr
, so_tr
, fi_tr
, sv_tr
, tr_tr
, vi_tr
, NULL
};
208 char **langtrs
[] = { de_tr
, en_tr
, NULL
};
211 char title
[STRING_SIZE
];
212 char commandstring
[STRING_SIZE
];
214 setlocale (LC_ALL
, "");
215 /* Log file/terminal stuff. */
217 ctr
= langtrs
[ atoi(LANG
) ];
219 if (!(flog
= fopen(mylog
, "w+")))
221 printf("Couldn't open log terminal\n");
224 fprintf(flog
, "Install2 program started.\n");
227 strcpy (title
, NAME
" v" VERSION
" - " SLOGAN
);
228 newtDrawRootText(14, 0, title
);
229 newtPushHelpLine(ctr
[TR_HELPLINE
]);
231 /* working dirs... */
232 mkdir(MOUNT_BACKUP
, S_IRWXU
|S_IRWXG
|S_IRWXO
);
234 //create the GUI screen and objects
235 newtComponent form
, header
, labelfile
, labelkey
, file
, key
, radio0
, radio1
, radio2
, radio3
, radio4
, ok
;
237 newtCenteredWindow (55,20,ctr
[TR_RESTORE
]);
238 form
= newtForm (NULL
, NULL
,0);
240 sprintf(message
, ctr
[TR_RESTORE_CONFIGURATION
], NAME
);
241 header
= newtTextboxReflowed (2,1,message
,51,0,0,0);
242 newtFormAddComponent(form
, header
);
244 // The four method of restauration
245 int start1
=1, start2
=0, start3
=0, start4
=0;
246 radio1
= newtRadiobutton (17, 5, ctr
[TR_SKIP
], start1
, NULL
);
247 radio2
= newtRadiobutton (17, 6, "Floppy (legacy)", start2
, radio1
);
248 radio3
= newtRadiobutton (17, 7, "Usb-storage/CDROM", start3
, radio2
);
249 if (strcmp(WGET
,"none"))
250 radio4
= newtRadiobutton (17, 8, "HTTP/FTP", start4
, radio3
);
253 newtFormAddComponents(form
, radio1
, radio2
, radio3
, radio4
, NULL
);
255 // The optionnal filename for 'backup'
256 labelfile
=newtTextbox(12, 10, 35, 1, 0);
257 newtTextboxSetText (labelfile
, "Filename");
258 newtFormAddComponent(form
, labelfile
);
260 char fileinit
[STRING_SIZE
] = "backup";
261 file
= newtEntry (17, 11, fileinit
, 20, &filevalue
, 0);
262 newtFormAddComponent(form
, file
);
264 // The optionnal password for the key
265 labelkey
=newtTextbox(12, 13, 35, 1, 0);
266 newtTextboxSetText (labelkey
, "Backup key password");
267 newtFormAddComponent(form
, labelkey
);
269 char keyinit
[STRING_SIZE
] = "";
270 key
= newtEntry (17, 14, keyinit
, 20, &keyvalue
, 0);
271 newtFormAddComponent(form
, key
);
274 ok
=newtButton (23, 16, ctr
[TR_OK
]);
275 newtFormAddComponent(form
, ok
);
277 /* loop until succeeds or user skips out */
279 while ( retcode
<0 ) {
282 struct newtExitStruct reponse
;
283 newtFormRun (form
, &reponse
);
284 radio0
= newtRadioGetCurrent(radio1
);
286 radio
= radio0
== radio1
? 1 : radio0
== radio2
? 2 : radio0
== radio3
? 3 : radio0
== radio4
? 4 : 0;
287 strcpy(keyinit
,keyvalue
); //reuse actual value
288 strcpy(fileinit
,filevalue
);
291 retcode
= 1; // no restore: nothing special
292 break; // out of the while loop
295 mkdir(TMP_EXTRACT
, S_IRWXU
|S_IRWXG
|S_IRWXO
);
296 statuswindow(45, 4, title
, ctr
[TR_INSTALLING_FILES
]);
299 sprintf(commandstring
,"/bin/wget -P " TMP_EXTRACT
" %s/%s.dat", WGET
, filevalue
);
300 mysystem (commandstring
);
301 sprintf(commandstring
,"/bin/wget -P " TMP_EXTRACT
" %s/%s.key", WGET
, filevalue
);
302 if (mysystem (commandstring
)) {
303 errorbox(ctr
[TR_FAILED_TO_FIND
]);
307 case 3: // normal backup
308 if (mountbackup( filevalue
, DEST_DEV
)) {
309 errorbox(ctr
[TR_UNABLE_TO_INSTALL_FILES
]);//mess=no device with backup found
312 // link files to a COMMON location
313 sprintf (commandstring
, "chroot /harddisk ln -s "MOUNT_BACKUP_CH
"/%s.dat " TMP_EXTRACT_CH
"/%s.dat", filevalue
, filevalue
);
314 mysystem (commandstring
);
315 sprintf (commandstring
, "chroot /harddisk ln -s "MOUNT_BACKUP_CH
"/%s.key " TMP_EXTRACT_CH
"/%s.key", filevalue
, filevalue
);
316 mysystem (commandstring
);
318 COMMON
: // DECRYPT THE TARBALL
319 // Copy the key to a new location because we decrypt it!
320 if (strcmp(keyvalue
, "")) { // password provided: decrypt the key
321 sprintf(commandstring
, "/bin/chroot /harddisk /usr/bin/openssl enc"
322 " -a -d -aes256 -salt"
324 " -in " TMP_EXTRACT_CH
"/%s.key"
325 " -out " TMP_EXTRACT_CH
"/__tmp.key",
326 keyvalue
, filevalue
);
327 } else { //just copy to new name
328 sprintf(commandstring
, "/bin/chroot /harddisk cp"
329 " " TMP_EXTRACT_CH
"/%s.key"
330 " " TMP_EXTRACT_CH
"/__tmp.key",
333 mysystem (commandstring
);
335 sprintf(commandstring
, "/bin/chroot /harddisk /usr/bin/openssl des3"
337 " -in " TMP_EXTRACT_CH
"/%s.dat"
338 " -out " TMP_EXTRACT_CH
"/backup.tgz"
339 " -kfile " TMP_EXTRACT_CH
"/__tmp.key",
342 if (mysystem (commandstring
)) {
343 errorbox(ctr
[TR_UNABLE_TO_INSTALL_FILES
]);//mess=decrypt error:invalid key?
346 strcpy(commandstring
, "/bin/chroot /harddisk /bin/tar"
347 " -X " CONFIG_ROOT
"/backup/exclude.system"
348 " -C " TMP_EXTRACT_CH
349 " -xzf " TMP_EXTRACT_CH
"/backup.tgz");
351 if (mysystem(commandstring
)) {
352 errorbox(ctr
[TR_UNABLE_TO_INSTALL_FILES
]);
355 sprintf(commandstring
, TMP_EXTRACT
"/%s.dat", filevalue
);
356 unlink(commandstring
); //dont need them anymore
357 unlink( TMP_EXTRACT
"/backup.tgz");
358 sprintf(commandstring
, TMP_EXTRACT
"/%s.key", filevalue
);
359 unlink(commandstring
);
360 unlink( TMP_EXTRACT
"/__tmp.key");
362 /* Now copy to correct location */
364 retcode
= 0; /* successfully restored */
368 if (floppy_locate()) {
369 retcode
= 2; // this an error!
373 /* Always extract to /tmp/ipcop for temporary extraction
374 just in case floppy fails.
375 try a compressed backup first because it's quicker to fail.
376 In exclude.system, files name must be without leading / or
377 on extraction, name will never match
379 sprintf(commandstring
,
380 "/bin/chroot /harddisk /bin/tar -X " CONFIG_ROOT
"/backup/exclude.system -C "TMP_EXTRACT_CH
" -xvzf /dev/floppy > %s 2> /dev/null", mylog
);
381 if (system(commandstring
)) {
382 /* if it's not compressed, try uncompressed first before failing*/
383 sprintf(commandstring
,
384 "/bin/chroot /harddisk /bin/tar -X " CONFIG_ROOT
"/backup/exclude.system -C "TMP_EXTRACT_CH
" -xvf /dev/floppy > %s 2> /dev/null", mylog
);
385 if (system(commandstring
)) {
386 /* command failed trying to read from floppy */
387 errorbox(ctr
[TR_UNABLE_TO_INSTALL_FILES
]);
391 /* Now copy to correct location */
393 retcode
= 0; /* successfully restored */
395 /* remove possible badly restored files */
396 mysystem("/bin/chroot /harddisk /bin/rm -rf " TMP_EXTRACT_CH
);
397 newtPopWindow(); // close windows
399 newtFormDestroy(form
);
402 mysystem("/bin/umount " MOUNT_BACKUP
);
403 mysystem("/bin/chroot /harddisk /bin/rmdir " MOUNT_BACKUP_CH
);
405 /* others operations moved from install to install2 */
409 fprintf(flog
, "Install2 program ended.\n");