#!/usr/bin/perl use strict; use warnings; use Carp; use English '-no_match_vars'; use feature qw/switch/; use Hgldns; use Net::DNS::Nameserver; use Hgltools::Hglreadfile; use XML::Simple; use Data::Dumper; use threads; use threads::shared; use Hglmonitor; my $monitordb :shared; share ($monitordb); my $xs = XML::Simple->new(); my $xmlconfig = \$xs->XMLin('./serverdb.xml'); my $ns = new Net::DNS::Nameserver( LocalAddr => '127.0.0.1', LocalPort => '53', ReplyHandler => \&call_resolver, Verbose => 1 ) or croak "couldn't create nameserver object $ERRNO\n"; my $hgldns = Hgldns->new(); sub call_hostchecker { my $ref = shift; my $m = Hglmonitor->new(); while (1) { my $i=0; print "start hostcheck \n"; while ( $ref->{address}->[$i] ) { my $r; if ( $ref->{address}->[$i]->{check}->{type} eq 'http' ) { $r = $m->monitor({checktype=>$ref->{address}->[$i]->{check}->{type}, ip=>$ref->{address}->[$i]->{ip}, port=>$ref->{address}->[$i]->{port}, response=>$ref->{address}->[$i]->{check}->{response}, url=>$ref->{address}->[$i]->{check}->{url},}); } else { $r = $m->monitor({checktype=>$ref->{address}->[$i]->{check}->{type},ip=>$ref->{address}->[$i]->{ip},}); } $ref->{address}->[$i]->{status} = $r; my $cl_ref = shared_clone ({obj => $ref}); bless $cl_ref,'Status'; $monitordb = $cl_ref; $i++; } sleep $ref->{interval}; } return ; } sub call_resolver { my ($qname, $qclass, $qtype, $peerhost,$query,$conn) = @_; print Dumper $monitordb; if ( $qtype ne 'A' ) { # #my @resolver = $hgldns->resolv({type=>$qtype,name=>$qname,class=>$qclass}); $hgldns->resolv({type=>$qtype,name=>$qname,class=>$qclass}); } else { # $hgldns->resolv({type=>$qtype,name=>$qname,class=>$qclass}); $hgldns->prox_engine({type=>$qtype,name=>$qname,class=>$qclass,monitordb=>\$monitordb,}); } } #$ns->loop_once(60); #call_hostchecker(${$xmlconfig}); my $monitor = threads->create(\&call_hostchecker,${$xmlconfig}) ; $ns->main_loop;