diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/Makefile.tplt /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/Makefile.tplt --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/Makefile.tplt 2008-07-16 13:12:29.000000000 -0400 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/Makefile.tplt 2008-07-21 22:43:03.000000000 -0400 @@ -3,9 +3,9 @@ # Created: 2002-Jun-27 # Function: Makefile template # -# $Id: Makefile.tplt,v 1.175 2008/07/16 17:12:29 jaw Exp $ +# $Id: Makefile.tplt,v 1.177 2008/07/22 02:43:03 jaw Exp $ -VERSION = dev-20080716 +VERSION = dev-20080721 MESSAGE = This is unstable development code INSTALL = please see the INSTALL document for the next steps UPGRADE1 = be sure to install the new misc/argus.css and misc/argus.js files diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Argus::HashDir.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Argus::HashDir.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Argus::HashDir.pm 2008-07-16 13:12:30.000000000 -0400 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Argus::HashDir.pm 2008-07-20 18:01:12.000000000 -0400 @@ -1,11 +1,11 @@ # -*- perl -*- # Copyright (c) 2008 by Jeff Weisberg -# Author: Jeff Weisberg +# Author: Jeff Weisberg # Created: 2008-Jan-21 12:18 (EST) -# Function: +# Function: directory name hashing # -# $Id: Argus::HashDir.pm,v 1.1 2008/07/16 17:12:30 jaw Exp $ +# $Id: Argus::HashDir.pm,v 1.2 2008/07/20 22:01:12 jaw Exp $ package Argus::HashDir; use strict; diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Argus::IP.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Argus::IP.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Argus::IP.pm 2007-01-15 21:40:49.000000000 -0500 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Argus::IP.pm 2008-07-21 22:43:06.000000000 -0400 @@ -5,7 +5,7 @@ # Created: 2004-Sep-18 12:17 (EDT) # Function: common IP functions # -# $Id: Argus::IP.pm,v 1.9 2007/01/16 02:40:49 jaw Exp $ +# $Id: Argus::IP.pm,v 1.10 2008/07/22 02:43:06 jaw Exp $ package Argus::IP; @@ -184,25 +184,41 @@ $src = undef; } - if( ! $src ){ - if( $bp ){ - if( length($ip) == 4 ){ - $i = bind( $fh, sockaddr_in(0, INADDR_ANY) ); - }elsif( $HAVE_S6 ){ - $i = bind($fh, pack_sockaddr_in6(0, in6addr_any) ); + # randomize port + my $portr = int(rand(0xffff)) ^ $^T; + for my $portn (0..65535){ + my $port = ($portr ^ $portn) & 0xffff; + next if $port <= 1024; + my $v; + + if( ! $src ){ + if( $bp ){ + if( length($ip) == 4 ){ + $i = bind( $fh, sockaddr_in($port, INADDR_ANY) ); + }elsif( $HAVE_S6 ){ + $i = bind($fh, pack_sockaddr_in6($port, in6addr_any) ); + }else{ + $i = 1; + last; + } }else{ $i = 1; + last; } + }elsif( length($src) == 4 ){ + $i = bind( $fh, sockaddr_in($port, $src) ); + }elsif( $HAVE_S6 ){ + $i = bind( $fh, pack_sockaddr_in6($port, $src) ); }else{ + # don't bind $i = 1; + last; + } + + if($i){ + $me->debug("binding to port $port"); + last; } - }elsif( length($src) == 4 ){ - $i = bind( $fh, sockaddr_in(0, $src) ); - }elsif( $HAVE_S6 ){ - $i = bind( $fh, pack_sockaddr_in6(0, $src) ); - }else{ - # don't bind - $i = 1; } unless($i){ diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Argus::RPC.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Argus::RPC.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Argus::RPC.pm 2007-01-08 00:30:04.000000000 -0500 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Argus::RPC.pm 2008-07-20 18:01:12.000000000 -0400 @@ -3,9 +3,9 @@ # Copyright (c) 2004 by Jeff Weisberg # Author: Jeff Weisberg # Created: 2004-Dec-26 13:41 (EST) -# Function: +# Function: sun remote procedure call - RFC 1057 # -# $Id: Argus::RPC.pm,v 1.4 2007/01/08 05:30:04 jaw Exp $ +# $Id: Argus::RPC.pm,v 1.5 2008/07/20 22:01:12 jaw Exp $ package Argus::RPC; @@ -53,6 +53,7 @@ nfs 100003 ypserv 100004 mountd 100005 +remote_dbx 100006 ypbind 100007 walld 100008 yppasswdd 100009 @@ -71,12 +72,22 @@ x25 100022 statmon 100023 status 100024 +select_lib 100025 bootparam 100026 +mazewars 100027 ypupdated 100028 keyserv 100029 +securelogin 100030 +nfs_fwdlnit 100031 +nfs_fwdtrns 100032 +sunlink_mapper 100033 +net_monitor 100034 +database 100035 +passwd_auth 100036 tfsd 100037 nsed 100038 nsemntd 100039 +pfs_mountd 100040 pcnfsd 150001 amd 300019 ); diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Chart::Strip.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Chart::Strip.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Chart::Strip.pm 2007-02-17 12:10:06.000000000 -0500 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Chart::Strip.pm 2008-07-18 23:34:13.000000000 -0400 @@ -5,7 +5,7 @@ # Date: 2002-Nov-01 16:11 (EST) # Function: draw strip charts # -# $Id: Strip.pm,v 1.16 2007/02/17 17:10:06 jaw Exp $ +# $Id: Strip.pm,v 1.17 2008/07/19 03:34:13 jaw Exp $ $Chart::Strip::VERSION = "1.05"; @@ -542,7 +542,8 @@ return unless $me->{y_label}; $me->{margin_left} += 12; $me->adjust(); - $loc = ($me->{height} + length($me->{y_label}) * 6) / 2; + my $m = ($me->{height} - $me->{margin_top} - $me->{margin_bottom}) / 2 + $me->{margin_top}; + $loc = $m + length($me->{y_label}) * 6 / 2; $me->{img}->stringUp(gdSmallFont, 2, $loc, $me->{y_label}, $me->{color}{black}); # small => 12,6; tiny => 10,5 } diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/MonEl.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/MonEl.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/MonEl.pm 2008-06-25 12:03:17.000000000 -0400 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/MonEl.pm 2008-07-20 18:01:13.000000000 -0400 @@ -5,7 +5,7 @@ # Date: 2002-Apr-02 17:11 (EST) # Function: Monitor Element class # -# $Id: MonEl.pm,v 1.159 2008/06/25 16:03:17 jaw Exp $ +# $Id: MonEl.pm,v 1.160 2008/07/20 22:01:13 jaw Exp $ package MonEl; @ISA = qw(Configable); @@ -1836,6 +1836,28 @@ @c; } +sub graph_height { + my $g = shift; + + my $th = 10; + my $tw = 0; + foreach my $d (@$g){ + my $l = $d->[1]; + next unless $l; + my $w = length($l) * 5 + 15; + + if( $tw + $w > 624 ){ + $th += 10; + $tw = 0; + } + $tw += $w; + } + + return if $th <= 64; + + $th + 128; +} + # spit out data used to generate graphs sub cmd_graphdata { my $ctl = shift; @@ -1846,6 +1868,8 @@ if( $x->{graph} ){ $ctl->ok(); my @g = $x->graphlist(); + my $ht = graph_height(\@g); + $ctl->write( "gr_height: $ht\n" ) if $ht; $ctl->write( "list: ". join(' ', map {$_->[0]->pathname()} @g) . "\n" ); $ctl->write( "clabels: ". join(' ', map {encode($_->[1])} @g) . "\n" ); $ctl->write( "header: ". encode("$x->{web}{header_all} $x->{web}{header}") . "\n"); diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Resolv.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Resolv.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Resolv.pm 2008-07-16 23:42:08.000000000 -0400 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Resolv.pm 2008-07-21 22:43:07.000000000 -0400 @@ -5,7 +5,7 @@ # Date: 2003-May-22 21:46 (EDT) # Function: caching async resolver + re-resolver # -# $Id: Resolv.pm,v 1.25 2008/07/17 03:42:08 jaw Exp $ +# $Id: Resolv.pm,v 1.27 2008/07/22 02:43:07 jaw Exp $ # Wise to resolve, and patient to perform. # -- Homer, Odyssey @@ -34,6 +34,8 @@ my @todo = (); # hostnames to be looked up my %todo = (); # ditto my %pending = (); # pending queries +my @qidmap = (0 .. 65535); # randomize qid + $doc = { package => __PACKAGE__, @@ -96,8 +98,8 @@ versn => '3.5', }, - resolv::qid => { descr => 'queue id' }, - resolv::rcvqidlast => { descr => 'last qid recvd' }, + resolv::qidn => { descr => 'queue id number' }, + resolv::inflight => { descr => 'queries underway' }, resolv::domlist => { descr => 'list of search domains' }, resolv::ns_all => { descr => 'list of nameservers' }, # for debugging resolv::nslist => { descr => 'list of nameservers' }, @@ -227,7 +229,8 @@ $me->{passive} = 1; $me->{nostats} = 1; $me->{transient} = 1; - + $me->{udp}{port} = $DNS_PORT; + $me->{uname} = "Resolv_$n_resolv"; $n_resolv++; @@ -235,10 +238,8 @@ $me->{resolv}{max_queries} = 60000 if $me->{resolv}{max_queries} > 60000; $me->{resolv}{ns_all} = $me->{resolv}{nameservers}; $me->{resolv}{ns_all} .= ' ' if $me->{resolv}{ns_all}; - my @ns = map { - inet_aton($_) - } (split /\s+/, $me->{resolv}{ns_all}); - + my @ns = (split /\s+/, $me->{resolv}{ns_all}); + my @dom; # open resolv.conf @@ -256,22 +257,39 @@ } next unless /^nameserver/i; (undef, $ns) = split /\s+/; - push @ns, inet_aton($ns); + push @ns, $ns; $me->{resolv}{ns_all} .= $ns . " "; } close R; } + # resolv nameservers + @ns = map { + if( /^\d+\.\d+\.\d+\.\d+$/ ){ + inet_aton( $_ ); + } + elsif( /^[a-f\d:]+$/i && $HAVE_S6 ){ + inet_pton(AF_INET6, $_); + } + else{ + $cf->nonfatal("Invalid nameserver: $_"); + (); + } + } @ns; + unless( @ns ){ # because resolv.conf(5) says so push @ns, inet_aton('127.0.0.1'); $me->{resolv}{ns_all} .= '127.0.0.1'; } - $me->{resolv}{nslist} = [ @ns ]; - $me->{resolv}{ns_i} = 0; + + + $me->{resolv}{nslist} = [ @ns ]; + $me->{resolv}{ns_i} = 0; $me->{resolv}{nameserver} = $me->{resolv}{nslist}[ 0 ]; - $me->{resolv}{qid} = int(rand(0xffff)); - $me->{resolv}{rcvqidlast} = $me->{resolv}{qid} - 1; + $me->{resolv}{qidn} = int(rand(0xffff)); + $me->{resolv}{inflight} = 0; + $me->{ip}{addr} = $me->{resolv}{nameserver}; if( @dom ){ $me->{resolv}{search} .= ' ' . join(' ', @dom); @@ -286,7 +304,8 @@ if( $me->{resolv}{duplicates} > 0 ){ $me->clone_me( $me->{resolv}{duplicates} ); } - + + qidshuffle(); $me; } @@ -341,11 +360,14 @@ $me->{resolv}{ns_i} %= @{ $me->{resolv}{nslist} }; $me->{resolv}{nameserver} = $me->{resolv}{nslist}[ $me->{resolv}{ns_i} ]; + $me->{ip}{addr} = $me->{resolv}{nameserver}; + qidshuffle(); + } sub start { my $me = shift; - my( $fh, $ip ); + my( $fh, $ip, $i ); $me->Service::start(); $me->debug("RESOLV start"); @@ -359,7 +381,12 @@ $me->{fd} = $fh = BaseIO::anon_fh(); $ip = $me->{resolv}{nameserver}; - my $i = socket($fh, PF_INET, SOCK_DGRAM, $PROTO_UDP); + if( length($ip) == 4 ){ + $i = socket($fh, PF_INET, SOCK_DGRAM, $PROTO_UDP); + }else{ + $i = socket($fh, PF_INET6, SOCK_DGRAM, $PROTO_UDP); + } + unless($i){ my $m = "socket failed: $!"; ::sysproblem( "RESOLV $m" ); @@ -369,15 +396,39 @@ $me->baseio_init(); - $i = bind($fh, sockaddr_in(0, INADDR_ANY) ); + # randomize port + my $portr = int(rand(0xffff)) ^ $^T; + for my $portn (0..65535){ + my $port = ($portr ^ $portn) & 0xffff; + next if $port <= 1024; + my $v; + if( length($ip) == 4 ){ + $i = bind($fh, sockaddr_in($port, INADDR_ANY) ); + $v = 4; + }else{ + $i = bind($fh, pack_sockaddr_in6($port, in6addr_any) ); + $v = 6; + } + + if($i){ + $me->debug("binding to port udp$v/$port"); + last; + } + } + unless($i){ my $m = "bind failed: $!"; ::sysproblem( "RESOLV $m" ); $me->debug( $m ); return $me->done(); } - - $i = connect( $fh, sockaddr_in( $DNS_PORT, $ip) ); + + if( length($ip) == 4 ){ + $i = connect( $fh, sockaddr_in($DNS_PORT, $ip) ); + }else{ + $i = connect( $fh, pack_sockaddr_in6($DNS_PORT, $ip) ); + } + unless($i){ my $m = "connect failed: $!"; ::sysproblem( "RESOLV $m" ); @@ -392,7 +443,7 @@ $me->{srvc}{state} = 'waiting'; $me->{resolv}{n_queries} = 0; $me->{resolv}{n_responses} = 0; - $me->{resolv}{rcvqidlast} = $me->{resolv}{qid} - 1; + $me->{resolv}{inflight} = 0; } sub maybe_wantwrit { @@ -405,8 +456,7 @@ return; } - my $inflt = ($rs->{rcvqidlast} + 1 - $rs->{qid}) & 0xffff; - if( $inflt >= $rs->{max_inflight} ){ + if( $rs->{inflight} >= $rs->{max_inflight} ){ # too many outstanding - throttle $me->wantwrit(0); return; @@ -427,7 +477,7 @@ return $me->done(); } - my($rport, $rip) = sockaddr_in( $i ); + return if UDP::check_response($me, $i); $me->debug( 'RESOLV recv data' ); $me->settimeout( $me->{srvc}{timeout} ); @@ -444,10 +494,9 @@ $me->debug( "RESOLV recv qid=$id, rcode=$ec" ); - if( !$h || ($rip ne $me->{resolv}{nameserver}) || ($rport != $DNS_PORT) ){ + unless( $h ){ # un-expected response? - my $ripa = inet_ntoa($rip); - $me->debug( "RESOLV recv unexpected response from $ripa:$rport id=$id" ); + $me->debug( "RESOLV recv unexpected response id=$id" ); return; } @@ -459,7 +508,7 @@ delete $pending{$h}; $me->{resolv}{n_responses} ++; - $me->{resolv}{rcvqidlast} = $id; + $me->{resolv}{inflight} -- if $me->{resolv}{inflight}; $me->maybe_wantwrit(); # or maybe throttle back # what to do if we get an error (or non-answer)? @@ -589,7 +638,8 @@ next if ($qt eq 'A') && ($opt !~ /4/); next if ($qt eq 'AAAA') && ($opt !~ /6/); - my $qid = $me->{resolv}{qid}; + my $qidn = $me->{resolv}{qidn}; + my $qid = $qidmap[$qidn]; my $q = DNS::build_packet( undef, undef, { query => $qt, class => 'IN', @@ -610,12 +660,13 @@ return $me->done(); } + $me->{resolv}{inflight} ++; $me->{resolv}{n_queries} ++; $me->{resolv}{pending}{$qid} = { host => $host, zone => $zone }; $pending{$host} = $^T; - $qid ++; - $qid &= 0xFFFF; - $me->{resolv}{qid} = $qid; + $qidn ++; + $qidn &= 0xFFFF; + $me->{resolv}{qidn} = $qidn; } } @@ -662,6 +713,15 @@ if $lost; } +sub qidshuffle { + + my $i = @qidmap; + while (--$i) { + my $j = int rand ($i+1); + @qidmap[$i,$j] = @qidmap[$j,$i]; + } +} + ################################################################ sub janitor { diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/TCP.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/TCP.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/TCP.pm 2008-06-25 12:03:19.000000000 -0400 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/TCP.pm 2008-07-21 22:43:07.000000000 -0400 @@ -5,7 +5,7 @@ # Date: 2002-Apr-03 15:59 (EST) # Function: testing of TCP services # -# $Id: TCP.pm,v 1.78 2008/06/25 16:03:19 jaw Exp $ +# $Id: TCP.pm,v 1.79 2008/07/22 02:43:07 jaw Exp $ package TCP; @@ -362,7 +362,7 @@ $me->debug( "TCP Start: connecting -$ipv tcp/$me->{tcp}{port}, ". "$me->{ip}{hostname}, try $me->{srvc}{tries}" ); - $me->set_src_addr( 0 ) + $me->set_src_addr( 1 ) || return $me->done(); alarm(3); diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/UDP.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/UDP.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/UDP.pm 2008-07-16 23:42:08.000000000 -0400 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/UDP.pm 2008-07-20 18:01:13.000000000 -0400 @@ -5,7 +5,7 @@ # Date: 2002-Apr-03 18:25 (EST) # Function: testing of UDP services # -# $Id: UDP.pm,v 1.71 2008/07/17 03:42:08 jaw Exp $ +# $Id: UDP.pm,v 1.72 2008/07/20 22:01:13 jaw Exp $ package UDP; @@ -28,8 +28,6 @@ use strict qw(refs vars); use vars qw(@ISA $doc); -my $SA4LEN = length(sockaddr_in(0, INADDR_ANY)); - $doc = { package => __PACKAGE__, file => __FILE__, diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Web.pm /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Web.pm --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/Web.pm 2008-07-16 23:53:59.000000000 -0400 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/Web.pm 2008-07-20 18:01:13.000000000 -0400 @@ -5,7 +5,7 @@ # Date: 2002-Apr-06 21:30 (EST) # Function: web page stuff # -# $Id: Web.pm,v 1.69 2008/06/25 16:03:19 jaw Exp $ +# $Id: Web.pm,v 1.70 2008/07/20 22:01:13 jaw Exp $ package MonEl; use strict; @@ -521,9 +521,11 @@ print $fh "\n"; print $fh "\n"; + my @p; + push @p, ht => $me->{image}{gr_height} if $me->{image}{gr_height}; for my $w (qw(samples hours days)){ next unless $me->{image}{"gr_show_$w"}; - my $url = $me->url('func=graph', "which=$w", 'size=thumb', 'ext=.png'); + my $url = $me->url('func=graph', "which=$w", 'size=thumb', @p, 'ext=.png'); my $big = $me->url('func=graphpage', "which=$w", 'size=full' ); print $fh "\t\n"; diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/picasso.pl /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/picasso.pl --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/picasso.pl 2007-01-27 16:34:34.000000000 -0500 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/picasso.pl 2008-07-20 18:01:14.000000000 -0400 @@ -6,7 +6,7 @@ # Date: 2002-Nov-01 11:54 (EST) # Function: lay paint on canvas. make pretty graphs. # -# $Id: picasso.pl,v 1.19 2007/01/27 21:34:34 jaw Exp $ +# $Id: picasso.pl,v 1.20 2008/07/20 22:01:14 jaw Exp $ # Computers are useless. They can only give you answers. # -- Picasso @@ -96,7 +96,8 @@ push @imgopts, width => 160, height => 64; push @imgopts, draw_data_labels => 0, draw_tic_labels => 0; }else{ - push @imgopts, width => 640, height => 192, margin_right => 16; + push @imgopts, height => ($opt{gr_height} || 192); + push @imgopts, width => 640, margin_right => 16; push @imgopts, title => decode($opt{title}); push @imgopts, x_label => decode($opt{xlabel}); push @imgopts, y_label => decode($opt{ylabel}); @@ -114,6 +115,7 @@ my $colorn = 0; +my $notenough = 0; foreach my $n (@ARGV){ my $m = Argus::Graph::Data->new($n); my $color = color($colorn++); @@ -121,13 +123,21 @@ if( $which eq 'samples' ){ $m->readsamples( $opt{gr_xrange_samples} ); - error( 'not enough data yet' ) if @{$m->{samples}} < 2; + + if( @{$m->{samples}} < 2 ){ + $notenough ++; + next; + } $img->add_data( $m->{samples}, {style => $grstyle, color => $color, label => $label} ); }else{ # limit to either 576 points, or specified range $m->readsummary( $which, 576, $opt{"gr_xrange_$which"} ); # print STDERR "data: ", scalar(@{$m->{samples}}), "\n"; - error( 'not enough data yet' ) if @{$m->{samples}} < 2; + + if( @{$m->{samples}} < 2 ){ + $notenough ++; + next; + } if( $barstyle eq 'minmax' ){ $img->add_data( $m->{samples}, {style => 'range', color => 'blue'} ); @@ -144,6 +154,10 @@ } } +if( $notenough >= @ARGV ){ + error( 'not enough data yet' ); +} + # ICK - reorder data: put range graphs 1st my @d; push @d, grep { $_->{opts}{style} eq 'range' } @{$img->{data}}; diff -ruBNx HTML /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/web_graph.pl /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/web_graph.pl --- /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080716/src/web_graph.pl 2007-12-30 20:24:35.000000000 -0500 +++ /home/hostedsites/www.jeremykister.com/data/argus/argus-dev-20080721/src/web_graph.pl 2008-07-20 18:01:14.000000000 -0400 @@ -5,7 +5,7 @@ # Created: 2005-Dec-10 12:51 (EST) # Function: cgi graph functions # -# $Id: web_graph.pl,v 1.7 2007/12/31 01:24:35 jaw Exp $ +# $Id: web_graph.pl,v 1.8 2008/07/20 22:01:14 jaw Exp $ package Argus::Web; use Socket; @@ -17,7 +17,7 @@ sub web_graph { my $me = shift; - my( $q, $obj, $file, $which, $size, $r, $buf, $i ); + my( $q, $obj, $file, $which, $size, $ht, $r, $buf, $i ); $q = $me->{q}; $obj = decode( $q->param('object') ); @@ -153,6 +153,7 @@ # $obj + my $ht = $r->{gr_height} || 192; print < @@ -164,7 +165,7 @@ XYZ ; print "\n"; - print "{q}->url(), "?object=", + print "{q}->url(), "?object=", encode($obj), ";func=graph;which=$which;size=full;ext=.png\">\n"; # print "$which\n"; print "\n";