Changeset 510af91f4bbc80c9d2f68c4b188af3b3a63a93b4

Show
Ignore:
Timestamp:
07/13/12 19:10:05 (2 years ago)
Author:
Mark Harrison <mark@mivok.net>
git-committer:
Mark Harrison <mark@mivok.net> 1342206605 -0700
git-parent:

[994c44e9c01b368bd18681bfb1fa4faafd8aae16], [d6ffeb10c8682f44e32db2c28923cdb91ff5713a]

git-author:
Mark Harrison <mark@mivok.net> 1342206605 -0700
Message:

Merge pull request #11 from seriv/master

support for HOSTS ALLOW/DENY in resmon.conf and fix regexp check in nagios plugin to match '$'

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • lib/Resmon/Config.pm

    r7ed1a17 rd6ffeb1  
    66use Sys::Hostname; 
    77 
     8 
     9sub split_ip_list { 
     10# this code is taken from  Marcel Gruenauer's <marcel@cpan.org> CPAN module Net::IP::Match 
     11    my $string = shift;  
     12    my $allow = shift; 
     13    my (@result,$quad,$bits,$matchbits,$int,$mask); 
     14    for (split (/\s*[,\s]\s*/, $string)) { 
     15       ($quad, $bits) = m!^(\d+\.\d+\.\d+\.\d+)(?:/(\d+))?!g; 
     16       $bits = 32 unless (defined($bits) && $bits ne ''); 
     17       $matchbits = 32 - $bits; 
     18       $int = unpack("N", pack("C4", split(/\./,$quad))); 
     19       $mask = $int >> $matchbits; 
     20       push @result => {mask => $mask, bits => $matchbits, allow => $allow}; 
     21print STDERR "mask=$mask,bits=$matchbits,allow=$allow\n"; 
     22    } 
     23    return \@result; 
     24} 
    825sub new { 
    926    my $class = shift; 
     
    131148                $self->{authpass} = $1; 
    132149                next; 
     150            } 
     151            elsif(/\s*HOSTS\s+ALLOW\s+([^;]+)\s*;\s*/) { 
     152                push (@{$self->{hostsallow}}, @{split_ip_list($1,1)}); 
     153                next; 
     154            } 
     155            elsif(/\s*HOSTS\s+DENY\s+([^;]+)\s*;\s*/) { 
     156                push (@{$self->{hostsallow}}, @{split_ip_list($1,0)}); 
     157                next; 
    133158            } elsif(/\s*INCLUDE\s+(\S+)\s*;\s*/) { 
    134159                my $incglob = $1; 
  • lib/Resmon/Status.pm

    re892f81 rba4f134  
    442442    $self->{authuser} = shift; 
    443443    $self->{authpass} = shift; 
     444    my $hostsallow = shift; 
     445 
    444446    if(!defined($ip) || $ip eq '' || $ip eq '*') { 
    445447        $ip = INADDR_ANY; 
     
    470472                my $client = $handle->accept; 
    471473                next unless $client; 
     474                my $hersockaddr    = getpeername($client); 
     475                my ($port, $iaddr) = sockaddr_in($hersockaddr); 
     476                my $denied; 
     477                 for my $el (@{$hostsallow}) { 
     478                  my $tmp = unpack("N",$iaddr); 
     479                  $tmp = $tmp >> $el->{bits} if $el->{bits}; 
     480                  if ($tmp == $el->{mask}) { 
     481                    $denied = !$el->{allow}; 
     482                    last; 
     483                  } 
     484                } 
     485                if ($denied) { 
     486                  my $response = "<html><head><title>IP denied</title></head>" . 
     487                  "<body><h1>IP denied</h1></body></html>"; 
     488                  $client->print(http_header(401, length($response), 'text/html', $denied)); 
     489                  $client->print($response . "\r\n"); 
     490                  $client->close(); 
     491                  next 
     492                }; 
    472493                my $req; 
    473494                my $proto; 
  • resmon

    rd710bcb rba4f134  
    8585$status->open(); 
    8686$status->serve_http_on($config->{interface}, $config->{port}, 
    87         $config->{authuser}, $config->{authpass}
     87        $config->{authuser}, $config->{authpass}, $config->{hostsallow}
    8888    if($config->{port}); 
    8989 
  • resmon.conf.sample

    r0bd15e6 rba4f134  
    33STATUSFILE /var/run/resmon-status.txt; 
    44TIMEOUT 10; 
     5 
     6HOSTS ALLOW 10.80.116.112, 127.0.0.1; 
     7# HOSTS {ALLOW/DENY} lists are the coma or blank separated lists of 
     8# a dotted decimal IPv4 addresses of the form a.b.c.d. to match incoming machine’s IP address exactly, 
     9# or an 'ipaddr/n' where ipaddr is the IP address and n is the number of one bits in the netmask. 
     10# the first match gives the result, if nothing matches IP is allowed. 
     11HOSTS DENY 10.80.117.128/25 
     12HOSTS ALLOW 10.80.116.0/23 
     13HOSTS DENY 0.0.0.0/0; 
    514 
    615# Resmon health check. Shows the hostname, svn revision and 
  • resources/check_resmon_metric

    r880c6ce rcd3c2b0  
    375375  
    376376    if (defined $regex) { 
     377        if (!defined($value)) { 
     378          $value = ''; 
     379        } 
    377380        if ($value =~ /$regex/) { 
    378381            $state = "OK";