# Common code, sourced by genday and genweek. # Assumes a whole lot about how they set things up. ./movelog > /dev/null 2>&1 eval `date -u +"now=%s y=%Y m=%m d=%d h=%H"` filter=cat fpref="egrep '^(" expect=any maxpps=auto maxdata=auto for arg do case "$expect" in any) case "$arg" in -maxpps) expect=maxpps;; -maxdata) expect=maxdata;; *) case "$filter" in cat) filter=;; esac filter="$filter$fpref$arg" fpref="|" ;; esac ;; maxpps) expect=any maxpps=$arg ;; maxdata) expect=any maxdata=$arg ;; esac done case "$filter" in cat) ;; *) filter="$filter) '";; esac procsuffix() { psvar="$1" eval psval=\$$psvar case $psval in *[Kk]) psval=${psval%?}; scale=3;; *[Mm]) psval=${psval%?}; scale=6;; *[Gg]) psval=${psval%?}; scale=9;; *) scale=0;; esac psval=`echo $scale $psval | awk ' { v=$2 for (scale=$1;scale>0;scale--) { if (v ~ /[.]/) { split(v,a,"[.]"); if (a[2] == "") { v = a[1] "0"; } else if (length(a[2]) == 1) { v = a[1] a[2]; } else { v = a[1] substr(a[2],1,1) "." substr(a[2],2); } } else { v = v "0"; } } print v; }'` eval $psvar=$psval } procsuffix maxpps procsuffix maxdata # case "$#" in # 0) filter=cat # ;; # *) filter= # pref="egrep '^(" # for arg # do # filter="$filter$pref$arg" # pref="|" # done # filter="$filter) '" # ;; # esac tf=/tmp/$tmpbase.$now.$$ touch $tf.run trap 'ec=$?; rm -f $tf.*; exit $ec' 0 1 2 15 case $d in 0[1-$datadays]) case $m in 01) pm=12 py=$(($y-1)) ;; *) pm=`printf %02d $((${m#0}-1))` py=$y ;; esac if [ -d $y/$m ]; then find $py/$pm $y/$m -type f -print else find $py/$pm -type f -print fi ;; *) find $y/$m -type f -print ;; esac | sort | tail -$datadays | (xargs cat; cat $y-$m-$d) | egrep -v ^Time | fgrep -v 'No interface name found' | sort > $tf.raw eval `tail -1 $tf.raw | awk '{ printf("dn=%s tn=%s\n",$2,$3); }'` < $tf.raw awk '($2>'$(($dn-$datadays))')||($3>'$tn')' > $tf.clip && mv $tf.clip $tf.raw daybase=`head -1 $tf.raw | awk '{print $2;}'` < $tf.raw awk ' BEGIN { intfs[""] = 0; delete intfs[""]; base = '$daybase'; } { intf = $4; ip = $5; ib = $7; op = $8; ob = $10; if (! (intf in intfs)) { intfs[intf] = 1; pip[intf] = 1e50; pib[intf] = 1e50; pop[intf] = 1e50; pob[intf] = 1e50; ps[intf] = 1e50; } s = (($2 - base) * 86400) + $3; if ((ip >= pip[intf]) && (ib >= pib[intf]) && (op >= pop[intf]) && (ob >= pob[intf]) && (s > ps[intf])) { printf("%s %s %d %g %g %g %g\n",intf,$1,s,(ip-pip[intf])/(s-ps[intf]),8*(ib-pib[intf])/(s-ps[intf]),(op-pop[intf])/(s-ps[intf]),8*(ob-pob[intf])/(s-ps[intf])); } pip[intf] = ip; pib[intf] = ib; pop[intf] = op; pob[intf] = ob; ps[intf] = s; }' | eval "$filter" > $tf.data < $tf.data sed -e 's/ .*//' | sort -u > $tf.intfs eval `< $tf.data awk 'NR==1 { mint = $3; maxt = $3; maxip = $4; maxib = $5; maxop = $6; maxob = $7; next; } { if ($3 < mint) mint = $3; if ($3 > maxt) maxt = $3; if ($4 > maxip) maxip = $4; if ($5 > maxib) maxib = $5; if ($6 > maxop) maxop = $6; if ($7 > maxob) maxob = $7; } END { printf("mint=%d maxt=%d maxip=%.0f maxib=%.0f maxop=%.0f maxob=%.0f\n",mint,maxt,maxip,maxib,maxop,maxob); }'` case "$maxpps" in auto) ;; *) maxip=$maxpps maxop=$maxpps ;; esac case "$maxdata" in auto) ;; *) maxib=$maxdata maxob=$maxdata ;; esac genyscale() { eval d=\`echo \$max$1 \| colrm 2\` eval d$1=$d eval z=\`echo \$max$1 \| colrm 1 1 \| tr 0-9 0\` eval z$1=$z case $d in 1) eval ymax$1=$(($d+1))$z eval ylinescale$1=$(($d+1))00 eval yline1$1=20 eval yline2$1=100 ;; 2) eval ymax$1=$(($d+1))$z eval ylinescale$1=$(($d+1))00 eval yline1$1=25 eval yline2$1=100 ;; 3|4) eval ymax$1=5$z eval ylinescale$1=10 eval yline1$1=1 eval yline2$1=2 ;; 5|6) eval ymax$1=$((15$z/2)) eval ylinescale$1=15 eval yline1$1=1 eval yline2$1=2 ;; *) eval ymax$1=10$z eval ylinescale$1=20 eval yline1$1=1 eval yline2$1=2 ;; esac } genyscale ip genyscale op genyscale ib genyscale ob cw=0 for k in p b; do io=i if eval [ \$ymax\o$k -gt \$ymax\i$k ]; then io=o fi for v in ymax ylinescale yline1 yline2; do eval $v$k=\$$v$io$k done eval yline2=\$yline2$k eval ylinescale=\$ylinescale$k eval ymax=\$ymax$k zv=00000000000000000000000000000000 for v in `count from $yline2 to $ylinescale by $yline2`; do sv=$((($v*$ymax)/$ylinescale)) lastv=$sv sv=${sv##*[1-9]} case $zv in *$sv) zv=$sv;; esac done case $zv in *000000000) zstrip="%000000000" zsuff=G ;; *000000) zstrip="%000000" zsuff=M ;; *000) zstrip="%000" zsuff=K ;; *) zstrip= zsuff= ;; esac eval zstrip$k=$zstrip eval zsuff$k=$zsuff eval v=\$\{lastv$zstrip\}$zsuff n=$((((0`echo $v | sed -e s/./+1/g`)*6)+2)) if [ $n -gt $cw ]; then cw=$n fi done ( echo clear 1024 768 0 0 0 echo op max h=$(((768-14-14)/2)) y0p=7 y0b=$((768-7-$h)) ci0='255 0 0' co0='0 255 0' ci1='220 255 0' co1='255 0 255' ci2='0 255 255' co2='160 82 45' ci3='255 150 0' co3='220 127 80' ncols=4 fip=4 fib=5 fop=6 fob=7 for k in p b; do eval y0=\$y0$k echo clipwin default echo scalewin 0 $(($cw-1)) $y0 $(($y0+$h)) eval echo scale 0 1 \$ylinescale$k 0 echo fg 200 200 200 eval zstrip=\$zstrip$k eval zsuff=\$zsuff$k eval count from 0 to \$ylinescale$k by \$yline2$k | while read v; do eval vv=\$\(\(\($v\*\$ymax$k\)/\$ylinescale$k\)\) case $vv in 0) s=0;; *) eval s=\$\{vv$zstrip\}$zsuff;; esac echo text 1 $v ax-right ay-centre bboxmargin \"$s\" done echo window $cw 1024 $y0 $(($y0+$h)) echo scale $mint $maxt 0 1 echo fg 0 0 85 count from $mint to $maxt multiples-of $timeline1 | sed -e 's/.*/line & 0 & 1/' echo fg 0 0 255 count from $mint to $maxt multiples-of $timeline2 | sed -e 's/.*/line & 0 & 1/' eval echo scale 0 1 \$ylinescale$k.0001 -0.00001 echo fg 0 0 85 eval count from 0 to \$ylinescale$k by \$yline1$k | sed -e 's/.*/line 0 & 1 &/' echo fg 0 0 255 eval count from 0 to \$ylinescale$k by \$yline2$k | sed -e 's/.*/line 0 & 1 &/' eval echo scale $mint $maxt \$ymax$k 0 colx=0 for intf in `cat $tf.intfs`; do for io in i o; do eval echo fg \$c$io$colx eval f=\$f$io$k < $tf.data egrep "^$intf " | awk ' NR==1 { pt = $3; pv = $'$f'; next; } { v=$'$f'; if ($3-pt < 750) { printf("line %d %g %d %g\n",pt,pv,$3,v); } pt = $3; pv = v; }' done colx=$((($colx+1)%$ncols)) done done echo fg 200 200 200 echo scale $mint $maxt 1 -1 echo window $cw 1024 $((7+$h)) $((7+$h+14)) xlabels echo scale 0 1 1 0 echo op set echo bg 0 0 0 colx=0 y=0 for intf in `cat $tf.intfs`; do echo window 0 1024 $y $(($y+14)) eval echo fg \$ci$colx echo text 1 1 rectbg ax-right ay-top string \"IN "$intf"\" echo window 0 1024 $((y+14)) $(($y+28)) eval echo fg \$co$colx echo text 1 1 rectbg ax-right ay-top string \"OUT "$intf"\" y=$(($y+28)) colx=$((($colx+1)%$ncols)) done echo output /dev/stdout ) | ppmplot