Handle hostnames with upper-case letters
[webmin.git] / syslog-ng / save_filter.cgi
1 #!/usr/local/bin/perl
2 # Create, update or delete a log filter
3
4 require './syslog-ng-lib.pl';
5 &ReadParse();
6 &error_setup($text{'filter_err'});
7
8 # Get the old filter
9 $conf = &get_config();
10 if (!$in{'new'}) {
11         @filters = &find("filter", $conf);
12         ($filter) = grep { $_->{'value'} eq $in{'old'} } @filters;
13         $filter || &error($text{'filter_egone'});
14         $old = $filter;
15         }
16 else {
17         $filter = { 'name' => 'filter',
18                   'type' => 1,
19                   'members' => [ ] };
20         }
21
22 &lock_file($config{'syslogng_conf'});
23 if ($in{'delete'}) {
24         # Just delete it!
25         &check_dependencies('filter', $in{'old'}) &&
26             &error(&text('fdelete_eused', $in{'old'}));
27         &save_directive($conf, undef, $filter, undef, 0);
28         }
29 else {
30         # Validate inputs, and update object
31         $in{'name'} =~ /^[a-z0-9_]+$/i || &error($text{'filter_ename'});
32         if ($in{'new'} || $in{'old'} ne $in{'name'}) {
33                 ($clash) = grep { $_->{'value'} eq $in{'name'} } @filters;
34                 $clash && &error($text{'filter_eclash'});
35                 }
36         $filter->{'values'} = [ $in{'name'} ];
37
38         # Clear out current values
39         $filter->{'members'} = [ ];
40
41         if ($in{'mode'} == 0) {
42                 if ($in{'priority'}) {
43                         # Add selected priorities
44                         @pris = split(/\0/, $in{'pri'});
45                         @pris || &error($text{'filter_epris'});
46                         @pris = map { (",", $_) } @pris;
47                         shift(@pris);   # remove first ,
48                         push(@{$filter->{'members'}}, "and",
49                              { 'name' => 'priority',
50                                'type' => 0,
51                                'values' => \@pris });
52                         }
53
54                 if ($in{'facility'}) {
55                         # Add selected facilities
56                         @facs = split(/\0/, $in{'fac'});
57                         @facs || &error($text{'filter_efacs'});
58                         @facs = map { (",", $_) } @facs;
59                         shift(@facs);   # remove first ,
60                         push(@{$filter->{'members'}}, "and",
61                              { 'name' => 'facility',
62                                'type' => 0,
63                                'values' => \@facs });
64                         }
65
66                 if ($in{'program'}) {
67                         $in{'prog'} =~ /^\S+$/ || &error($text{'filter_eprog'});
68                         push(@{$filter->{'members'}}, "and",
69                              { 'name' => 'program',
70                                'type' => 0,
71                                'values' => [ $in{'prog'} ] });
72                         }
73
74                 if ($in{'match'}) {
75                         $in{'re'} =~ /\S/ || &error($text{'filter_ematch'});
76                         push(@{$filter->{'members'}}, "and",
77                              { 'name' => 'match',
78                                'type' => 0,
79                                'values' => [ $in{'re'} ] });
80                         }
81
82                 if ($in{'host'}) {
83                         $in{'hn'} =~ /^\S+$/ || &error($text{'filter_ehost'});
84                         push(@{$filter->{'members'}}, "and",
85                              { 'name' => 'host',
86                                'type' => 0,
87                                'values' => [ $in{'hn'} ] });
88                         }
89
90                 if ($in{'netmask'}) {
91                         &check_ipaddress($in{'net'}) ||
92                               &error($text{'filter_enet'});
93                         &check_ipaddress($in{'mask'}) ||
94                               &error($text{'filter_emask'});
95                         push(@{$filter->{'members'}}, "and",
96                              { 'name' => 'netmask',
97                                'type' => 0,
98                                'values' => [ $in{'net'}."/".$in{'mask'} ] });
99                         }
100
101                 if (@{$filter->{'members'}}) {
102                         # Remove first 'and'
103                         shift(@{$filter->{'members'}});
104                         }
105                 else {
106                         &error($text{'filter_enone'});
107                         }
108                 }
109
110         else {
111                 # Parse boolean expression (in a temp file), and add to values
112                 $temp = &transname();
113                 &open_tempfile(TEMP, ">$temp", 0, 1);
114                 &print_tempfile(TEMP, "filter xxx {\n");
115                 &print_tempfile(TEMP, $in{'bool'},"\n");
116                 &print_tempfile(TEMP, "};\n");
117                 &close_tempfile(TEMP);
118                 eval {
119                   $main::error_must_die = 1;
120                   ($tfilter) = &read_config_file($temp);
121                   };
122                 $@ && &error($text{'filter_ebool'});
123                 unlink($temp);
124                 $filter->{'members'} = $tfilter->{'members'};
125                 }
126         
127         # Actually update the object
128         &save_directive($conf, undef, $old, $filter, 0);
129
130         # Update dependent log targets
131         if (!$in{'new'}) {
132                 &rename_dependencies('filter', $in{'old'}, $in{'name'});
133                 }
134         }
135
136 &unlock_file($config{'syslogng_conf'});
137 &webmin_log($in{'delete'} ? 'delete' : $in{'new'} ? 'create' : 'modify',
138             'filter', $in{'old'} || $in{'name'});
139 &redirect("list_filters.cgi");
140