#!/usr/bin/perl -w use strict; use IO::Socket::UNIX; # use Perl::Unsafe::Signals; use Time::HiRes qw|ualarm|; use CGI qw|:standard|; use POSIX qw|strftime sigprocmask SIG_UNBLOCK SIGALRM|; my $sigset=POSIX::SigSet->new(SIGALRM); my $nsigset=$sigset; sigprocmask(SIG_UNBLOCK,$nsigset,$sigset); my $q=new CGI; do { my $newdelay=333; if (defined param('delay') && (param('delay') =~ /^([1-9]\d{2,4})$/) && $1 > 299 && 30001 >$1) { $newdelay=$1; if (defined param('sk') && (param('sk') =~ /^(cgisock-[a-zA-Z0-9_-]{10}\.\d+)$/)) { my $sock=new IO::Socket::UNIX("/tmp/".$1); print $sock $newdelay; close $sock; }; }; my $cookie=$q->cookie("delay",$newdelay,$1) if $q->script_name =~ /^(.*)\/[^\/]*$/; print header(-cookie=>$cookie).start_html.b(('Yes','No','Broken pipe')[rand 3]).end_html; exit 0; } if defined $q->param; $|=1; my $delay=333000; $delay=$1."000" if defined $q->cookie('delay') && $q->cookie('delay') =~ /^(\d{3,5})$/ && $1 > 299 && 30001 > $1; my $uuid=join("",map { ("a".."z","-","0".."9","_","A".."Z")[rand(64)]} (0..9) ); my $sockname="/tmp/cgisock-".$uuid.".".$$; my $sk=new IO::Socket::UNIX(-Listen=>1,Local=>$sockname) or die; $sk->bind($sockname);$sk->listen(); open UPTIME,"/proc/uptime" or die; my ($firstpair,$wasup)=("$1 $2",(time()-$1)*1000) if =~ /^(\d+.\d+)\s(\d+.\d+)$/; my $cookie = $q->cookie(-name=>'delay', -value=>sprintf("%.0f",$delay/1000), -expires=>strftime("%a, %d %b %Y %T %Z",localtime(time()+2592000)), -path=>$1) if $q->script_name =~ /^(.*)\/[^\/]*$/; printf STDERR "COOKIE:-%s-\n",$cookie; print CGI->header(-type=>"text/xml",-charset=>"utf-8", -cache_control=>"no-cache",-cookie=>$cookie). `cat uptime.xml`; $SIG{'QUIT'}=$SIG{'ABRT'}=$SIG{'TERM'}=$SIG{'PIPE'}=$SIG{'KILL'}=$SIG{'INT'}= sub { close $sk;unlink $sockname;exit;}; sub doOnePoint { ualarm $delay; seek UPTIME,0,0; printf "\n",$1,$2 if =~ /^(\d+.\d+)\s(\d+.\d+)$/; }; # $SIG{'ALRM'}=\&doOnePoint; POSIX::sigaction(SIGALRM, POSIX::SigAction->new(\&doOnePoint)) or die "Error setting SIGALRM handler: $!\n"; ualarm $delay; printf "\n", $wasup,$firstpair,$1,$delay if $sockname =~ /^.tmp.(.*)$/; while (1) { ualarm($delay=1000*$1) if accept(NS,$sk) && =~ /^([1-9]\d{2,4})$/ && $1 > 299 && 30001 >$1; }