Handle hostnames with upper-case letters
[webmin.git] / fsdump / edit_dump.cgi
1 #!/usr/local/bin/perl
2 # edit_dump.cgi
3 # Edit or create a filesystem backup
4
5 require './fsdump-lib.pl';
6 &foreign_require("cron", "cron-lib.pl");
7 &ReadParse();
8
9 if (!$in{'id'}) {
10         # Adding a new backup of some type
11         $access{'edit'} || &error($text{'dump_ecannot1'});
12         &error_setup($text{'edit_err'});
13         $in{'dir'} || &error($text{'edit_edir'});
14         if ($supports_tar && ($config{'always_tar'} || $in{'forcetar'})) {
15                 # Always use tar format
16                 $fs = "tar";
17                 }
18         else {
19                 # Work out filesystem type
20                 $fs = &directory_filesystem($in{'dir'});
21                 @supp = &supported_filesystems();
22                 if (&indexof($fs, @supp) < 0) {
23                         if ($supports_tar) {
24                                 $fs = "tar";            # fall back to tar mode
25                                 }
26                         else {
27                                 &error(&text('edit_efs', uc($fs)));
28                                 }
29                         }
30                 }
31         &ui_print_header(undef, $text{'edit_title'}, "", "edit");
32         $dump = { 'dir' => $in{'dir'},
33                   'fs' => $fs,
34                   'rsh' => &has_command("ssh"),
35                    $config{'simple_sched'} ?
36                         ( 'special' => 'daily' ) :
37                         ( 'mins' => '0',
38                           'hours' => '0',
39                           'days' => '*',
40                           'months' => '*',
41                           'weekdays' => '*' ) };
42         }
43 else {
44         # Editing an existing backup
45         $dump = &get_dump($in{'id'});
46         $access{'edit'} && &can_edit_dir($dump) ||
47                 &error($text{'dump_ecannot2'});
48         &ui_print_header(undef, $text{'edit_title2'}, "", "create");
49         }
50
51 @tds = ( "width=30%" );
52 print &ui_form_start("save_dump.cgi", "post");
53 print &ui_hidden("id", $in{'id'}),"\n";
54 print &ui_hidden("fs", $dump->{'fs'}),"\n";
55 print &ui_hidden_table_start(&text('edit_header', uc($dump->{'fs'})),
56                              "width=100%", 2, "source", 1);
57
58 print &ui_table_row($text{'dump_format'},
59         $dump->{'fs'} eq 'tar' ? $text{'dump_tar'}
60                     : &text('dump_dumpfs', uc($dump->{'fs'})),
61         undef, \@tds);
62
63 if (!&multiple_directory_support($dump->{'fs'})) {
64         # One directory
65         print &ui_table_row(&hlink($text{'dump_dir'}, "dir"),
66                             &ui_textbox("dir", $dump->{'dir'}, 50)."\n".
67                             &file_chooser_button("dir", 1),
68                             undef, \@tds);
69         }
70 else {
71         # Multiple directories
72         print &ui_table_row(&hlink($text{'dump_dirs'}, "dirs"),
73                     &ui_textarea("dir", join("\n", &dump_directories($dump)),
74                                  3, 50),
75                     undef, \@tds);
76         }
77
78 &dump_form($dump, \@tds);
79 print &ui_hidden_table_end();
80
81 print &ui_hidden_table_start($text{'edit_header3'}, "width=100%", 4, "opts", 0);
82 if (defined(&dump_options_form)) {
83         &dump_options_form($dump, \@tds);
84         }
85
86 if (defined(&verify_dump)) {
87         # Add option to verify, if supported
88         print &ui_table_row(&hlink($text{'dump_reverify'},"reverify"),
89                             &ui_yesno_radio("reverify",
90                                             int($dump->{'reverify'})),
91                             \@tds);
92         }
93
94 # Extra command-line parameters
95 if ($access{'extra'}) {
96         print &ui_table_row(&hlink($text{'dump_extra'}, "extra"),
97                             &ui_textbox("extra", $dump->{'extra'}, 60), 3,
98                             \@tds);
99         }
100
101 # Before and after commands
102 if ($access{'cmds'}) {
103         print &ui_table_row(&hlink($text{'dump_before'},"before"),
104                             &ui_textbox("before", $dump->{'before'}, 60)." ".
105                             &ui_checkbox("beforefok", 1, $text{'dump_fok'},
106                                          !$dump->{'beforefok'}),
107                             3, \@tds);
108
109         print &ui_table_row(&hlink($text{'dump_after'},"after"),
110                             &ui_textbox("after", $dump->{'after'}, 60)." ".
111                             &ui_checkbox("afterfok", 1, $text{'dump_fok2'},
112                                          !$dump->{'afterfok'}),
113                             3, \@tds);
114         }
115 print &ui_hidden_table_end();
116
117 print &ui_hidden_table_start($text{'edit_header2'}, "width=100%", 4,
118                              "sched", 0);
119
120 # Show input for selecting when to run a dump, which can be never, on schedule
121 # or after some other dump
122 @dlist = grep { $_->{'id'} ne $in{'id'} } &list_dumps();
123 if (@dlist) {
124         $follow = &ui_select("follow", $dump->{'follow'},
125             [ map { [ $_->{'id'}, &follow_desc($_) ] } @dlist ]);
126         }
127 print &ui_table_row(&hlink($text{'edit_enabled'}, "enabled"),
128         &ui_radio("enabled", $dump->{'follow'} ? 2 :
129                                 $dump->{'enabled'} ? 1 : 0,
130              [ [ 0, $text{'edit_enabled_no'}."<br>" ],
131                @dlist ? 
132                 ( [ 2, $text{'edit_enabled_af'}." ".$follow."<br>" ] ) : ( ),
133                [ 1, $text{'edit_enabled_yes'} ] ]), 3, \@tds);
134
135 # Email address to send output to
136 print &ui_table_row(&hlink($text{'edit_email'}, "email"),
137                     &ui_textbox("email", $dump->{'email'}, 30), 3, \@tds);
138
139 # Subject line for email message
140 print &ui_table_row(&hlink($text{'edit_subject'}, "subject"),
141                     &ui_opt_textbox("subject", $dump->{'subject'},
142                                     40, $text{'default'}), 3, \@tds);
143
144 if (!$config{'simple_sched'} || ($dump && !$dump->{'special'})) {
145         # Complex Cron time input
146         print &ui_table_row(undef,
147                 "<table border width=100%>".
148                 &capture_function_output(\&cron::show_times_input, $dump).
149                 "</table>",
150                 4);
151         }
152 else {
153         # Simple input
154         print &ui_hidden("special_def", 1),"\n";
155         print &ui_table_row(&hlink($text{'edit_special'}, "special"),
156                 &ui_select("special", $dump->{'special'},
157                     [ map { [ $_, $cron::text{'edit_special_'.$_} ] }
158                           ('hourly', 'daily', 'weekly', 'monthly', 'yearly') ]),
159                 3, \@tds);
160         }
161 print &ui_hidden_table_end();
162
163 if ($in{'id'}) {
164         print &ui_form_end([ [ "save", $text{'save'} ],
165                              [ "savenow", $text{'edit_savenow'} ],
166                              [ "restore", $text{'edit_restore'} ],
167                              [ "delete", $text{'delete'} ] ]);
168         }
169 else {
170         print &ui_form_end([ [ "create", $text{'create'} ],
171                              [ "savenow", $text{'edit_createnow'} ] ]);
172         }
173
174 &ui_print_footer("", $text{'index_return'});
175
176 # follow_desc(&dump)
177 sub follow_desc
178 {
179 local @dirs = &dump_directories($_[0]);
180 return &text(defined($_[0]->{'level'}) ? 'edit_tolevel' : 'edit_to',
181              $dirs[0], &dump_dest($_[0]), $_[0]->{'level'});
182 }