1#!/usr/local/bin/perl 2# Create, update or delete a log source 3 4require './syslog-ng-lib.pl'; 5&ReadParse(); 6&error_setup($text{'source_err'}); 7 8# Get the old source 9$conf = &get_config(); 10if (!$in{'new'}) { 11 @sources = &find("source", $conf); 12 ($source) = grep { $_->{'value'} eq $in{'old'} } @sources; 13 $source || &error($text{'source_egone'}); 14 $old = $source; 15 } 16else { 17 $source = { 'name' => 'source', 18 'type' => 1, 19 'members' => [ ] }; 20 } 21 22&lock_all_files($conf); 23if ($in{'delete'}) { 24 # Just delete it! 25 &check_dependencies('source', $in{'old'}) && 26 &error(&text('sdelete_eused', $in{'old'})); 27 &save_directive($conf, undef, $source, undef, 0); 28 } 29else { 30 # Validate inputs, and update object 31 $in{'name'} =~ /^[a-z0-9_]+$/i || &error($text{'source_ename'}); 32 if ($in{'new'} || $in{'old'} ne $in{'name'}) { 33 ($clash) = grep { $_->{'value'} eq $in{'name'} } @sources; 34 $clash && &error($text{'source_eclash'}); 35 } 36 $source->{'values'} = [ $in{'name'} ]; 37 38 # Clear out all existing values 39 $source->{'members'} = [ ]; 40 41 if ($in{'internal'}) { 42 # Save internal option 43 $internal = { 'name' => 'internal', 44 'type' => 0, 45 'values' => [ ] }; 46 &save_directive($conf, $source, undef, $internal, 1); 47 } 48 49 foreach $t ("unix-stream", "unix-dgram") { 50 # Save Unix socket file option 51 next if (!$in{$t}); 52 $in{$t.'_name'} =~ /^\/\S/ || 53 &error($text{'source_eunix_name'}); 54 $unix = { 'name' => $t, 55 'type' => 0, 56 'values' => [ $in{$t.'_name'} ] }; 57 &save_directive($conf, $source, undef, $unix, 1); 58 59 # Save owner 60 if (!$in{$t.'_owner_def'}) { 61 defined(getpwnam($in{$t.'_owner'})) || 62 &error($text{'source_eowner'}); 63 &save_directive($conf, $unix, "owner", 64 $in{$t.'_owner'}, 1); 65 } 66 if (!$in{$t.'_group_def'}) { 67 defined(getgrnam($in{$t.'_group'})) || 68 &error($text{'source_egroup'}); 69 &save_directive($conf, $unix, "group", 70 $in{$t.'_group'}, 1); 71 } 72 73 # Save permissions 74 if (!$in{$t.'_perm_def'}) { 75 $in{$t.'_perm'} =~ /^[0-7]+$/ || 76 &error($text{'source_eperm'}); 77 &save_directive($conf, $unix, "perm", 78 $in{$t.'_perm'}, 1); 79 } 80 81 if ($t eq "unix-stream") { 82 # Save keep-alive option 83 if ($in{$t.'_keep'}) { 84 &save_directive($conf, $unix, "keep-alive", 85 $in{$t.'_keep'}, 1); 86 } 87 88 # Save max connections option 89 if (!$in{$t.'_max_def'}) { 90 $in{$t.'_max'} =~ /^\d+$/ || 91 &error($text{'source_emax'}); 92 &save_directive($conf, $unix, "max-connections", 93 $in{$t.'_max'}, 1); 94 } 95 } 96 } 97 98 foreach $t ('tcp', 'udp') { 99 # Save network socket file option 100 next if (!$in{$t}); 101 $net = { 'name' => $t, 102 'type' => 0, 103 'values' => [ ] }; 104 &save_directive($conf, $source, undef, $net, 1); 105 106 # Save local IP and port 107 if (!$in{$t.'_ip_def'}) { 108 &check_ipaddress($in{$t.'_ip'}) || 109 &error($text{'source_eip'}); 110 &save_directive($conf, $net, "ip", 111 $in{$t.'_ip'}, 1); 112 } 113 if (!$in{$t.'_port_def'}) { 114 $in{$t.'_port'} =~ /^\d+$/ || 115 &error($text{'source_eport'}); 116 &save_directive($conf, $net, "port", 117 $in{$t.'_port'}, 1); 118 } 119 120 # Save TCP-specific options and max connections 121 if ($t eq "tcp") { 122 if ($in{$t.'_keep'}) { 123 &save_directive($conf, $net, "keep-alive", 124 $in{$t.'_keep'}, 1); 125 } 126 if ($in{$t.'_tkeep'}) { 127 &save_directive($conf, $net, "tcp-keep-alive", 128 $in{$t.'_tkeep'}, 1); 129 } 130 } 131 if (!$in{$t.'_max_def'}) { 132 $in{$t.'_max'} =~ /^\d+$/ || 133 &error($text{'source_emax'}); 134 &save_directive($conf, $net, "max-connections", 135 $in{$t.'_max'}, 1); 136 } 137 } 138 139 # Save kernel file option 140 if ($in{'file'}) { 141 $in{'file_name'} =~ /^\/\S/ || 142 &error($text{'source_efile_name'}); 143 $file = { 'name' => 'file', 144 'type' => 0, 145 'values' => [ $in{'file_name'} ] }; 146 &save_directive($conf, $source, undef, $file, 1); 147 148 # Save log prefix 149 if (!$in{'file_prefix_def'}) { 150 $in{'file_prefix'} =~ /\S/ || 151 &error($text{'source_eprefix'}); 152 &save_directive($conf, $file, "log_prefix", 153 $in{'file_prefix'}, 1); 154 } 155 } 156 157 # Save named pipe option 158 if ($in{'pipe'}) { 159 $in{'pipe_name'} =~ /^\/\S/ || 160 &error($text{'source_epipe_name'}); 161 $pipe = { 'name' => 'pipe', 162 'type' => 0, 163 'values' => [ $in{'pipe_name'} ] }; 164 &save_directive($conf, $source, undef, $pipe, 1); 165 166 # Save log prefix and pad size 167 if (!$in{'pipe_prefix_def'}) { 168 $in{'pipe_prefix'} =~ /\S/ || 169 &error($text{'source_eprefix'}); 170 &save_directive($conf, $pipe, "log_prefix", 171 $in{'pipe_prefix'}, 1); 172 } 173 if (!$in{'pipe_pad_def'}) { 174 $in{'pipe_pad'} =~ /^\d+$/ || 175 &error($text{'source_epad'}); 176 &save_directive($conf, $pipe, "pad_size", 177 $in{'pipe_pad'}, 1); 178 } 179 } 180 181 # Save Solaris streams option 182 if ($in{'sun-streams'}) { 183 $in{'sun_streams_name'} =~ /^\/\S/ || 184 &error($text{'source_esun_streams_name'}); 185 $sun_streams = { 'name' => 'sun-streams', 186 'type' => 0, 187 'values' => [ $in{'sun_streams_name'} ] }; 188 &save_directive($conf, $source, undef, $sun_streams, 1); 189 190 # Save door file 191 $in{'sun_streams_door'} =~ /\S/ || 192 &error($text{'source_edoor'}); 193 &save_directive($conf, $sun_streams, "door", 194 $in{'sun_streams_door'}, 1); 195 } 196 197 # Save syslog protocol option 198 if ($in{'network'}) { 199 $net = { 'name' => 'network', 200 'type' => 0, 201 'values' => [ ] }; 202 &save_directive($conf, $source, undef, $net, 1); 203 204 # Save local IP and port 205 if (!$in{'network_ip_def'}) { 206 &check_ipaddress($in{'network_ip'}) || 207 &error($text{'source_eip'}); 208 &save_directive($conf, $net, "ip", 209 $in{'network_ip'}, 1); 210 } 211 if (!$in{'network_port_def'}) { 212 $in{'network_port'} =~ /^\d+$/ || 213 &error($text{'source_eport'}); 214 &save_directive($conf, $net, "port", 215 $in{'network_port'}, 1); 216 } 217 if ($in{'network_transport'}) { 218 &save_directive($conf, $net, "transport", 219 $in{'network_transport'}, 1); 220 } 221 } 222 223 # Actually update the object 224 &save_directive($conf, undef, $old, $source, 0); 225 226 # Update dependent log targets 227 if (!$in{'new'}) { 228 &rename_dependencies('source', $in{'old'}, $in{'name'}); 229 } 230 } 231 232&unlock_all_files(); 233&webmin_log($in{'delete'} ? 'delete' : $in{'new'} ? 'create' : 'modify', 234 'source', $in{'old'} || $in{'name'}); 235&redirect("list_sources.cgi"); 236 237