source: MondoRescue/branches/stable/mondo/src/mondoarchive/main.c@ 944

Last change on this file since 944 was 944, checked in by Bruno Cornec, 17 years ago

getfacl and getfattr not searched everytime but only in the main of mondoarchive (in link with #63)

  • Property svn:keywords set to Id
File size: 16.6 KB
Line 
1/***************************************************************************
2 main.c - description
3 -------------------
4 begin : Fri Apr 19 16:40:35 EDT 2002
5 copyright : (C) 2002 by Stan Benoit
6 email : troff@nakedsoul.org
7 cvsid : $Id: main.c 944 2006-11-18 00:25:11Z bruno $
8 ***************************************************************************/
9
10/***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************/
18
19/** change log ****** MONDO-DEVEL
20
21
2212/10
23- disable stopping/starting of autofs
24
2510/01
26- update g_erase_tmpdir_and_scratchdir to delete user-specified tmpdir, scratchdir
27
2806/19
29- added AUX_VER
30
3106/14/2004
32- use mondorescue.iso, not mindi.iso
33
3402/10/2004
35- tell users where BusyBox's sources are
36
3711/14/2003
38- cleaned up logging at end#
39
4010/23
41- don't try to test-read tape ... That's already
42 handled by post_param_configuration()
43
4410/19
45- if your PATH var is too long, abort
46
4709/23
48- added some comments
49- malloc/free global strings in new subroutines - malloc_libmondo_global_strings()
50 and free_libmondo_global_strings() - which are in libmondo-tools.c
51- better magicdev support
52
53
5409/16
55- delete /var/log/partimagehack-debug.log at start of main()
56
5709/15
58- added askbootloader
59
6009/09
61- if your tape is weird, I'll pause between backup and verify
62- fixed silly bug in main() - re: say_at_end
63
6401/01 - 08/31
65- call 'dmesg -n1' at start, to shut the kernel logger up
66- moved g_erase_tmpdir_and_scratchdir to common/newt-specific.c
67- added 'don't panic' msg to start of logfile
68- added 'nice(20)' to main()
69- added lots of assert()'s and log_OS_error()'s
70- clean-up (Hugo)
71- make post_param_configuration() setup g_erase_tmpdir_and_scratchdir
72- if --version then print & exit quickly
73- re-run g_erase_tmpdir_and_scratchdir via system() at very end
74
75Year: 2002
76- if user goes root with 'su' instead of 'su -' then
77 workaround it by setting PATH correctly
78- wipe mondoarchive.log at very beginning
79- cleaned up code
80- if changed.files.N exists then copy to changes.files for display
81- run_program_and_log_output() now takes boolean operator to specify
82 whether it will log its activities in the event of _success_
83- added popup list of changed files
84- removed 'beta-quality' warnings
85- if kernel not found and mondo in graphics mode then popup and ask
86 for kernel path+filename
87- fixed tmp[] 'too small' bug
88- unmount and eject CD at end of verify cycle
89- moved interactively_obtain...() to libmondo-stream.c
90- wrote stuff to autodetect tape+cdrw+etc.
91- renamed from main.c to mondo-archive.c
92- fore+after warnings that this code is beta-quality
93- abort if running from ramdisk
94- remount floppy at end & unmount at start if Mandrake
95- took out #debug stuff
96- add 2> /dev/null to 'find' command
97- add support for bkpinfo->nonbootable_backup
98- add main function begin comment and debug conditional
99 compilation - Stan Benoit
100- add debug statements to build a run tree. Stan Benoit
101**** end change log **********/
102
103
104/**
105 * @file
106 * The main file for mondoarchive.
107 */
108
109/************************* #include statements *************************/
110#include <pthread.h>
111//#include <config.h>
112//#include "../../config.h"
113#include <stdio.h>
114#include <stdlib.h>
115#include "../common/my-stuff.h"
116#include "../common/mondostructures.h"
117#include "../common/libmondo.h"
118#include "mondo-cli-EXT.h"
119
120// for CVS
121//static char cvsid[] = "$Id: main.c 944 2006-11-18 00:25:11Z bruno $";
122
123/************************* external variables *************************/
124extern void set_signals(int);
125extern int g_current_media_number;
126extern void register_pid(pid_t, char *);
127extern int g_currentY;
128extern bool g_text_mode;
129extern char *g_boot_mountpt;
130extern bool g_remount_cdrom_at_end, g_remount_floppy_at_end;
131extern char *g_mondo_home;
132extern char *g_tmpfs_mountpt;
133extern char *g_erase_tmpdir_and_scratchdir;
134extern char *g_cdrw_drive_is_here;
135static char *g_cdrom_drive_is_here = NULL;
136static char *g_dvd_drive_is_here = NULL;
137extern double g_kernel_version;
138
139/***************** global vars, used only by main.c ******************/
140bool g_skip_floppies;
141long diffs;
142char *ps_options = "auxww";
143char *ps_proc_id = "$2";
144char *g_getfacl = NULL
145char *g_getfattr = NULL
146
147extern t_bkptype g_backup_media_type;
148extern int g_loglevel;
149
150/****************** subroutines used only by main.c ******************/
151
152
153/**
154 * Print a "don't panic" message to the log and a message about the logfile to the screen.
155 */
156void welcome_to_mondoarchive()
157{
158 log_msg(0, "Mondo Archive v%s --- http://www.mondorescue.org",
159 PACKAGE_VERSION);
160 log_msg(0, "running on %s architecture", get_architecture());
161 log_msg(0,
162 "-----------------------------------------------------------");
163 log_msg(0,
164 "NB: Mondo logs almost everything, so don't panic if you see");
165 log_msg(0,
166 "some error messages. Please read them carefully before you");
167 log_msg(0,
168 "decide to break out in a cold sweat. Despite (or perhaps");
169 log_msg(0,
170 "because of) the wealth of messages. some users are inclined");
171 log_msg(0,
172 "to stop reading this log. If Mondo stopped for some reason,");
173 log_msg(0,
174 "chances are it's detailed here. More than likely there's a");
175 log_msg(0,
176 "message at the very end of this log that will tell you what");
177 log_msg(0,
178 "is wrong. Please read it! -Devteam");
179 log_msg(0,
180 "-----------------------------------------------------------");
181
182 log_msg(0, "Zero...");
183 log_msg(1, "One...");
184 log_msg(2, "Two...");
185 log_msg(3, "Three...");
186 log_msg(4, "Four...");
187 log_msg(5, "Five...");
188 log_msg(6, "Six...");
189 log_msg(7, "Seven...");
190 log_msg(8, "Eight...");
191 printf("See %s for details of backup run.\n", MONDO_LOGFILE);
192}
193
194
195extern char *g_magicdev_command;
196
197/**
198 * Do whatever is necessary to insure a successful backup on the Linux distribution
199 * of the day.
200 */
201void distro_specific_kludges_at_start_of_mondoarchive()
202{
203 log_msg(2, "Unmounting old ramdisks if necessary");
204 stop_magicdev_if_necessary(); // for RH+Gnome users
205 run_program_and_log_output
206 ("umount `mount | grep shm | grep mondo | cut -d' ' -f3`", 2);
207 unmount_supermounts_if_necessary(); // for Mandrake users whose CD-ROMs are supermounted
208 // stop_autofs_if_necessary(); // for Xandros users
209 mount_boot_if_necessary(); // for Gentoo users with non-mounted /boot partitions
210 clean_up_KDE_desktop_if_necessary(); // delete various misc ~/.* files that get in the way
211}
212
213
214
215/**
216 * Undo whatever was done by distro_specific_kludges_at_start_of_mondoarchive().
217 */
218void distro_specific_kludges_at_end_of_mondoarchive()
219{
220// char tmp[500];
221 log_msg(2, "Restarting magicdev if necessary");
222 sync();
223 restart_magicdev_if_necessary(); // for RH+Gnome users
224
225 log_msg(2, "Restarting autofs if necessary");
226 sync();
227 // restart_autofs_if_necessary(); // for Xandros users
228
229 log_msg(2, "Restarting supermounts if necessary");
230 sync();
231 remount_supermounts_if_necessary(); // for Mandrake users
232
233 log_msg(2, "Unmounting /boot if necessary");
234 sync();
235 unmount_boot_if_necessary(); // for Gentoo users
236
237// log_msg( 2, "Cleaning up KDE desktop");
238// clean_up_KDE_desktop_if_necessary();
239}
240
241/* Return a string containing the date */
242char *mr_date(void) {
243
244 time_t tcurr;
245
246 tcurr = time(NULL);
247 return(ctime(&tcurr));
248}
249
250/*-----------------------------------------------------------*/
251
252
253
254/**
255 * Backup/verify the user's data.
256 * What did you think it did, anyway? :-)
257 */
258int main(int argc, char *argv[])
259{
260 struct s_bkpinfo *bkpinfo;
261 char *tmp;
262 int res, retval;
263 char *say_at_end;
264
265/* Make sure I'm root; abort if not */
266 if (getuid() != 0) {
267 fprintf(stderr, "Please run as root.\r\n");
268 exit(127);
269 }
270
271/* If -V, -v or --version then echo version no. and quit */
272 if (argc == 2
273 && (!strcmp(argv[argc - 1], "-v") || !strcmp(argv[argc - 1], "-V")
274 || !strcmp(argv[argc - 1], "--version"))) {
275 printf("mondoarchive v%s\nSee man page for help\n", PACKAGE_VERSION);
276 exit(0);
277 }
278
279/* Initialize variables */
280
281 malloc_libmondo_global_strings();
282 malloc_string(tmp);
283 malloc_string(say_at_end);
284
285 res = 0;
286 retval = 0;
287 diffs = 0;
288 say_at_end[0] = '\0';
289 printf("Initializing...\n");
290 if (!(bkpinfo = malloc(sizeof(struct s_bkpinfo)))) {
291 fatal_error("Cannot malloc bkpinfo");
292 }
293
294 /* initialize log file with time stamp */
295 unlink(MONDO_LOGFILE);
296 log_msg(0, "Time started: %s", mr_date());
297
298 /* make sure PATH environmental variable allows access to mkfs, fdisk, etc. */
299 strncpy(tmp, getenv("PATH"), MAX_STR_LEN - 1);
300 tmp[MAX_STR_LEN - 1] = '\0';
301 if (strlen(tmp) >= MAX_STR_LEN - 33) {
302 fatal_error
303 ("Your PATH environmental variable is too long. Please shorten it.");
304 }
305 strcat(tmp, ":/sbin:/usr/sbin:/usr/local/sbin");
306 setenv("PATH", tmp, 1);
307
308 /* Add the ARCH environment variable for ia64 purposes */
309 strncpy(tmp, get_architecture(), MAX_STR_LEN - 1);
310 tmp[MAX_STR_LEN - 1] = '\0';
311 setenv("ARCH", tmp, 1);
312
313 /* Add MONDO_SHARE environment variable for mindi */
314 setenv_mondo_share();
315
316 /* Configure the bkpinfo structure, global file paths, etc. */
317 g_main_pid = getpid();
318 log_msg(9, "This");
319
320 register_pid(g_main_pid, "mondo");
321 set_signals(TRUE); // catch SIGTERM, etc.
322 run_program_and_log_output("dmesg -n1", TRUE);
323
324 log_msg(9, "Next");
325 welcome_to_mondoarchive();
326 distro_specific_kludges_at_start_of_mondoarchive();
327 sprintf(g_erase_tmpdir_and_scratchdir, "rm -Rf %s %s", bkpinfo->tmpdir,
328 bkpinfo->scratchdir);
329 g_kernel_version = get_kernel_version();
330
331 if (argc == 4 && !strcmp(argv[1], "getfattr")) {
332 g_loglevel = 10;
333 g_text_mode = TRUE;
334 setup_newt_stuff();
335 if (!strstr(argv[2], "filelist")) {
336 printf("Sorry - filelist goes first\n");
337 finish(1);
338 } else {
339 finish(get_fattr_list(argv[2], argv[3]));
340 }
341 finish(0);
342 }
343 if (argc == 4 && !strcmp(argv[1], "setfattr")) {
344 g_loglevel = 10;
345// chdir("/tmp");
346 g_text_mode = TRUE;
347 setup_newt_stuff();
348 finish(set_fattr_list(argv[2], argv[3]));
349 }
350
351 if (argc == 3 && !strcmp(argv[1], "wildcards")) {
352 g_loglevel = 10;
353 g_text_mode = TRUE;
354 setup_newt_stuff();
355 turn_wildcard_chars_into_literal_chars(tmp, argv[2]);
356 printf("in=%s; out=%s\n", argv[2], tmp);
357 finish(1);
358 }
359
360 if (argc == 4 && !strcmp(argv[1], "getfacl")) {
361 g_loglevel = 10;
362 g_text_mode = TRUE;
363 setup_newt_stuff();
364 if (!strstr(argv[2], "filelist")) {
365 printf("Sorry - filelist goes first\n");
366 finish(1);
367 } else {
368 finish(get_acl_list(argv[2], argv[3]));
369 }
370 finish(0);
371 }
372 if (argc == 4 && !strcmp(argv[1], "setfacl")) {
373 g_loglevel = 10;
374// chdir("/tmp");
375 g_text_mode = TRUE;
376 setup_newt_stuff();
377 finish(set_acl_list(argv[2], argv[3]));
378 }
379
380 if (argc > 2 && !strcmp(argv[1], "find-cd")) {
381 g_loglevel = 10;
382 g_text_mode = TRUE;
383 setup_newt_stuff();
384 if (find_cdrw_device(tmp)) {
385 printf("Failed to find CDR-RW drive\n");
386 } else {
387 printf("CD-RW is at %s\n", tmp);
388 }
389 tmp[0] = '\0';
390 if (find_cdrom_device(tmp, atoi(argv[2]))) {
391 printf("Failed to find CD-ROM drive\n");
392 } else {
393 printf("CD-ROM is at %s\n", tmp);
394 }
395 finish(0);
396 }
397
398 if (argc > 2 && !strcmp(argv[1], "find-dvd")) {
399 g_loglevel = 10;
400 g_text_mode = TRUE;
401 setup_newt_stuff();
402 if (find_dvd_device(tmp, atoi(argv[2]))) {
403 printf("Failed to find DVD drive\n");
404 } else {
405 printf("DVD is at %s\n", tmp);
406 }
407 finish(0);
408 }
409
410 if (argc > 2 && !strcmp(argv[1], "disksize")) {
411 printf("%s --> %ld\n", argv[2], get_phys_size_of_drive(argv[2]));
412 finish(0);
413 }
414 if (argc > 2 && !strcmp(argv[1], "test-dev")) {
415 if (is_dev_an_NTFS_dev(argv[2])) {
416 printf("%s is indeed an NTFS dev\n", argv[2]);
417 } else {
418 printf("%s is _not_ an NTFS dev\n", argv[2]);
419 }
420 finish(0);
421 }
422
423 if (pre_param_configuration(bkpinfo)) {
424 fatal_error
425 ("Pre-param initialization phase failed. Please review the error messages above, make the specified changes, then try again. Exiting...");
426 }
427
428/* Process command line, if there is one. If not, ask user for info. */
429 if (argc == 1) {
430 g_text_mode = FALSE;
431 setup_newt_stuff();
432 res = interactively_obtain_media_parameters_from_user(bkpinfo, TRUE); /* yes, archiving */
433 if (res) {
434 fatal_error
435 ("Syntax error. Please review the parameters you have supplied and try again.");
436 }
437 } else {
438 res = handle_incoming_parameters(argc, argv, bkpinfo);
439 if (res) {
440 printf
441 ("Errors were detected in the command line you supplied.\n");
442 printf("Please review the log file - " MONDO_LOGFILE "\n");
443 log_msg(1, "Mondoarchive will now exit.");
444 finish(1);
445 }
446 setup_newt_stuff();
447 }
448
449/* Finish configuring global structures */
450 if (post_param_configuration(bkpinfo)) {
451 fatal_error
452 ("Post-param initialization phase failed. Perhaps bad parameters were supplied to mondoarchive? Please review the documentation, error messages and logs. Exiting...");
453 }
454
455 log_to_screen
456 ("BusyBox's sources are available from http://www.busybox.net");
457 sprintf(g_erase_tmpdir_and_scratchdir, "rm -Rf %s %s", bkpinfo->tmpdir,
458 bkpinfo->scratchdir);
459
460 if (find_home_of_exe("getfacl")) {
461 asprintf(&g_setfacl,"getfacl");
462 }
463 if (find_home_of_exe("getfattr")) {
464 asprintf(&g_setfacl,"getfattr");
465 }
466
467 /* If we're meant to backup then backup */
468 if (bkpinfo->backup_data) {
469 res = backup_data(bkpinfo);
470 retval += res;
471 if (res) {
472 strcat(say_at_end,
473 "Data archived. Please check the logs, just as a precaution. ");
474 } else {
475 strcat(say_at_end, "Data archived OK. ");
476 }
477 }
478
479/* If we're meant to verify then verify */
480 if (bkpinfo->verify_data) {
481 res = verify_data(bkpinfo);
482 if (res < 0) {
483 sprintf(tmp, "%d difference%c found.", -res,
484 (-res != 1) ? 's' : ' ');
485 strcat(say_at_end, tmp);
486 log_to_screen(tmp);
487 res = 0;
488 }
489 retval += res;
490 }
491
492/* Offer to write floppy disk images to physical disks */
493 if (bkpinfo->backup_data && !g_skip_floppies) {
494 res = offer_to_write_boot_floppies_to_physical_disks(bkpinfo);
495 retval += res;
496// res = offer_to_write_boot_ISO_to_physical_CD(bkpinfo);
497// retval += res;
498 }
499
500/* Report result of entire operation (success? errors?) */
501 if (!retval) {
502 mvaddstr_and_log_it(g_currentY++, 0,
503 "Backup and/or verify ran to completion. Everything appears to be fine.");
504 } else {
505 mvaddstr_and_log_it(g_currentY++, 0,
506 "Backup and/or verify ran to completion. However, errors did occur.");
507 }
508
509 if (does_file_exist("/root/images/mindi/mondorescue.iso")) {
510 log_to_screen
511 ("/root/images/mindi/mondorescue.iso, a boot/utility CD, is available if you want it.");
512 }
513
514
515 if (length_of_file("/tmp/changed.files") > 2) {
516 if (g_text_mode) {
517 log_to_screen
518 ("Type 'less /tmp/changed.files' to see which files don't match the archives");
519 } else {
520 log_msg(1,
521 "Type 'less /tmp/changed.files' to see which files don't match the archives");
522 log_msg(2, "Calling popup_changelist_from_file()");
523 popup_changelist_from_file("/tmp/changed.files");
524 log_msg(2, "Returned from popup_changelist_from_file()");
525 }
526 } else {
527 unlink("/tmp/changed.files");
528 }
529 log_to_screen(say_at_end);
530 sprintf(tmp, "umount %s/tmpfs", bkpinfo->tmpdir);
531 run_program_and_log_output(tmp, TRUE);
532 run_program_and_log_output(g_erase_tmpdir_and_scratchdir, TRUE);
533
534 run_program_and_log_output("mount", 2);
535
536 system("rm -f /var/cache/mondo-archive/last-backup.aborted");
537 system("rm -Rf /tmp.mondo.* /mondo.scratch.*");
538 if (!retval) {
539 printf("Mondoarchive ran OK.\n");
540 } else {
541 printf("Errors occurred during backup. Please check logfile.\n");
542 }
543 distro_specific_kludges_at_end_of_mondoarchive();
544 register_pid(0, "mondo");
545 set_signals(FALSE);
546 chdir("/tmp"); // just in case there's something wrong with g_erase_tmpdir_and_scratchdir
547 system(g_erase_tmpdir_and_scratchdir);
548 free_libmondo_global_strings();
549 paranoid_free(say_at_end);
550 paranoid_free(tmp);
551 paranoid_free(bkpinfo);
552
553 unlink("/tmp/filelist.full");
554 unlink("/tmp/filelist.full.gz");
555
556 if (!g_cdrom_drive_is_here) {
557 log_msg(10, "FYI, g_cdrom_drive_is_here was never used");
558 }
559 if (!g_dvd_drive_is_here) {
560 log_msg(10, "FYI, g_dvd_drive_is_here was never used");
561 }
562
563 /* finalize log file with time stamp */
564 log_msg(0, "Time finished: %s", mr_date());
565
566 if (!g_text_mode) {
567 popup_and_OK
568 ("Mondo Archive has finished its run. Please press ENTER to return to the shell prompt.");
569 log_to_screen("See %s for details of backup run.", MONDO_LOGFILE);
570 finish(retval);
571 } else {
572 printf("See %s for details of backup run.\n", MONDO_LOGFILE);
573 exit(retval);
574 }
575
576 return EXIT_SUCCESS;
577}
Note: See TracBrowser for help on using the repository browser.