用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

127 lines
3.9 KiB

# Purpose:
# Simple search with Perl for a pattern in some file.
#
# The advantages compared to thinkable auxiliary constructs using the
# mysqltest language and SQL are:
# 1. We do not need a running MySQL server.
# 2. SQL causes "noise" during debugging and increases the size of logs.
# Perl code does not disturb at all.
#
# The environment variables SEARCH_FILE and SEARCH_PATTERN must be set
# before sourcing this routine.
#
# In case of
# - SEARCH_FILE and/or SEARCH_PATTERN is not set
# - SEARCH_FILE cannot be opened
# the test will abort immediate.
perl;
use strict;
my $search_file= $ENV{'SEARCH_FILE'} or die "SEARCH_FILE not set";
my $search_pattern= $ENV{'SEARCH_PATTERN'} or die "SEARCH_PATTERN not set";
my $search_echo= $ENV{'SEARCH_ECHO'} || "NONE";
my $ignore_pattern= $ENV{'IGNORE_PATTERN'} || "";
my $search_echo_ctx= $ENV{'SEARCH_ECHO_CTX'} || 0;
open(FILE, "< $search_file") or die("Unable to open '$search_file': $!\n");
# We include the current line and 'n' previous lines in its context
# as a FIFO queue i.e., oldest entries in the queue are removed when
# new lines are read from the file.
my @context= (undef) x ($search_echo_ctx + 1);
my $line;
my $flag= 0;
# Read the file line by line
while ($line= <FILE>)
{
my $cur_lineno= $.;
my $file_pos= tell(FILE);
# Context stored as a sliding window of size 'n' lines
shift @context;
push @context, $line;
if ($line =~ /$search_pattern/)
{
if (!(length $ignore_pattern) or !($line =~ /$ignore_pattern/))
{
# Line matches the specified pattern
$flag= 1;
if ($search_echo eq 'FIRST')
{
print_current_and_previous_n_lines($search_echo_ctx,
$cur_lineno);
print_succeeding_n_lines($search_echo_ctx, $cur_lineno)
if ($search_echo_ctx > 0);
last;
}
elsif ($search_echo eq 'ALL')
{
print_current_and_previous_n_lines($search_echo_ctx,
$cur_lineno);
if ($search_echo_ctx > 0)
{
print_succeeding_n_lines($search_echo_ctx, $cur_lineno);
# Return to current file position after reading 'n'
# succeeding lines
seek(FILE, $file_pos, 0);
$.= $cur_lineno;
# Separate each matching line
print "---\n";
}
}
}
}
}
if ($flag == 1)
{
print "Pattern \"$search_pattern\" found\n";
}
else
{
print "Pattern \"$search_pattern\" not found\n";
}
close(FILE);
sub print_current_and_previous_n_lines()
{
my ($search_echo_ctx, $cur_lineno)= @_;
my $start_lineno= $cur_lineno - $search_echo_ctx;
$cur_lineno= $start_lineno > 0 ? $start_lineno: 1;
for my $ctx_line (@context)
{
next if not defined $ctx_line;
print "$cur_lineno: $ctx_line";
$cur_lineno++;
}
}
sub print_succeeding_n_lines()
{
# Read the next 'n' lines from the file (excluding the current
# line) and print them
my ($search_echo_ctx, $cur_lineno)= @_;
my $end_lineno= $cur_lineno + $search_echo_ctx;
while ($line= <FILE>)
{
last if ($. > $end_lineno);
print "$.: $line";
}
}
EOF
# Setting the env vars to default value
let SEARCH_ECHO=NONE;
let IGNORE_PATTERN=;
let SEARCH_ECHO_CTX=0;