#!/usr/bin/perl #BEGIN{$|=0;print "Content-type: text/plain\n\n";open(STDERR,">&STDOUT");} { use POSIX; use strict; use warnings; use vars qw(%DATA %COM %FILE); ### init %DATA = ( 'timeout' => 3, 'weight' => 1, ); %COM = ( 'restart' => '/usr/local/bin/svc -t /var/service/matd', ); %FILE = ( 'matd.cf' => '/home/aniki/ctrl/matd.cf', 'serverlist' => '/home/aniki/ctrl/server.list', 'mastermatd' => '/home/aniki/ctrl/matd.cf.master', ); ### templete my $oldsetting = &OpenFile($FILE{'matd.cf'}, 'rr') || ''; ### templete my $newsetting = &OpenFile($FILE{'mastermatd'}, 'rr') or exit; $newsetting =~ s/\n+$//g; ### server check my @Targets; foreach (&OpenFile($FILE{'serverlist'})) { $_ =~ tr/\r\n//d; (($_ eq '') or ($_ =~ /^\#/)) and next; my ($server, $geturl, $macadd, $weight, $timeout) = split(/\t/, $_); $weight ||= $DATA{'weight'}; $timeout ||= $DATA{'timeout'}; ### check ($server) or next; ($geturl) or next; ($macadd =~ /^[\d\w]{2}\:[\d\w]{2}\:[\d\w]{2}\:[\d\w]{2}\:[\d\w]{2}\:[\d\w]{2}$/) or next; ($weight =~ /^\d+$/) or next; ($timeout =~ /^\d+$/) or next; my $kekka = &OpenFile($geturl, 'LWPtimeout', $timeout); ($kekka !~ /^500 Can\'t connect to/) and push(@Targets, $macadd . "=" . $weight); } ### make matd.cf my $target; if (@Targets) { $newsetting .= join(',', @Targets) . "\n"; if ($newsetting ne $oldsetting) { &OpenFile($FILE{'matd.cf'} . '.tmp', 'w', $newsetting); rename($FILE{'matd.cf'} . '.tmp', $FILE{'matd.cf'}); system($COM{'restart'}); } } exit; } #================================================= # OpenFile ver 20080414 #================================================= sub OpenFile { my ($file, $mode, $buf, $buf2, @array); $file = shift; $mode = shift || 'r'; $buf = shift; $buf2 = shift; if ($mode eq 'r') { if (open(FILE, '<'.$file)) { @array = ; close(FILE); return(@array); } else { return(); } } elsif ($mode eq 'rr') { if (open(FILE, '<'.$file)) { @array = ; close(FILE); return(join("", @array)); } else { return(); } } elsif ($mode eq 'w') { open(FILE, '>'.$file); print FILE $buf; close(FILE); return(); } elsif ($mode eq 'ww') { open(FILE, '>>'.$file); print FILE $buf; close(FILE); return(); } elsif ($mode eq 'LWP') { use LWP::UserAgent; use HTTP::Request::Common qw(GET); my $request = GET($file); my $res = LWP::UserAgent->new->request($request); return($res->content); } elsif ($mode eq 'LWPtimeout') { $buf = int($buf); use LWP::UserAgent; use HTTP::Request::Common qw(GET); my $request = GET($file); my $ua = LWP::UserAgent->new; $ua->timeout($buf); my $res = $ua->request($request); return($res->content); } elsif ($mode eq 'LWPbasic') { use LWP::UserAgent; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $file); $req->authorization_basic($buf, $buf2); return($ua->request($req)->content); } elsif ($mode eq 'SOCKET') { use Socket; my @Urls = split(/\//, $file); shift(@Urls) and shift(@Urls); $buf =~ s/\n\n$/\n/; my $server = shift(@Urls); my $path = "/" . join("/", @Urls); my $port = 80; my $iaddr = inet_aton($server); my $sock_addr = pack_sockaddr_in($port, $iaddr); socket(SOCKET, PF_INET, SOCK_STREAM, 0) || return(1); connect(SOCKET, $sock_addr) || return(11); select(SOCKET); $|=1; select(STDOUT); print SOCKET "GET ${path} HTTP/1.0\n"; print SOCKET "Host: ${server}\n"; print SOCKET $buf; print SOCKET "\n"; ## kekka my ($kekka, $header); while (){ m/^\r\n$/ and last; $header .= $_; } while (){ $kekka .= $_; } return($kekka, $header); } }