One Hat Cyber Team
  • Dir : ~/usr/share/webmin/shorewall/
  • View File Name : shorewall-lib.pl
    \n"; if (&version_atleast(3)) { print " $text{'routestopped_2'}\n"; print "\n"; &options_input("opts", $_[2], \@routestopped_options); print " \n"; } } sub routestopped_validate { $in{'addr_def'} || $in{'addr'} =~ /\S/ || &error($text{'routestopped_eaddr'}); return ( $in{'iface'}, $in{'addr_def'} ? "-" : join(",", split(/\s+/, $in{'addr'})), join(",", split(/\0/, $in{'opts'})) ); } ################################ tunnels ################################## sub tunnels_row { local $tt = $_[0]; $tt =~ s/^(openvpn|generic):.*$/$1/; return ( $text{'tunnels_'.$tt} || $tt, $_[1] eq '-' || $_[1] eq '' ? $text{'routestopped_all'} : $_[1], $_[2], $_[3] ); } sub tunnels_form { print " $text{'tunnels_0'}\n"; print "\n"; print "\n"; print "\n"; print " $text{'tunnels_1'}\n"; print ""; &zone_field("zone", $_[1], 0, 0); print " \n"; local $none = $_[2] eq '' || $_[2] eq '-'; print " $text{'tunnels_2'} \n"; printf " %s\n", $none ? "checked" : "", $text{'default'}; printf " %s\n", $none ? "" : "checked", $text{'tunnels_sel'}; printf " \n", $_[2]; local $none = $_[2] eq '' || $_[2] eq '-'; print " $text{'tunnels_3'} \n"; printf " %s\n", $none ? "checked" : "", $text{'tunnels_gnone'}; printf " %s\n", $none ? "" : "checked", $text{'tunnels_gsel'}; printf " \n", join(" ", split(/,/, $_[3])); } sub tunnels_validate { $in{'gateway_def'} || &check_ipaddress($in{'gateway'}) || ($in{'gateway'} =~ /^(\S+)\/(\d+)$/ && &check_ipaddress($1)) || &error($text{'tunnels_egateway'}); if ($in{'type'} eq "openvpn") { $in{'tport'} =~ /^\d*$/ || &error($text{'tunnels_eopenvpn'}); $in{'type'} .= ":".$in{'tport'} if ($in{'tport'}); } elsif ($in{'type'} eq 'generic') { $in{'tport'} =~ /^\S+$/ || &error($text{'tunnels_egeneric'}); $in{'type'} .= ":".$in{'tport'}; } return ( $in{'type'}, $in{'zone'}, $in{'gateway_def'} ? '-' : $in{'gateway'}, $in{'gzones_def'} ? '-' : join(",", split(/\s+/, $in{'gzones'})) ); } ################################ hosts ################################## sub hosts_row { return ( $_[0], $_[1] =~ /^(\S+):(\S+)$/ ? ( $1, $2 ) : ( undef, undef ) ); } @host_options = ( "maclist", "routeback" ); if (&version_atleast(3)) { push(@host_options, "norfc1918", "blacklist", "tcpflags", "nosmurfs", "ipsec"); } sub hosts_form { print " $text{'hosts_0'}\n"; print ""; &zone_field("zone", $_[0], 0, 2); print " \n"; local ($iface, $net) = split(/:/, $_[1]); print " $text{'hosts_1'}\n"; print ""; &iface_field("iface", $iface); print " \n"; print " $text{'hosts_2'}\n"; print " \n"; print " $text{'hosts_opts'} \n"; &options_input("opts", $_[2], \@host_options); print " \n"; } sub hosts_validate { &check_ipaddress($in{'net'}) || $in{'net'} =~ /^(\S+)\/(\d+)$/ && &check_ipaddress($1) || &error($text{'hosts_enet'}); return ( $in{'zone'}, $in{'iface'}.":".$in{'net'}, join(",", split(/\0/, $in{'opts'})) ); } ################################ blacklist ################################## sub blacklist_row { return ( $_[0] eq '-' ? $text{'blacklist_any'} : $_[0], uc($_[1]) || $text{'blacklist_any'}, $_[2] || $text{'blacklist_any'} ); } @blacklist_protos = ( undef, 'tcp', 'udp', 'icmp' ); sub blacklist_form { print " $text{'blacklist_host'} \n"; local ($mode, $ipset, $mac, $ip); if ($_[0] =~ /^\+(.*)/) { $mode = 2; $ipset = $1; } elsif ($_[0] =~ /^\~(.*)$/) { $mode = 1; $mac = $1; } elsif ($_[0] eq '-') { $mode = 3; } else { $mode = 0; $ip = $_[0]; } print &ui_radio("host_def", $mode, [ [ 0, &text('hosts_ip', &ui_textbox("host", $ip, 30))."
    " ], [ 1, &text('hosts_mac', &ui_textbox("mac", $mac, 30))."
    " ], [ 3, $text{'hosts_any'}."
    " ], &version_atleast(3) ? ( [ 2, &text('hosts_ipset', &ui_textbox("ipset", $ipset, 15)) ] ) : ( ), ]); print " \n"; print " $text{'blacklist_proto'}\n"; print "\n"; printf " \n", $found ? "" : $_[1]; print " $text{'blacklist_ports'}\n"; print " \n"; } sub blacklist_validate { local $host; if ($in{'host_def'} == 0) { &check_ipaddress($in{'host'}) || $in{'host'} =~ /^(\S+)\/(\d+)$/ && &check_ipaddress($1) || &error($text{'blacklist_ehost'}); $host = $in{'host'}; } elsif ($in{'host_def'} == 1) { $in{'mac'} =~ s/:/-/g; $in{'mac'} =~ /^[0-9a-f]{2}(\-[0-9a-f]{2}){5}$/ || &error($text{'blacklist_emac'}); $host = "~".$in{'mac'}; } elsif ($in{'host_def'} == 2) { $in{'ipset'} =~ /^\S+$/ || &error($text{'blacklist_eipset'}); $host = "+".$in{'ipset'}; } elsif ($in{'host_def'} == 3) { $host = "-"; } local $proto; if ($in{'proto'} eq '*') { $in{'pother'} =~ /^\d+$/ || defined(getprotobyname($in{'pother'})) || &error($text{'blacklist_eproto'}); $proto = lc($in{'pother'}); } else { $proto = lc($in{'proto'}); } if ($proto eq "tcp" || $proto eq "udp") { $in{'ports'} =~ /^\S+$/ || &error($text{'blacklist_eports'}); } elsif ($in{'ports'}) { &error($text{'blacklist_eports2'}); } return ( $host, $proto, $in{'ports'} ); } ################################ providers ################################## sub providers_row { return ( $_[0], $_[1], $_[2], $_[4], $_[5] ); } @providers_opts = ( "track", "balance", "loose" ); sub providers_form { print " $text{'providers_name'}\n"; print "\n"; print "$text{'providers_number'}\n"; print " \n"; print " $text{'providers_iface'}\n"; print ""; &iface_field("iface", $_[4]); print "\n"; print "$text{'providers_mark'}\n"; print " \n"; print " $text{'providers_gateway'}\n"; print "\n"; local $ddef = $_[3] eq "-" || $_[3] eq "" ? 0 : $_[3] eq "main" ? 1 : 2; print "$text{'providers_dup'}\n"; print "",&ui_radio("dup_def", $ddef, [ [ 0, $text{'default'} ], [ 1, $text{'providers_main'} ], [ 2, &ui_textbox("dup", $ddef == 2 ? $_[3] : "", 5) ] ]), " \n"; local %opts = map { $_, 1 } split(/,/, $_[6]); print " $text{'providers_opts'} \n"; foreach my $o (@providers_opts) { print &ui_checkbox("opts", $o, $text{'providers_'.$o}, $opts{$o})."
    \n"; delete($opts{$o}); } foreach my $o (keys %opts) { print &ui_hidden("opts", $o),"\n"; } print "\n"; print "$text{'providers_copy'}\n"; print " \n"; } sub providers_validate { $in{'name'} =~ /^\S+$/ || &error($text{'providers_ename'}); $in{'number'} =~ /^\d+$/ || &error($text{'providers_enumber'}); $in{'mark'} =~ /^\d+$/ || &error($text{'providers_emark'}); $in{'dup_def'} < 2 || $in{'dup'} =~ /^\S+$/ || &error($text{'providers_edup'}); &check_ipaddress($in{'gateway'}) || &error($text{'providers_egateway'}); return ( $in{'name'}, $in{'number'}, $in{'mark'}, $in{'dup_def'} == 0 ? '-' : $in{'dup_def'} == 1 ? 'main' : $in{'dup'}, $in{'iface'}, $in{'gateway'}, join(",", split(/\0/, $in{'opts'})) || "-", $in{'copy'} || "-" ); } ############################## route_rules ################################ sub route_rules_row { return ( $_[0] eq "-" ? $text{'list_any'} : $_[0], $_[1] eq "-" ? $text{'list_any'} : $_[1], $_[2], $_[3], $_[4] ); } sub route_rules_form { print " $text{'route_rules_src'}\n"; print "",&ui_opt_textbox("src", $_[0] eq "-" ? "" : $_[0], 20, $text{'list_any'}, $text{'route_rules_ip'}), " \n"; print " $text{'route_rules_dst'}\n"; print "",&ui_opt_textbox("dst", $_[1] eq "-" ? "" : $_[1], 20, $text{'list_any'}, $text{'route_rules_ip'}), " \n"; local @ptable = &read_table_file("providers", \&standard_parser); print " $text{'route_rules_prov'}\n"; print "",&ui_select("prov", $_[2] eq "254" ? "main" : $_[2], [ [ "main", $text{'route_rules_main'} ], map { $_->[0] } @ptable ])," \n"; print " $text{'route_rules_pri'}\n"; print "",&ui_textbox("pri", $_[3], 10)," \n"; print " $text{'route_rules_mark'}\n"; print "",&ui_opt_textbox("mark", $_[4] eq "-" ? $_[4] : "", 10, $text{'route_rules_nomark'})," \n"; } sub route_rules_validate { $in{'src_def'} || $in{'src'} =~ /^\S+$/ || &error($text{'route_rules_esrc'}); $in{'dst_def'} || $in{'dst'} =~ /^\S+$/ || &error($text{'route_rules_edst'}); $in{'pri'} =~ /^\d+$/ || &error($text{'route_rules_epri'}); $in{'mark_def'} || $in{'mark'} =~ /^\d+(\/\d+)?$/ || &error($text{'route_rules_emark'}); return ( $in{'src_def'} ? "-" : $in{'src'}, $in{'dst_def'} ? "-" : $in{'dst'}, $in{'prov'}, $in{'pri'}, $in{'mark_def'} ? ( ) : ( $in{'mark'} ) ); } ################################ shorewall.conf ################################## sub conf_form { local ($msg1, $msg2, $msg3, $field1, $field2, $field3, $dummy) = @_; $field1 =~ s/"/"/g; print "$msg1\n"; print "\n"; $field2 =~ s/"/"/g; print "$msg2\n"; print "\n"; $field3 =~ s/"/"/g; print "$msg3\n"; print "\n"; print "\n"; } ################################ shorewall.conf ################################## sub shorewall_conf_columns { return 3; } sub shorewall_conf_form { &conf_form($text{'shorewall_conf_0'}, $text{'shorewall_conf_1'}, $text{'shorewall_conf_2'}, @_); } sub shorewall_conf_validate { &error($text{'shorewall_conf_varname'}) unless $in{'var'} =~ /^\w+$/; local $comment = ""; $comment = "\t# ".$in{'comment'} if (exists $in{'comment'} and $in{'comment'} ne ""); return ($in{'var'}.'='.$in{'val'}.$comment); } ################################ params ################################## sub params_columns { return 3; } sub params_form { &conf_form($text{'params_0'}, $text{'params_1'}, $text{'params_2'}, @_); } sub params_validate { &error($text{'params_varname'}) unless $in{'var'} =~ /^\w+$/; local $comment = ""; $comment = "\t# ".$in{'comment'} if (exists $in{'comment'} and $in{'comment'} ne ""); return ($in{'var'}.'='.$in{'val'}.$comment); } ############################################################################# # can_access(file) sub can_access { if ($access{'files'} eq '*') { return 1; } else { local @acc = split(/\s+/, $access{'files'}); return &indexof($_[0], @acc) >= 0; } } # run_before_apply_command() # Runs the before-applying command, if any. If it fails, returns the error # message output sub run_before_apply_command { if ($config{'before_apply_cmd'}) { local $out = &backquote_logged("($config{'before_apply_cmd'}) &1"); return $out if ($?); } return undef; } # run_after_apply_command() # Runs the after-applying command, if any sub run_after_apply_command { if ($config{'after_apply_cmd'}) { &system_logged("($config{'after_apply_cmd'}) /dev/null 2>&1"); } } # run_before_refresh_command() # Runs the before-refresh command, if any. If it fails, returns the error # message output sub run_before_refresh_command { if ($config{'before_refresh_cmd'}) { local $out = &backquote_logged("($config{'before_refresh_cmd'}) &1"); return $out if ($?); } return undef; } # run_after_refresh_command() # Runs the after-refresh command, if any sub run_after_refresh_command { if ($config{'after_refresh_cmd'}) { &system_logged("($config{'after_refresh_cmd'}) /dev/null 2>&1"); } } # list_standard_actions() # Returns a list of standard Shorewall actions sub list_standard_actions { local @rv; foreach my $a (split(/\t+/, $config{'actions'})) { open(ACTIONS, "<".$a); while() { s/\r|\n//g; s/#.*$//; s/\s+$//; if (/\S/) { push(@rv, $_); } } close(ACTIONS); } if (&version_atleast(3)) { # Add built-in actions push(@rv, "allowBcast", "dropBcast", "dropNotSyn", "rejNotSyn", "dropInvalid", "allowInvalid", "allowoutUPnP", "allowinUPnP", "forwardUPnP"); } return &unique(@rv); } # list_standard_macros() # Returns a list of all macro. actions sub list_standard_macros { local @rv; foreach my $a ($config{'config_dir'}, $config{'macros'}) { opendir(DIR, $a); foreach my $f (readdir(DIR)) { push(@rv, $1) if ($f =~ /^macro\.(.*)$/); } closedir(DIR); } return &unique(sort(@rv)); } $BETA_STR = "-Beta"; $BETA_NUM = "\.0000\."; # get_shorewall_version(nocache) sub get_shorewall_version { local ($nocache) = @_; local $version; if (!$nocache && open(VERSION, "<$module_config_directory/version")) { chop($version = ); close(VERSION); } if (!$version) { local $out = `$config{'shorewall'} version 2>&1`; $out =~ s/\r//g; $out =~ s/$BETA_STR/$BETA_NUM/i; # Convert beta string to version number. if ($out =~ /(\n|^)([0-9\.]+)\n/) { $version = $2; } } return $version; } sub get_printable_version($) { local $out = $_[0]; $out =~ s/$BETA_NUM/$BETA_STR/i; # Convert version number back to string. return $out; } sub list_protocols { local @stdprotos = ( 'tcp', 'udp', 'icmp' ); local @otherprotos; open(PROTOS, ") { s/\r|\n//g; s/#.*$//; push(@otherprotos, $1) if (/^(\S+)\s+(\d+)/); } close(PROTOS); @otherprotos = sort { lc($a) cmp lc($b) } @otherprotos; return &unique(@stdprotos, @otherprotos); } # options_input(name, value, &opts) sub options_input { local ($name, $value, $opts) = @_; local %opts = map { $_, 1 } split(/,/, $value); print "\n"; local $i = 0; foreach my $o (@$opts) { print "\n" if ($i%3 == 0); printf "\n", $o, $opts{$o} ? "checked" : "", $text{'opts_'.$o} || $o; print "\n" if ($i%3 == 2); delete($opts{$o}); $i++; } foreach $o (keys %opts) { print "\n"; } print "
    %s
    \n"; } 1;