mirror of
https://gitlab.com/shorewall/code.git
synced 2025-06-19 17:28:35 +02:00
Implement a more robust trace
Signed-off-by: Tom Eastep <teastep@shorewall.net>
This commit is contained in:
parent
ef4237f5a0
commit
b0733d93ee
@ -428,6 +428,23 @@ sub decr_cmd_level( $ ) {
|
|||||||
assert( --$_[0]->{cmdlevel} >= 0);
|
assert( --$_[0]->{cmdlevel} >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Trace a change to the chain table
|
||||||
|
#
|
||||||
|
sub trace( $$$ ) {
|
||||||
|
my ($chainref, $rulenum, $message) = @_;
|
||||||
|
|
||||||
|
my $heading = $rulenum ? sprintf "NF-----> $chainref->{table}:$chainref->{name}:$rulenum" : sprintf "NF-----> $chainref->{table}:$chainref->{name}";
|
||||||
|
|
||||||
|
my $length = length $heading;
|
||||||
|
|
||||||
|
if ( $length < 32 ) {
|
||||||
|
print $heading . ' ' x ( 32 - $length) . "$message\n";
|
||||||
|
} else {
|
||||||
|
print $heading . ' ' x 8 * ( ( $length + 8 ) / 8 ) . "$message\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Add run-time commands to a chain. Arguments are:
|
# Add run-time commands to a chain. Arguments are:
|
||||||
#
|
#
|
||||||
@ -440,6 +457,10 @@ sub add_commands ( $$;@ ) {
|
|||||||
|
|
||||||
push @{$chainref->{rules}}, join ('', $indentation , $_ ) for @_;
|
push @{$chainref->{rules}}, join ('', $indentation , $_ ) for @_;
|
||||||
|
|
||||||
|
if ( $debug ) {
|
||||||
|
print "CS-----> $chainref->{table}:$chainref->{name}\t${indentation}, $_\n" for @_;
|
||||||
|
}
|
||||||
|
|
||||||
$chainref->{referenced} = 1;
|
$chainref->{referenced} = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,6 +476,8 @@ sub push_rule( $$ ) {
|
|||||||
} else {
|
} else {
|
||||||
push @{$chainref->{rules}}, $rule;
|
push @{$chainref->{rules}}, $rule;
|
||||||
$chainref->{referenced} = 1;
|
$chainref->{referenced} = 1;
|
||||||
|
my $rulenum;
|
||||||
|
$rulenum=@{$chainref->{rules}}, trace( $chainref, $rulenum, $rule ) if $debug;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -577,9 +600,14 @@ sub add_reference ( $$ ) {
|
|||||||
sub purge_jump ( $$ ) {
|
sub purge_jump ( $$ ) {
|
||||||
my ( $fromref, $toref ) = @_;
|
my ( $fromref, $toref ) = @_;
|
||||||
my $to = $toref->{name};
|
my $to = $toref->{name};
|
||||||
|
my $rule = 0;
|
||||||
|
|
||||||
for ( @{$fromref->{rules}} ) {
|
for ( @{$fromref->{rules}} ) {
|
||||||
$_ = undef if defined && / -[gj] ${to}\b/;
|
$rule++;
|
||||||
|
if ( defined && / -[gj] ${to}\b/ ) {
|
||||||
|
trace( $fromref, undef, qq("$_" deleted) ) if $debug;
|
||||||
|
$_ = undef;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$toref->{referenced} = 0 unless @{$toref->{rules}};
|
$toref->{referenced} = 0 unless @{$toref->{rules}};
|
||||||
@ -600,8 +628,11 @@ sub insert_rule1($$$)
|
|||||||
assert( ! $chainref->{cmdlevel});
|
assert( ! $chainref->{cmdlevel});
|
||||||
|
|
||||||
$rule .= "-m comment --comment \"$comment\"" if $comment;
|
$rule .= "-m comment --comment \"$comment\"" if $comment;
|
||||||
|
$rule = join( ' ', '-A', $chainref->{name}, $rule );
|
||||||
|
|
||||||
splice( @{$chainref->{rules}}, $number, 0, join( ' ', '-A', $chainref->{name}, $rule ) );
|
splice( @{$chainref->{rules}}, $number, 0, $rule );
|
||||||
|
|
||||||
|
trace( $chainref, ++$number, $rule ) if $debug;
|
||||||
|
|
||||||
$iprangematch = 0;
|
$iprangematch = 0;
|
||||||
|
|
||||||
@ -698,6 +729,7 @@ sub move_rules( $$ ) {
|
|||||||
$chain2->{referenced} = 1;
|
$chain2->{referenced} = 1;
|
||||||
$chain1->{referenced} = 0;
|
$chain1->{referenced} = 0;
|
||||||
$chain1->{rules} = [];
|
$chain1->{rules} = [];
|
||||||
|
trace( $chain2, undef, "Moved $count rules from chain $chain1->{name}" ), trace( $chain1, undef, 'Invalidated' ) if $debug;
|
||||||
$count;
|
$count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -721,7 +753,9 @@ sub copy_rules( $$ ) {
|
|||||||
|
|
||||||
( s/\-([AI]) $name1(\b)/-$1 ${name2}$2/ ) for @rules;
|
( s/\-([AI]) $name1(\b)/-$1 ${name2}$2/ ) for @rules;
|
||||||
|
|
||||||
pop @$rules; # Delete the jump to chain1
|
my $last = pop @$rules; # Delete the jump to chain1
|
||||||
|
|
||||||
|
trace( $chain2, undef, "$count rules appended from chain $chain1->{name}" ) if $debug;
|
||||||
|
|
||||||
push @$rules, @rules;
|
push @$rules, @rules;
|
||||||
#
|
#
|
||||||
@ -733,7 +767,11 @@ sub copy_rules( $$ ) {
|
|||||||
|
|
||||||
unless ( --$chain1->{references}{$name2} ) {
|
unless ( --$chain1->{references}{$name2} ) {
|
||||||
delete $chain1->{references}{$name2};
|
delete $chain1->{references}{$name2};
|
||||||
$chain1->{referenced} = 0, progress_message " Unreferenced chain $name1 deleted" unless keys %{$chain1->{references}};
|
unless ( keys %{$chain1->{references}} ) {
|
||||||
|
$chain1->{referenced} = 0;
|
||||||
|
progress_message " Unreferenced chain $name1 deleted";
|
||||||
|
trace( $chain1, undef, 'Invalidated' ) if $debug;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1333,7 +1371,19 @@ sub optimize_chain( $ ) {
|
|||||||
$count = 0;
|
$count = 0;
|
||||||
|
|
||||||
for my $fromref ( map $filter_table->{$_} , keys %{$chainref->{references}} ) {
|
for my $fromref ( map $filter_table->{$_} , keys %{$chainref->{references}} ) {
|
||||||
defined && s/ -[jg] $chainref->{name}$/ -j ACCEPT/ && $count++ for @{$fromref->{rules}};
|
my $rule = 0;
|
||||||
|
for ( @{$fromref->{rules}} ) {
|
||||||
|
$rule++;
|
||||||
|
|
||||||
|
if ( defined ) {
|
||||||
|
my $before;
|
||||||
|
$before = $_ if $debug;
|
||||||
|
if ( s/ -[jg] $chainref->{name}$/ -j ACCEPT/ ) {
|
||||||
|
$count++;
|
||||||
|
trace( $chainref, $rule, qq("$before" changed to "$_") ) if $debug;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
progress_message " $count references to ACCEPT policy chain $chainref->{name} replaced";
|
progress_message " $count references to ACCEPT policy chain $chainref->{name} replaced";
|
||||||
@ -1352,8 +1402,15 @@ sub delete_references( $ ) {
|
|||||||
my $count = 0;
|
my $count = 0;
|
||||||
|
|
||||||
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
||||||
|
my $rule = 0;
|
||||||
for ( @{$fromref->{rules}} ) {
|
for ( @{$fromref->{rules}} ) {
|
||||||
$_ = undef, $count++ if defined && / -[jg] $chainref->{name}$/;
|
$rule++;
|
||||||
|
|
||||||
|
if ( defined && / -[jg] $chainref->{name}$/ ) {
|
||||||
|
trace( $fromref, $rule, qq("$_" deleted) ) if $debug;
|
||||||
|
$_ = undef;
|
||||||
|
$count++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1382,7 +1439,18 @@ sub replace_references( $$ ) {
|
|||||||
#
|
#
|
||||||
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
||||||
if ( $fromref->{referenced} ) {
|
if ( $fromref->{referenced} ) {
|
||||||
defined && s/ -([jg]) $chainref->{name}(\b)/ -$1 ${target}$2/ && $count++ for @{$fromref->{rules}};
|
my $rule = 0;
|
||||||
|
for ( @{$fromref->{rules}} ) {
|
||||||
|
$rule++;
|
||||||
|
if ( defined ) {
|
||||||
|
my $before;
|
||||||
|
$before = $_ if $debug;
|
||||||
|
if ( s/ -([jg]) $chainref->{name}(\b)/ -$1 ${target}$2/ ) {
|
||||||
|
$count++;
|
||||||
|
trace( $fromref, $rule, qq("$before" changed to "$_") ) if $debug;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1391,7 +1459,18 @@ sub replace_references( $$ ) {
|
|||||||
#
|
#
|
||||||
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
||||||
if ( $fromref->{referenced} ) {
|
if ( $fromref->{referenced} ) {
|
||||||
defined && s/ -[jg] $chainref->{name}(\b)/ -j ${target}$1/ && $count++ for @{$fromref->{rules}};
|
my $rule = 0;
|
||||||
|
for ( @{$fromref->{rules}} ) {
|
||||||
|
$rule++;
|
||||||
|
if ( defined ) {
|
||||||
|
my $before;
|
||||||
|
$before = $_ if $debug;
|
||||||
|
if ( s/ -[jg] $chainref->{name}(\b)/ -j ${target}$1/ ) {
|
||||||
|
$count++ ;
|
||||||
|
trace( $fromref, $rule, qq( "$before" changed to "$_") ) if $debug;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1418,14 +1497,21 @@ sub replace_references1( $$$ ) {
|
|||||||
#
|
#
|
||||||
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
||||||
if ( $fromref->{referenced} ) {
|
if ( $fromref->{referenced} ) {
|
||||||
|
my $rule = 0;
|
||||||
for ( @{$fromref->{rules}} ) {
|
for ( @{$fromref->{rules}} ) {
|
||||||
if ( defined && /^-A $fromref->{name} .*-[jg] $chainref->{name}\b/ ) {
|
$rule++;
|
||||||
#
|
if ( defined ) {
|
||||||
# Prevent multiple '-p' matches
|
if ( /^-A $fromref->{name} .*-[jg] $chainref->{name}\b/ ) {
|
||||||
#
|
my $before;
|
||||||
s/ -p [^ ]+ / / if / -p / && $matches =~ / -p /;
|
$before = $_ if $debug;
|
||||||
s/\s+-([jg]) $chainref->{name}(\b)/$matches -$1 ${target}$2/;
|
#
|
||||||
$count++;
|
# Prevent multiple '-p' matches
|
||||||
|
#
|
||||||
|
s/ -p [^ ]+ / / if / -p / && $matches =~ / -p /;
|
||||||
|
s/\s+-([jg]) $chainref->{name}(\b)/$matches -$1 ${target}$2/;
|
||||||
|
$count++;
|
||||||
|
trace( $fromref, $rule, qq( "$before" changed to "$_") ) if $debug;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1435,15 +1521,22 @@ sub replace_references1( $$$ ) {
|
|||||||
# The target is a builtin -- we must use '-j'
|
# The target is a builtin -- we must use '-j'
|
||||||
#
|
#
|
||||||
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
for my $fromref ( map $chain_table{$table}{$_} , keys %{$chainref->{references}} ) {
|
||||||
|
my $rule = 0;
|
||||||
if ( $fromref->{referenced} ) {
|
if ( $fromref->{referenced} ) {
|
||||||
for ( @{$fromref->{rules}} ) {
|
for ( @{$fromref->{rules}} ) {
|
||||||
if ( defined && /^-A $fromref->{name} .*-[jg] $chainref->{name}\b/ ) {
|
$rule++;
|
||||||
#
|
if ( defined ) {
|
||||||
# Prevent multiple '-p' matches
|
if ( /^-A $fromref->{name} .*-[jg] $chainref->{name}\b/ ) {
|
||||||
#
|
my $before;
|
||||||
s/ -p [^ ]+ / / if / -p / && $matches =~ / -p /;
|
$before = $_ if $debug;
|
||||||
s/\s+-[jg] $chainref->{name}(\b)/$matches -j ${target}$1/;
|
#
|
||||||
$count++;
|
# Prevent multiple '-p' matches
|
||||||
|
#
|
||||||
|
s/ -p [^ ]+ / / if / -p / && $matches =~ / -p /;
|
||||||
|
s/\s+-[jg] $chainref->{name}(\b)/$matches -j ${target}$1/;
|
||||||
|
$count++;
|
||||||
|
trace( $fromref, $rule, qq( "$before" changed to "$_") ) if $debug;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ use Shorewall::Raw;
|
|||||||
our @ISA = qw(Exporter);
|
our @ISA = qw(Exporter);
|
||||||
our @EXPORT = qw( compiler );
|
our @EXPORT = qw( compiler );
|
||||||
our @EXPORT_OK = qw( $export );
|
our @EXPORT_OK = qw( $export );
|
||||||
our $VERSION = '4.4_8';
|
our $VERSION = '4.4_9';
|
||||||
|
|
||||||
our $export;
|
our $export;
|
||||||
|
|
||||||
@ -881,9 +881,9 @@ sub compiler {
|
|||||||
#
|
#
|
||||||
# Just checking the configuration
|
# Just checking the configuration
|
||||||
#
|
#
|
||||||
if ( $preview ) {
|
if ( $preview || $debug ) {
|
||||||
#
|
#
|
||||||
# User wishes to preview the ruleset -- generate the rule matrix
|
# User wishes to preview the ruleset or we are tracing -- generate the rule matrix
|
||||||
#
|
#
|
||||||
generate_matrix;
|
generate_matrix;
|
||||||
|
|
||||||
@ -899,7 +899,7 @@ sub compiler {
|
|||||||
optimize_ruleset if $config{OPTIMIZE} & 4;
|
optimize_ruleset if $config{OPTIMIZE} & 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
preview_netfilter_load;
|
preview_netfilter_load if $preview;
|
||||||
}
|
}
|
||||||
#
|
#
|
||||||
# Re-initialize the chain table so that process_routestopped() has the same
|
# Re-initialize the chain table so that process_routestopped() has the same
|
||||||
|
@ -118,6 +118,7 @@ our %EXPORT_TAGS = ( internal => [ qw( create_temp_script
|
|||||||
$doing
|
$doing
|
||||||
$done
|
$done
|
||||||
$currentline
|
$currentline
|
||||||
|
$debug
|
||||||
%config
|
%config
|
||||||
%globals
|
%globals
|
||||||
|
|
||||||
@ -880,7 +881,7 @@ sub in_hexp( $ ) {
|
|||||||
sub emit {
|
sub emit {
|
||||||
assert( $script_enabled );
|
assert( $script_enabled );
|
||||||
|
|
||||||
if ( $script ) {
|
if ( $script || $debug ) {
|
||||||
#
|
#
|
||||||
# 'compile' as opposed to 'check'
|
# 'compile' as opposed to 'check'
|
||||||
#
|
#
|
||||||
@ -890,10 +891,20 @@ sub emit {
|
|||||||
$line =~ s/^\n// if $lastlineblank;
|
$line =~ s/^\n// if $lastlineblank;
|
||||||
$line =~ s/^/$indent/gm if $indent;
|
$line =~ s/^/$indent/gm if $indent;
|
||||||
$line =~ s/ /\t/gm;
|
$line =~ s/ /\t/gm;
|
||||||
print $script "$line\n";
|
print $script "$line\n" if $script;
|
||||||
$lastlineblank = ( substr( $line, -1, 1 ) eq "\n" );
|
$lastlineblank = ( substr( $line, -1, 1 ) eq "\n" );
|
||||||
|
|
||||||
|
if ( $debug ) {
|
||||||
|
$line =~ s/^\n//;
|
||||||
|
$line =~ s/\n/\nCS-----> /g;
|
||||||
|
print "CS-----> $line\n";
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
print $script "\n" unless $lastlineblank;
|
unless ( $lastlineblank ) {
|
||||||
|
print $script "\n" if $script;
|
||||||
|
print "CS-----> \n" if $debug;
|
||||||
|
}
|
||||||
|
|
||||||
$lastlineblank = 1;
|
$lastlineblank = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -998,7 +1009,7 @@ sub timestamp() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#
|
#
|
||||||
# Write a message if $verbosity >= 2
|
# Write a message if $verbosity >= 2.
|
||||||
#
|
#
|
||||||
sub progress_message {
|
sub progress_message {
|
||||||
my $havelocaltime = 0;
|
my $havelocaltime = 0;
|
||||||
@ -1801,6 +1812,7 @@ sub read_a_line() {
|
|||||||
|
|
||||||
$currentline = '';
|
$currentline = '';
|
||||||
} else {
|
} else {
|
||||||
|
print "IN===> $currentline\n" if $debug;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1822,6 +1834,7 @@ sub read_a_line1() {
|
|||||||
$currentline =~ s/#.*$//; # Remove Trailing Comments
|
$currentline =~ s/#.*$//; # Remove Trailing Comments
|
||||||
fatal_error "Non-ASCII gunk in file" if $currentline =~ /[^\s[:print:]]/;
|
fatal_error "Non-ASCII gunk in file" if $currentline =~ /[^\s[:print:]]/;
|
||||||
$currentlinenumber = $.;
|
$currentlinenumber = $.;
|
||||||
|
print "IN===> $currentline\n" if $debug;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2047,7 +2060,7 @@ sub load_kernel_modules( ) {
|
|||||||
|
|
||||||
$loadedmodules{$_}++ for split_list( $config{DONT_LOAD}, 'module' );
|
$loadedmodules{$_}++ for split_list( $config{DONT_LOAD}, 'module' );
|
||||||
|
|
||||||
progress_message "Loading Modules...";
|
progress_message2 "Loading Modules...";
|
||||||
|
|
||||||
open LSMOD , '-|', 'lsmod' or fatal_error "Can't run lsmod";
|
open LSMOD , '-|', 'lsmod' or fatal_error "Can't run lsmod";
|
||||||
|
|
||||||
@ -2607,6 +2620,8 @@ sub process_shorewall_conf() {
|
|||||||
if ( -r _ ) {
|
if ( -r _ ) {
|
||||||
open_file $file;
|
open_file $file;
|
||||||
|
|
||||||
|
first_entry "Processing $file...";
|
||||||
|
|
||||||
while ( read_a_line ) {
|
while ( read_a_line ) {
|
||||||
if ( $currentline =~ /^\s*([a-zA-Z]\w*)=(.*?)\s*$/ ) {
|
if ( $currentline =~ /^\s*([a-zA-Z]\w*)=(.*?)\s*$/ ) {
|
||||||
my ($var, $val) = ($1, $2);
|
my ($var, $val) = ($1, $2);
|
||||||
@ -3093,7 +3108,7 @@ sub run_user_exit( $ ) {
|
|||||||
my $file = find_file $chainref->{name};
|
my $file = find_file $chainref->{name};
|
||||||
|
|
||||||
if ( -f $file ) {
|
if ( -f $file ) {
|
||||||
progress_message "Processing $file...";
|
progress_message2 "Processing $file...";
|
||||||
|
|
||||||
my $command = qq(package Shorewall::User;\nno strict;\n# line 1 "$file"\n) . `cat $file`;
|
my $command = qq(package Shorewall::User;\nno strict;\n# line 1 "$file"\n) . `cat $file`;
|
||||||
|
|
||||||
@ -3114,7 +3129,7 @@ sub run_user_exit1( $ ) {
|
|||||||
my $file = find_file $_[0];
|
my $file = find_file $_[0];
|
||||||
|
|
||||||
if ( -f $file ) {
|
if ( -f $file ) {
|
||||||
progress_message "Processing $file...";
|
progress_message2 "Processing $file...";
|
||||||
#
|
#
|
||||||
# File may be empty -- in which case eval would fail
|
# File may be empty -- in which case eval would fail
|
||||||
#
|
#
|
||||||
@ -3145,7 +3160,7 @@ sub run_user_exit2( $$ ) {
|
|||||||
my ($file, $chainref) = ( find_file $_[0], $_[1] );
|
my ($file, $chainref) = ( find_file $_[0], $_[1] );
|
||||||
|
|
||||||
if ( -f $file ) {
|
if ( -f $file ) {
|
||||||
progress_message "Processing $file...";
|
progress_message2 "Processing $file...";
|
||||||
#
|
#
|
||||||
# File may be empty -- in which case eval would fail
|
# File may be empty -- in which case eval would fail
|
||||||
#
|
#
|
||||||
|
Loading…
x
Reference in New Issue
Block a user