Handle hostnames with upper-case letters
[webmin.git] / logrotate / save_log.cgi
1 #!/usr/local/bin/perl
2 # save_log.cgi
3 # Update, create or delete a log, or global settings
4
5 require './logrotate-lib.pl';
6 &ReadParse();
7 $parent = &get_config_parent();
8 $conf = $parent->{'members'};
9 if ($in{'global'}) {
10         # Editing the global options
11         $log = $parent;
12         }
13 elsif ($in{'new'}) {
14         # Adding a new section
15         $log = { 'members' => [ ],
16                  'file' => &get_add_file() };
17         $logfile = $in{'file'};
18         }
19 else {
20         # Editing a section
21         $oldlog = $log = $conf->[$in{'idx'}];
22         $logfile = join(" ", @{$oldlog->{'name'}});
23         }
24
25 if ($in{'delete'}) {
26         # Just delete this log entry
27         &lock_file($log->{'file'});
28         &save_directive($parent, $log, undef);
29         }
30 elsif ($in{'now'}) {
31         # Rotate log immediately
32         &ui_print_header(undef, $text{'force_title'}, "");
33
34         print $text{'force_doingone'},"\n";
35         ($ex, $out) = &rotate_log_now($log);
36         print "<pre>$out</pre>";
37         if ($?) {
38                 print $text{'force_failed'},"<br>\n";
39                 }
40         else {
41                 print $text{'force_done'},"<br>\n";
42                 }
43
44         &webmin_log("force", $logfile);
45         &ui_print_footer("", $text{'index_return'});
46         exit;
47         }
48 else {
49         # Validate and store inputs
50         &lock_file($log->{'file'});
51         &error_setup($text{'save_err'});
52         if (!$in{'global'}) {
53                 @files = split(/\s+/, $in{'file'});
54                 foreach $f (@files) {
55                         $f =~ /^\/\S+$/ || &error($text{'save_efile'});
56                         }
57                 $in{'file'} =~ s/\r//g;
58                 $log->{'name'} = [ split(/\n/, $in{'file'}) ];
59                 }
60
61         foreach $period ("daily", "weekly", "monthly") {
62                 &save_directive($log, $period,
63                                 $in{'sched'} eq $period ? "" : undef);
64                 }
65
66         $in{'size_def'} || $in{'size'} =~ /^\d+[kM]?$/ ||
67                 &error($text{'save_esize'});
68         &save_directive($log, "size", $in{'size_def'} ? undef : $in{'size'});
69
70         $in{'rotate_def'} || $in{'rotate'} =~ /^\d+$/ ||
71                 &error($text{'save_erotate'});
72         &save_directive($log, "rotate", $in{'rotate_def'} ? undef
73                                                             : $in{'rotate'});
74
75         &parse_yesno("compress", "nocompress", $log);
76         &parse_yesno("delaycompress", "nodelaycompress", $log);
77         &parse_yesno("copytruncate", "nocopytruncate", $log);
78         &parse_yesno("ifempty", "notifempty", $log);
79         &parse_yesno("missingok", "nomissingok", $log);
80
81         if ($in{'create'} == 2) {
82                 &error($text{'save_emust1'}) if ($in{'createuser'} ne '' &&
83                                                    $in{'createmode'} eq '');
84                 &error($text{'save_emust2'}) if ($in{'creategroup'} ne '' &&
85                                                    $in{'createuser'} eq '');
86                 $in{'createmode'} eq '' ||
87                     $in{'createmode'} =~ /^[0-7]{3,4}$/ ||
88                         &error($text{'save_ecreatemode'});
89                 $in{'createuser'} eq '' ||
90                     defined(getpwnam($in{'createuser'})) ||
91                         &error($text{'save_ecreateuser'});
92                 $in{'creategroup'} eq '' ||
93                     defined(getgrnam($in{'creategroup'})) ||
94                         &error($text{'save_ecreategroup'});
95                 &save_directive($log, "create",
96                                 $in{'createmode'}." ".
97                                 $in{'createuser'}." ".$in{'creategroup'});
98                 &save_directive($log, "nocreate");
99                 }
100         elsif ($in{'create'} == 1) {
101                 &save_directive($log, "create");
102                 &save_directive($log, "nocreate", "");
103                 }
104         elsif ($in{'create'} == 0) {
105                 &save_directive($log, "create");
106                 &save_directive($log, "nocreate");
107                 }
108
109         if ($in{'olddir'} == 2) {
110                 -d $in{'olddirto'} || &error($text{'save_eolddirto'});
111                 &save_directive($log, "olddir", $in{'olddirto'});
112                 &save_directive($log, "noolddir");
113                 }
114         elsif ($in{'olddir'} == 1) {
115                 &save_directive($log, "olddir");
116                 &save_directive($log, "noolddir", "");
117                 }
118         elsif ($in{'olddir'} == 0) {
119                 &save_directive($log, "olddir");
120                 &save_directive($log, "noolddir");
121                 }
122
123         $in{'ext_def'} || $in{'ext'} =~ /^\S+$/ ||
124                 &error($text{'save_eext'});
125         &save_directive($log, "extension", $in{'ext_def'} ? undef : $in{'ext'});
126
127         if ($in{'mail'} == 2) {
128                 $in{'mailto'} =~ /^\S+$/ || &error($text{'save_emailto'});
129                 &save_directive($log, "mail", $in{'mailto'});
130                 &save_directive($log, "nomail");
131                 }
132         elsif ($in{'mail'} == 1) {
133                 &save_directive($log, "mail");
134                 &save_directive($log, "nomail", "");
135                 }
136         elsif ($in{'mail'} == 0) {
137                 &save_directive($log, "mail");
138                 &save_directive($log, "nomail");
139                 }
140
141         &parse_yesno("mailfirst", "maillast", $log);
142
143         if (defined($in{'errors'})) {
144                 $in{'errors_def'} || $in{'errors'} =~ /^\S+$/ ||
145                         &error($text{'save_eerrors'});
146                 &save_directive($log, "errors", $in{'errors_def'} ? undef
147                                                           : $in{'errors'});
148                 }
149
150         if ($in{'pre'} =~ /\S/) {
151                 $in{'pre'} =~ s/\r//g;
152                 &has_endscript($in{'pre'}) && &error($text{'save_epre'});
153                 &save_directive($log, "prerotate",
154                                 { "name" => "prerotate",
155                                   "script" => $in{'pre'} });
156                 }
157         else {
158                 &save_directive($log, "prerotate");
159                 }
160
161         if ($in{'post'} =~ /\S/) {
162                 $in{'post'} =~ s/\r//g;
163                 &has_endscript($in{'post'}) && &error($text{'save_epost'});
164                 &save_directive($log, "postrotate",
165                                 { "name" => "postrotate",
166                                   "script" => $in{'post'} });
167                 }
168         else {
169                 &save_directive($log, "postrotate");
170                 }
171
172         if (&get_logrotate_version() >= 3.4) {
173                 &parse_yesno("sharedscripts", "nosharedscripts", $log);
174                 }
175
176         if (!$in{'global'}) {
177                 # Save or create the actual log entry
178                 &save_directive($parent, $oldlog, $log);
179                 }
180         }
181
182 &flush_file_lines();
183 &delete_if_empty($log->{'file'}) if ($in{'delete'});
184 &unlock_file($log->{'file'});
185 &webmin_log($in{'delete'} ? "delete" : $in{'new'} ? "create" : "modify",
186             $in{'global'} ? "global" : "log", $logfile);
187
188 &redirect("");
189
190 # parse_yesno(yesvalue, novalue, &conf)
191 sub parse_yesno
192 {
193 local $d0 = &find($_[0], $_[2]->{'members'});
194 local $d1 = &find($_[1], $_[2]->{'members'});
195 if ($in{$_[0]} == 2 && !$d0) {
196         # Adding or replacing 'yes' value
197         &save_directive($_[2], $d1 || $_[0],
198                         { 'name' => $_[0], 'value' => '' });
199         }
200 elsif ($in{$_[0]} == 1 && !$d1) {
201         # Adding or replacing 'no' value
202         &save_directive($_[2], $d0 || $_[1],
203                         { 'name' => $_[1], 'value' => '' });
204         }
205 elsif ($in{$_[0]} == 0) {
206         &save_directive($_[2], $_[0]);
207         &save_directive($_[2], $_[1]);
208         }
209 }
210
211 sub has_endscript
212 {
213 local $l;
214 foreach $l (split(/\n/, $_[0])) {
215         return 1 if ($l =~ /^\s*(endscript|endrotate)\s*$/);
216         }
217 return 0;
218 }
219