2 # Create, update or delete a log filter
4 require './syslog-ng-lib.pl';
6 &error_setup($text{'filter_err'});
11 @filters = &find("filter", $conf);
12 ($filter) = grep { $_->{'value'} eq $in{'old'} } @filters;
13 $filter || &error($text{'filter_egone'});
17 $filter = { 'name' => 'filter',
22 &lock_file($config{'syslogng_conf'});
25 &check_dependencies('filter', $in{'old'}) &&
26 &error(&text('fdelete_eused', $in{'old'}));
27 &save_directive($conf, undef, $filter, undef, 0);
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'});
36 $filter->{'values'} = [ $in{'name'} ];
38 # Clear out current values
39 $filter->{'members'} = [ ];
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',
51 'values' => \@pris });
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',
63 'values' => \@facs });
67 $in{'prog'} =~ /^\S+$/ || &error($text{'filter_eprog'});
68 push(@{$filter->{'members'}}, "and",
69 { 'name' => 'program',
71 'values' => [ $in{'prog'} ] });
75 $in{'re'} =~ /\S/ || &error($text{'filter_ematch'});
76 push(@{$filter->{'members'}}, "and",
79 'values' => [ $in{'re'} ] });
83 $in{'hn'} =~ /^\S+$/ || &error($text{'filter_ehost'});
84 push(@{$filter->{'members'}}, "and",
87 'values' => [ $in{'hn'} ] });
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',
98 'values' => [ $in{'net'}."/".$in{'mask'} ] });
101 if (@{$filter->{'members'}}) {
103 shift(@{$filter->{'members'}});
106 &error($text{'filter_enone'});
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);
119 $main::error_must_die = 1;
120 ($tfilter) = &read_config_file($temp);
122 $@ && &error($text{'filter_ebool'});
124 $filter->{'members'} = $tfilter->{'members'};
127 # Actually update the object
128 &save_directive($conf, undef, $old, $filter, 0);
130 # Update dependent log targets
132 &rename_dependencies('filter', $in{'old'}, $in{'name'});
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");