[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [OSSTEST PATCH 1/7] DhcpWatch: extract dhcp3 parsing into separate function
Preparation for dnsmasq support. Keep generic code in check_ip, but extract format-specific handling into separat function. No intentional behaviour change (besides slightly different warning reporting). Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> --- Osstest/DhcpWatch/leases.pm | 131 ++++++++++++++++++++----------------- 1 file changed, 71 insertions(+), 60 deletions(-) diff --git a/Osstest/DhcpWatch/leases.pm b/Osstest/DhcpWatch/leases.pm index 98c22b9..5ec305f 100644 --- a/Osstest/DhcpWatch/leases.pm +++ b/Osstest/DhcpWatch/leases.pm @@ -48,68 +48,20 @@ sub new { }, $class; } -sub check_ip ($$) { - my ($mo, $gho) = @_; - - my $leases; - my $leasesfn = $mo->{Source}; - - if ($leasesfn =~ m,/,) { - $leases= new IO::File $leasesfn, 'r'; - if (!defined $leases) { return "open $leasesfn: $!"; } - } else { - $leases= new IO::Socket::INET(PeerAddr => $leasesfn); - if (!defined $leases) { return "connect to $leasesfn: $!"; } - } - - my $lstash= "dhcpleases-$gho->{Guest}"; +sub parse_dhcp_dhcp3($$$$) { + my ($gho, $leases, $copy, $leasesfn) = @_; my $inlease; my $props; my $best; - my @warns; - - my $copy= new IO::File "$stash/$lstash.new", 'w'; - $copy or die "$lstash.new $!"; - - my $saveas= sub { - my ($fn,$keep) = @_; - - while (<$leases>) { print $copy $_ or die $!; } - die $! unless $leases->eof; - - my $rename= sub { - my ($src,$dst) = @_; - rename "$stash/$src", "$stash/$dst" - or $!==&ENOENT - or die "rename $fn.$keep $!"; - }; - while (--$keep>0) { - $rename->("$fn.$keep", "$fn.".($keep+1)); - } - if ($keep>=0) { - die if $keep; - $rename->("$fn", "$fn.$keep"); - } - $copy->close(); - rename "$stash/$lstash.new", "$stash/$fn" or die "$lstash.new $fn $!"; - logm("warning: $_") foreach grep { defined } @warns[0..5]; - # logm("$fn: rotated and stashed current leases"); - }; - - my $badleases= sub { - my ($m) = @_; - $m= "$leasesfn:$.: unknown syntax"; - $saveas->("$lstash.bad", 7); - return $m; - }; while (<$leases>) { print $copy $_ or die $!; chomp; s/^\s+//; s/\s+$//; next if m/^\#/; next unless m/\S/; + if (m/^lease\s+([0-9.]+)\s+\{$/) { - return $badleases->("lease inside lease") if defined $inlease; + die "lease inside lease" if defined $inlease; $inlease= $1; $props= { }; next; @@ -122,13 +74,13 @@ sub check_ip ($$) { s/^( [-a-z0-9]+ ) \s+//x or - return $badleases->("unknown syntax"); + die "unknown syntax"; my $prop= $1; - s/\s*\;$// or return $badleases->("missing semicolon"); + s/\s*\;$// or die "missing semicolon"; $props->{$prop}= $_; next; } - return $badleases->("end lease not inside lease") + die "end lease not inside lease" unless defined $inlease; $props->{' addr'}= $inlease; @@ -144,25 +96,84 @@ sub check_ip ($$) { my @missing= grep { !defined $props->{$_} } ('binding state', 'hardware ethernet', 'ends'); if (@missing) { - push @warns, "$leasesfn:$.: lease without \`$_'" + warn "$leasesfn:$.: lease without \`$_'" foreach @missing; next; } - # ignore leases for other hosts - next unless lc $props->{'hardware ethernet'} eq lc $gho->{Ether}; - $props->{' ends'}= $props->{'ends'}; $props->{' ends'} =~ s/^[0-6]\s+(\S+)\s+(\d+)\:(\d+\:\d+)$/ sprintf "%s %02d:%s", $1,$2,$3 /e - or return $badleases->("unexpected syntax for ends"); + or die "unexpected syntax for ends"; + + # ignore leases for other hosts + next unless lc $props->{'hardware ethernet'} eq lc $gho->{Ether}; next if $best && $best->{' ends'} gt $props->{' ends'}; $best= $props; } + return $best; +} + +sub check_ip ($$) { + my ($mo, $gho) = @_; + + my $leases; + my $leasesfn = $mo->{Source}; + + if ($leasesfn =~ m,/,) { + $leases= new IO::File $leasesfn, 'r'; + if (!defined $leases) { return "open $leasesfn: $!"; } + } else { + $leases= new IO::Socket::INET(PeerAddr => $leasesfn); + if (!defined $leases) { return "connect to $leasesfn: $!"; } + } + + my $lstash= "dhcpleases-$gho->{Guest}"; + my $best; + + my $copy= new IO::File "$stash/$lstash.new", 'w'; + $copy or die "$lstash.new $!"; + + my $saveas= sub { + my ($fn,$keep) = @_; + + while (<$leases>) { print $copy $_ or die $!; } + die $! unless $leases->eof; + + my $rename= sub { + my ($src,$dst) = @_; + rename "$stash/$src", "$stash/$dst" + or $!==&ENOENT + or die "rename $fn.$keep $!"; + }; + while (--$keep>0) { + $rename->("$fn.$keep", "$fn.".($keep+1)); + } + if ($keep>=0) { + die if $keep; + $rename->("$fn", "$fn.$keep"); + } + $copy->close(); + rename "$stash/$lstash.new", "$stash/$fn" or die "$lstash.new $fn $!"; + # logm("$fn: rotated and stashed current leases"); + }; + + my $badleases= sub { + my ($m) = @_; + $m= "$leasesfn:$.: unknown syntax " . $m; + $saveas->("$lstash.bad", 7); + return $m; + }; + + eval { $best = parse_dhcp_dhcp3($gho, $leases, $copy, $leasesfn) }; + if ($@) { + return $badleases->($@); + } + if (!$best) { $saveas->("$lstash.nolease", 3); if ($leases->error) { -- git-series 0.9.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |