1#!/usr/local/bin/perl 2# Create, update or delete a scheduled backup 3 4use strict; 5use warnings; 6require './backup-config-lib.pl'; 7our (%in, %text, $cron_cmd, $module_name); 8&ReadParse(); 9 10# Find the backup job 11my ($job, $backup); 12if (!$in{'new'}) { 13 $backup = &get_backup($in{'id'}); 14 $job = &find_cron_job($backup); 15 } 16else { 17 $backup = { }; 18 } 19 20if ($in{'delete'}) { 21 # Delete the backup 22 &delete_backup($backup); 23 if ($job) { 24 &lock_file(&cron::cron_file($job)); 25 &cron::delete_cron_job($job); 26 &unlock_file(&cron::cron_file($job)); 27 } 28 } 29else { 30 # Validate inputs 31 &error_setup($text{'save_err'}); 32 my @mods = split(/\0/, $in{'mods'}); 33 $backup->{'mods'} = join(" ", @mods); 34 $backup->{'dest'} = &parse_backup_destination("dest", \%in); 35 &cron::parse_times_input($backup, \%in); 36 $backup->{'emode'} = $in{'emode'}; 37 $backup->{'email'} = $in{'email'}; 38 $backup->{'pre'} = $in{'pre'}; 39 $backup->{'post'} = $in{'post'}; 40 $backup->{'sched'} = $in{'sched'}; 41 ($backup->{'configfile'}, $backup->{'nofiles'}, $backup->{'others'}) = 42 &parse_backup_what("what", \%in); 43 @mods || ($backup->{'nofiles'} && !$backup->{'configfile'}) || 44 &error($text{'save_emods'}); 45 46 # Save or create 47 &save_backup($backup); 48 if ($job) { 49 &lock_file(&cron::cron_file($job)); 50 &cron::delete_cron_job($job); 51 } 52 if ($in{'sched'}) { 53 &cron::create_wrapper($cron_cmd, $module_name, "backup.pl"); 54 $job = { 'user' => 'root', 55 'command' => "$cron_cmd $backup->{'id'}", 56 'active' => 1, 57 'mins' => $backup->{'mins'}, 58 'hours' => $backup->{'hours'}, 59 'days' => $backup->{'days'}, 60 'months' => $backup->{'months'}, 61 'weekdays' => $backup->{'weekdays'}, 62 'special' => $backup->{'special'} }; 63 &lock_file(&cron::cron_file($job)); 64 &cron::create_cron_job($job); 65 } 66 &unlock_file(&cron::cron_file($job)) if ($job); 67 } 68&webmin_log($in{'new'} ? 'create' : $in{'delete'} ? 'delete' : 'modify', 69 'backup', $backup->{'dest'}, $backup); 70 71if ($in{'run'}) { 72 # Execute the backup now 73 &ui_print_unbuffered_header(undef, $text{'run_title'}, ""); 74 75 # Run the pre-backup command, if any 76 my $err; 77 if ($backup->{'pre'} =~ /\S/) { 78 my $preout = &backquote_command( 79 "($backup->{'pre'}) 2>&1 </dev/null"); 80 print &text('email_pre', 81 "<tt>".&html_escape($backup->{'pre'})."</tt>")."<br>\n". 82 "<pre>".&html_escape($preout)."</pre>\n"; 83 if ($?) { 84 $err = $text{'email_prefailed'}; 85 } 86 } 87 88 my @mods = split(/\s+/, $backup->{'mods'}); 89 my $nice = &nice_dest($backup->{'dest'}, 1); 90 if (!$err) { 91 print &text('run_doing', scalar(@mods), 92 "<tt>$nice</tt>"),"<br>\n"; 93 my $size; 94 $err = &execute_backup( 95 \@mods, $backup->{'dest'}, \$size, undef, 96 $backup->{'configfile'}, $backup->{'nofiles'}, 97 [ split(/\t+/, $backup->{'others'}) ]); 98 } 99 if ($err) { 100 print "<pre>$err</pre>"; 101 print "$text{'run_failed'}<p>\n"; 102 } 103 else { 104 print "$text{'run_ok'}<p>\n"; 105 } 106 107 # Run the post-backup command, if any 108 if (!$err && $backup->{'post'} =~ /\S/) { 109 my $postout = &backquote_command( 110 "($backup->{'post'}) 2>&1 </dev/null"); 111 print &text('email_post', 112 "<tt>".&html_escape($backup->{'post'})."</tt>")."<br>\n". 113 "<pre>".&html_escape($postout)."</pre>\n"; 114 } 115 116 &webmin_log("run", "backup", $backup->{'dest'}, $backup); 117 &ui_print_footer("edit.cgi?id=$in{'id'}", $text{'edit_return'}, 118 "index.cgi?mode=sched", $text{'index_return'}); 119 } 120else { 121 &redirect("index.cgi?mode=sched"); 122 } 123 124 125