Thread perl threads uns shared array bzw hash (2 answers)
Opened by mark05 at 2012-06-19 15:25

mark05
 2012-06-20 14:16
#159234 #159234
User since
2010-01-05
129 Artikel
BenutzerIn
[default_avatar]
hi

so ich habe das mal so geloest

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/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;



der thread relevante teil ist im call_hostchecker.

Hglmonitor ist ein objekt wo ich ein paar rechner test mit
Code: (dl )
1
2
use Net::Ping;
use LWP::Simple;


gebaut habe als return kommt dann ein alive oder fail

das ganze geht in richtung dns-proxy mit der funktion rechner zu ueberwachen und entsprechende ips als antwort rauszugeben falls ein
server nicht als status alive hat.

geht in richtung datacenter failover .

vorrausgesetzt wird ein normaler dns server .

ich will dem ganzen auch noch geoip bei bringen so das man entweder geoip
oder monitor based arbeitet oder in kombination .

threads will ich deswegen verwenden um das monitoring unabhaengig
vom normalen resolver Net::DNS::Nameserver zu haben.

zz. ist das eher alles noch proofofconcept als ideen und anregungen
sind willkommen.

holger

View full thread perl threads uns shared array bzw hash