Handle hostnames with upper-case letters
[webmin.git] / fsdump / save_dump.cgi
1 #!/usr/local/bin/perl
2 # save_dump.cgi
3 # Save the details of a scheduled backup
4
5 require './fsdump-lib.pl';
6 &foreign_require("cron", "cron-lib.pl");
7 &ReadParse();
8 &error_setup($text{'save_err'});
9
10 # Create wrapper for ftp transfer script
11 &cron::create_wrapper($ftp_cmd, $module_name, "ftp.pl");
12
13 if ($in{'id'}) {
14         $dump = &get_dump($in{'id'});
15         $access{'edit'} && &can_edit_dir($dump) ||
16                 &error($text{'dump_ecannot2'});
17         @jobs = &foreign_call("cron", "list_cron_jobs");
18         foreach $j (@jobs) {
19                 $job = $j if ($j->{'command'} eq "$cron_cmd $dump->{'id'}");
20                 }
21         $oldenabled = $dump->{'enabled'};
22         }
23 else {
24         $access{'edit'} || &error($text{'dump_ecannot1'});
25         }
26
27 if ($in{'delete'}) {
28         # Just delete this dump
29         &delete_dump($dump);
30         if ($job) {
31                 &lock_file($job->{'file'});
32                 &foreign_call("cron", "delete_cron_job", $job);
33                 &unlock_file($job->{'file'});
34                 }
35         delete($dump->{'pass'});
36         &webmin_log("delete", undef, $dump->{'id'}, $dump);
37         &redirect("");
38         }
39 elsif ($in{'restore'}) {
40         # Redirect to restore form
41         &redirect("restore_form.cgi?fs=$dump->{'fs'}&id=$in{'id'}");
42         }
43 else {
44         # Validate and store inputs
45         if (&multiple_directory_support($in{'fs'})) {
46                 $in{'dir'} =~ s/[\r\n]+/\t/g;
47                 foreach $d (split(/\t+/, $in{'dir'})) {
48                         -d $d || &error($text{'save_edir'});
49                         if ($in{'fs'} ne 'tar') {
50                                 $fs = &directory_filesystem($d);
51                                 &same_filesystem($fs, $in{'fs'}) ||
52                                         &error($text{'save_efs'});
53                                 }
54                         &can_edit_dir($d) || &error($text{'dump_ecannot3'});
55                         }
56                 $in{'dir'} || &error($text{'save_edir'});
57                 $dump->{'tabs'} = 1;    # tab used to split dirs
58                 }
59         else {
60                 -d $in{'dir'} || &error($text{'save_edir'});
61                 if ($in{'fs'} ne 'tar') {
62                         $fs = &directory_filesystem($in{'dir'});
63                         &same_filesystem($fs, $in{'fs'}) ||
64                                 &error($text{'save_efs'});
65                         }
66                 &can_edit_dir($in{'dir'}) || &error($text{'dump_ecannot3'});
67                 }
68         $dump->{'dir'} = $in{'dir'};
69         $dump->{'fs'} = $in{'fs'};
70         $dump->{'email'} = $in{'email'};
71         $dump->{'subject'} = $in{'subject_def'} ? undef : $in{'subject'};
72         if ($access{'extra'}) {
73                 $dump->{'extra'} = $in{'extra'};
74                 }
75         if ($access{'cmds'}) {
76                 $dump->{'before'} = $in{'before'};
77                 $dump->{'after'} = $in{'after'};
78                 $dump->{'beforefok'} = !$in{'beforefok'};
79                 $dump->{'afterfok'} = !$in{'afterfok'};
80                 }
81         $in{'file'} =~ s/^\s+//; $in{'file'} =~ s/\s+$//;
82         $in{'hfile'} =~ s/^\s+//; $in{'hfile'} =~ s/\s+$//;
83         &parse_dump($dump);
84         $dump->{'reverify'} = $in{'reverify'} if (defined(&verify_dump));
85         $dump->{'enabled'} = $in{'enabled'};
86         $dump->{'follow'} = $in{'enabled'} == 2 ? $in{'follow'} : undef;
87         &foreign_call("cron", "parse_times_input", $dump, \%in);
88
89         # Create or update the dump and cron job
90         &lock_file($cron_cmd);
91         &cron::create_wrapper($cron_cmd, $module_name, "backup.pl");
92         &unlock_file($cron_cmd);
93         &save_dump($dump);
94         local $oldjob = $job;
95         if ($dump->{'enabled'} == 1) {
96                 # Create cron job and script
97                 $job->{'user'} = 'root';
98                 $job->{'active'} = 1;
99                 $job->{'special'} = $dump->{'special'};
100                 $job->{'mins'} = $dump->{'mins'};
101                 $job->{'hours'} = $dump->{'hours'};
102                 $job->{'days'} = $dump->{'days'};
103                 $job->{'months'} = $dump->{'months'};
104                 $job->{'weekdays'} = $dump->{'weekdays'};
105                 $job->{'command'} = "$cron_cmd $dump->{'id'}";
106                 }
107         &lock_file(&cron::cron_file($job)) if ($job);
108         if ($dump->{'enabled'} == 1 && !$oldjob) {
109                 # Create the cron job
110                 &foreign_call("cron", "create_cron_job", $job); 
111                 }
112         elsif ($dump->{'enabled'} == 1 && $oldjob) {
113                 # Update the cron job
114                 &foreign_call("cron", "change_cron_job", $job); 
115                 }
116         elsif ($dump->{'enabled'} != 1 && $oldjob) {
117                 # Delete the cron job
118                 &foreign_call("cron", "delete_cron_job", $job);
119                 }
120         &unlock_file(&cron::cron_file($job)) if ($job);
121
122         delete($dump->{'pass'});
123         &webmin_log($in{'id'} ? "modify" : "create", undef,
124                     $dump->{'id'}, $dump);
125         if ($in{'savenow'}) {
126                 &redirect("backup.cgi?id=$dump->{'id'}");
127                 }
128         else {
129                 &redirect("");
130                 }
131         }
132