use String::ShellQuote;
use Time::HiRes qw(usleep gettimeofday tv_interval);
+# avoid warning when parsing long hex values with hex()
+no warnings 'portable'; # Support for 64-bit ints required
+
our @EXPORT_OK = qw(
$IPV6RE
$IPV4RE
}
sub dump_logfile {
- my ($filename, $start, $limit) = @_;
+ my ($filename, $start, $limit, $filter) = @_;
my $lines = [];
my $count = 0;
$limit = 50 if !$limit;
my $line;
- while (defined($line = <$fh>)) {
- next if $count++ < $start;
- next if $limit <= 0;
- chomp $line;
- push @$lines, { n => $count, t => $line};
- $limit--;
+
+ if ($filter) {
+ # duplicate code, so that we do not slow down normal path
+ while (defined($line = <$fh>)) {
+ next if $line !~ m/$filter/;
+ next if $count++ < $start;
+ next if $limit <= 0;
+ chomp $line;
+ push @$lines, { n => $count, t => $line};
+ $limit--;
+ }
+ } else {
+ while (defined($line = <$fh>)) {
+ next if $count++ < $start;
+ next if $limit <= 0;
+ chomp $line;
+ push @$lines, { n => $count, t => $line};
+ $limit--;
+ }
}
close($fh);
}
}
+sub assert_if_modified {
+ my ($digest1, $digest2) = @_;
+
+ if ($digest1 && $digest2 && ($digest1 ne $digest2)) {
+ die "detected modified configuration - file changed by other user? Try again.\n";
+ }
+}
+
+# Digest for short strings
+# like FNV32a, but we only return 31 bits (positive numbers)
+sub fnv31a {
+ my ($string) = @_;
+
+ my $hval = 0x811c9dc5;
+
+ foreach my $c (unpack('C*', $string)) {
+ $hval ^= $c;
+ $hval += (
+ (($hval << 1) ) +
+ (($hval << 4) ) +
+ (($hval << 7) ) +
+ (($hval << 8) ) +
+ (($hval << 24) ) );
+ $hval = $hval & 0xffffffff;
+ }
+ return $hval & 0x7fffffff;
+}
+
+sub fnv31a_hex { return sprintf("%X", fnv31a(@_)); }
+
1;