Advertisement
Guest User

dz0ny

a guest
Jul 29th, 2008
746
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 22.46 KB | None | 0 0
  1. #!/opt/bin/bash
  2. ####################################################################
  3. # rrdstorm v1.3 (c) 2007-2008 http://xlife.zuavra.net && cupacup at wl500g.info
  4. # Published under the terms of the GNU General Public License v2.
  5. # This program simplifies the use of rrdtool and rrdupdate.
  6. # The vanilla version is tweaked by default for use on the
  7. # For running this script you should also have bash installed, and check for right grep functions in disk stats
  8. # Type "rrdstorm.sh help" for more info. Quick usage first run "rrdstorm create 0 1 2 3 4 5 6 7" to create html an database files,
  9. # then you must update databases ever 60s usnig "rrdstorm update 0 1 2 3 4 5 6 7", graphs can be generated every time using command
  10. # "rrdstorm graph 0 1 2 3 4 5 6 7" or "rrdstorm graph_cron s 0 1 2 3 4 5 6 7"
  11. # s means 1 hour graph, check help command for more info.
  12. ####################################################################
  13. VERSION="wl500gpv2"
  14. DATE=$(date '+%x %R')
  15. ####################################################################
  16.  
  17. #-------------------------------------------------------------------
  18. # configuration
  19. #-------------------------------------------------------------------
  20.  
  21. RRDTOOL=/opt/bin/rrdtool
  22. RRDUPDATE=/opt/bin/rrdupdate
  23. RRDDATA=/mnt/www
  24. RRDOUTPUT=/mnt/www
  25. FORCEGRAPH=no
  26.  
  27. #-------------------------------------------------------------------
  28. # data definition: average load
  29. #-------------------------------------------------------------------
  30.  
  31. RRDcFILE[0]="load:60:Load graphs"
  32. RRDcDEF[0]='
  33. DS:l1:GAUGE:120:0:100
  34. DS:l5:GAUGE:120:0:100
  35. DS:l15:GAUGE:120:0:100
  36. RRA:AVERAGE:0.5:1:576
  37. RRA:AVERAGE:0.5:6:672
  38. RRA:AVERAGE:0.5:24:732
  39. RRA:AVERAGE:0.5:144:1460
  40. '
  41. RRDuSRC[0]="l1:l5:l15"
  42. RRDuVAL[0]='
  43. UT=$(head -n1 /proc/loadavg)
  44. L1=$(echo "$UT"|awk "{print \$1}")
  45. L5=$(echo "$UT"|awk "{print \$2}")
  46. L15=$(echo "$UT"|awk "{print \$3}")
  47. echo "${L1}:${L5}:${L15}"
  48. '
  49. RRDgUM[0]='proc/min'
  50. RRDgLIST[0]="0 1 2 3 4 5"
  51. RRDgDEF[0]=$(cat <<EOF
  52. 'DEF:ds1=\$RRD:l1:AVERAGE'
  53. 'DEF:ds2=\$RRD:l5:AVERAGE'
  54. 'DEF:ds3=\$RRD:l15:AVERAGE'
  55. 'CDEF:bo=ds1,UN,0,ds1,IF,0,GT,UNKN,INF,IF'
  56. 'AREA:bo#DDDDDD:'
  57. 'CDEF:bi=ds1,UN,0,ds1,IF,0,GT,INF,UNKN,IF'
  58. 'AREA:bi#FEFEED:'
  59. 'HRULE:1.0#44B5FF'
  60. 'AREA:ds3#FFEE00:Last 15 min'
  61.   'VDEF:max1=ds1,MAXIMUM'
  62.   'VDEF:min1=ds1,MINIMUM'
  63.   'VDEF:avg1=ds1,AVERAGE'
  64.   GPRINT:max1:"Max %6.2lf"
  65.   GPRINT:min1:"Min %6.2lf"
  66.   GPRINT:avg1:"Avg %6.2lf\n"
  67. 'LINE3:ds2#FFCC00:Last  5 min'
  68.   'VDEF:max2=ds2,MAXIMUM'
  69.   'VDEF:min2=ds2,MINIMUM'
  70.   'VDEF:avg2=ds2,AVERAGE'
  71.   GPRINT:max2:"Max %6.2lf"
  72.   GPRINT:min2:"Min %6.2lf"
  73.   GPRINT:avg2:"Avg %6.2lf\n"
  74. 'LINE1:ds1#FF0000:Last  1 min'
  75.   'VDEF:max3=ds3,MAXIMUM'
  76.   'VDEF:min3=ds3,MINIMUM'
  77.   'VDEF:avg3=ds3,AVERAGE'
  78.   GPRINT:max3:"Max %6.2lf"
  79.   GPRINT:min3:"Min %6.2lf"
  80.   GPRINT:avg3:"Avg %6.2lf\n"
  81. EOF
  82. )
  83.  
  84. RRDgGRAPH[0]='3600|load1|Load last hour|[ "$M" = 30 ]'
  85. RRDgGRAPH[1]='14400|load6|Load last 4H|[ "$M" = 30 ]'
  86. RRDgGRAPH[2]='86400|load24|Load last 24H|[ "$H" = 04 ] && [ "$M" = 30 ]|--x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  87. RRDgGRAPH[3]='604800|loadW|Load last week|[ "$H" = 04 ] && [ "$M" = 30 ]|--x-grid HOUR:4:DAY:1:DAY:1:0:"%a %d/%m"'
  88. RRDgGRAPH[4]='2678400|loadM|Load last month|[ "$H" = 04 ] && [ "$M" = 30 ]'
  89. RRDgGRAPH[5]='31536000|loadY|Load last year|[ "$H" = 04 ] && [ "$M" = 30 ]'
  90.  
  91. #-------------------------------------------------------------------
  92. # data definition: memory allocation
  93. #-------------------------------------------------------------------
  94.  
  95. RRDcFILE[1]="mem:60:Memory allocation"
  96. RRDcDEF[1]='
  97. DS:cached:GAUGE:120:0:1000000
  98. DS:buffer:GAUGE:120:0:1000000
  99. DS:free:GAUGE:120:0:1000000
  100. DS:total:GAUGE:120:0:1000000
  101. DS:swapt:GAUGE:120:0:1000000
  102. DS:swapf:GAUGE:120:0:1000000
  103. RRA:AVERAGE:0.5:1:576
  104. RRA:AVERAGE:0.5:6:672
  105. RRA:AVERAGE:0.5:24:732
  106. RRA:AVERAGE:0.5:144:1460
  107. '
  108. RRDuSRC[1]="cached:buffer:free:total:swapt:swapf"
  109. RRDuVAL[1]='
  110. C=$(grep ^Cached /proc/meminfo|awk "{print \$2}")
  111. B=$(grep ^Buffers /proc/meminfo|awk "{print \$2}")
  112. F=$(grep ^MemFree /proc/meminfo|awk "{print \$2}")
  113. T=$(grep ^MemTotal /proc/meminfo|awk "{print \$2}")
  114. ST=$(grep ^SwapTotal /proc/meminfo|awk "{print \$2}")
  115. SF=$(grep ^SwapFree /proc/meminfo|awk "{print \$2}")
  116. echo "${C}:${B}:${F}:${T}:${ST}:${SF}"
  117. '
  118. RRDgUM[1]='bytes'
  119. RRDgLIST[1]="6 7 8 9 10 11"
  120. RRDgDEF[1]=$(cat <<EOF
  121. 'DEF:dsC=\$RRD:cached:AVERAGE'
  122. 'DEF:dsB=\$RRD:buffer:AVERAGE'
  123. 'DEF:dsF=\$RRD:free:AVERAGE'
  124. 'DEF:dsT=\$RRD:total:AVERAGE'
  125. 'CDEF:bo=dsT,UN,0,dsT,IF,0,GT,UNKN,INF,IF'
  126. 'AREA:bo#DDDDDD:'
  127. 'CDEF:tot=dsT,1024,*'
  128. 'CDEF:fre=dsF,1024,*'
  129. 'CDEF:freP=fre,100,*,tot,/'
  130. 'CDEF:buf=dsB,1024,*'
  131. 'CDEF:bufP=buf,100,*,tot,/'
  132. 'CDEF:cac=dsC,1024,*'
  133. 'CDEF:cacP=cac,100,*,tot,/'
  134. 'CDEF:use=dsT,dsF,dsC,+,dsB,+,-,1024,*'
  135. 'CDEF:useP=use,100,*,tot,/'
  136. 'CDEF:l=use,1,1,IF'
  137. 'AREA:use#CC3300:User   '
  138. 'LINE2:l#AC1300::STACK'
  139.   'VDEF:maxU=use,MAXIMUM'
  140.   'VDEF:minU=use,MINIMUM'
  141.   'VDEF:avgU=use,AVERAGE'
  142.   'VDEF:curU=use,LAST'
  143.   'VDEF:procU=useP,LAST'
  144.   GPRINT:curU:"Last %6.2lf %s"
  145.   GPRINT:procU:"%3.0lf%%"
  146.   GPRINT:avgU:"Avg %6.2lf %s"
  147.   GPRINT:maxU:"Max %6.2lf %s"
  148.   GPRINT:minU:"Min %6.2lf %s\n"
  149. 'AREA:cac#FF9900:Cached :STACK'
  150. 'LINE2:l#DF7900::STACK'
  151.   'VDEF:maxC=cac,MAXIMUM'
  152.   'VDEF:minC=cac,MINIMUM'
  153.   'VDEF:avgC=cac,AVERAGE'
  154.   'VDEF:curC=cac,LAST'
  155.   'VDEF:procC=cacP,LAST'
  156.   GPRINT:curC:"Last %6.2lf %s"
  157.   GPRINT:procC:"%3.0lf%%"
  158.   GPRINT:avgC:"Avg %6.2lf %s"
  159.   GPRINT:maxC:"Max %6.2lf %s"
  160.   GPRINT:minC:"Min %6.2lf %s\n"
  161. 'AREA:buf#FFCC00:Buffers:STACK'
  162. 'LINE2:l#DFAC00::STACK'
  163.   'VDEF:maxB=buf,MAXIMUM'
  164.   'VDEF:minB=buf,MINIMUM'
  165.   'VDEF:avgB=buf,AVERAGE'
  166.   'VDEF:curB=buf,LAST'
  167.   'VDEF:procB=bufP,LAST'
  168.   GPRINT:curB:"Last %6.2lf %s"
  169.   GPRINT:procB:"%3.0lf%%"
  170.   GPRINT:avgB:"Avg %6.2lf %s"
  171.   GPRINT:maxB:"Max %6.2lf %s"
  172.   GPRINT:minB:"Min %6.2lf %s\n"
  173. 'AREA:fre#FFFFCC:Unused :STACK'
  174.   'VDEF:maxF=fre,MAXIMUM'
  175.   'VDEF:minF=fre,MINIMUM'
  176.   'VDEF:avgF=fre,AVERAGE'
  177.   'VDEF:curF=fre,LAST'
  178.   'VDEF:procF=freP,LAST'
  179.   GPRINT:curF:"Last %6.2lf %s"
  180.   GPRINT:procF:"%3.0lf%%"
  181.   GPRINT:avgF:"Avg %6.2lf %s"
  182.   GPRINT:maxF:"Max %6.2lf %s"
  183.   GPRINT:minF:"Min %6.2lf %s\n"
  184. EOF
  185. )
  186.  
  187. RRDgGRAPH[6]='3600|mem1|RAM last hour|[ "$M" = 30 ]|-l 0 -r'
  188. RRDgGRAPH[7]='14400|mem6|RAM last 4H|[ "$M" = 30 ]|-l 0 -r'
  189. RRDgGRAPH[8]='86400|mem24|RAM last 24H|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  190. RRDgGRAPH[9]='604800|memW|RAM last week|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r --x-grid HOUR:4:DAY:1:DAY:1:0:"%a %d/%m"'
  191. RRDgGRAPH[10]='2678400|memM|RAM last month|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r'
  192. RRDgGRAPH[11]='31536000|memY|RAM last year|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r'
  193.  
  194. #-------------------------------------------------------------------
  195. # data definition: CPU temp and fan
  196. #-------------------------------------------------------------------
  197.  
  198. ##no way to go(maybe wlan data SNR,RATE...)
  199.  
  200. #-------------------------------------------------------------------
  201. # data definition: cpu usage
  202. #-------------------------------------------------------------------
  203.  
  204. RRDcFILE[3]="cpu:60:CPU Usage"
  205. RRDcDEF[3]='
  206. DS:user:DERIVE:120:0:U
  207. DS:nice:DERIVE:120:0:U
  208. DS:sys:DERIVE:120:0:U
  209. DS:idle:DERIVE:120:0:U
  210. RRA:AVERAGE:0.5:1:576
  211. RRA:AVERAGE:0.5:6:672
  212. RRA:AVERAGE:0.5:24:732
  213. RRA:AVERAGE:0.5:144:1460
  214. '
  215. RRDuSRC[3]="user:nice:sys:idle"
  216. RRDuVAL[3]='
  217. cat /proc/stat|head -1|sed "s/^cpu\ \+\([0-9]*\)\ \([0-9]*\)\ \([0-9]*\)\ \([0-9]*\).*/\1:\2:\3:\4/"
  218. '
  219. RRDgUM[3]='jiffies'
  220. RRDgLIST[3]="18 19 20 21 22 23"
  221. RRDgDEF[3]=$(cat <<EOF
  222. 'DEF:uj=\$RRD:user:AVERAGE'
  223. 'DEF:nj=\$RRD:nice:AVERAGE'
  224. 'DEF:sj=\$RRD:sys:AVERAGE'
  225. 'DEF:ij=\$RRD:idle:AVERAGE'
  226. 'CDEF:l=uj,0.1,0.1,IF'
  227. 'CDEF:bo=uj,UN,0,uj,IF,0,GT,UNKN,INF,IF'
  228. 'AREA:bo#DDDDDD:'
  229. 'CDEF:tj=uj,nj,+,sj,+,ij,+'
  230. 'CDEF:usr=100,uj,*,tj,/'
  231. 'CDEF:nic=100,nj,*,tj,/'
  232. 'CDEF:sys=100,sj,*,tj,/'
  233. 'CDEF:idl=100,ij,*,tj,/'
  234. 'CDEF:tot=100,tj,*,tj,/'
  235. 'AREA:nic#0040A2:Nice  '
  236.   'VDEF:maxN=nic,MAXIMUM'
  237.   'VDEF:minN=nic,MINIMUM'
  238.   'VDEF:avgN=nic,AVERAGE'
  239.   GPRINT:maxN:"Max %6.2lf%%"
  240.   GPRINT:minN:"Min %6.2lf%%"
  241.   GPRINT:avgN:"Avg %6.2lf%%\n"
  242. 'AREA:sys#90C5CC:System:STACK'
  243. 'LINE2:l#70A5AC::STACK'
  244.   'VDEF:maxS=sys,MAXIMUM'
  245.   'VDEF:minS=sys,MINIMUM'
  246.   'VDEF:avgS=sys,AVERAGE'
  247.   GPRINT:maxS:"Max %6.2lf%%"
  248.   GPRINT:minS:"Min %6.2lf%%"
  249.   GPRINT:avgS:"Avg %6.2lf%%\n"
  250. 'AREA:usr#B0E5EC:User  :STACK'
  251. 'LINE2:l#90C5CC::STACK'
  252.   'VDEF:maxU=usr,MAXIMUM'
  253.   'VDEF:minU=usr,MINIMUM'
  254.  
  255.   'VDEF:avgU=usr,AVERAGE'
  256.   GPRINT:maxU:"Max %6.2lf%%"
  257.   GPRINT:minU:"Min %6.2lf%%"
  258.   GPRINT:avgU:"Avg %6.2lf%%\n"
  259. 'AREA:idl#EEFFFF:Idle  :STACK'
  260.   'VDEF:maxI=idl,MAXIMUM'
  261.   'VDEF:minI=idl,MINIMUM'
  262.   'VDEF:avgI=idl,AVERAGE'
  263.   GPRINT:maxI:"Max %6.2lf%%"
  264.   GPRINT:minI:"Min %6.2lf%%"
  265.   GPRINT:avgI:"Avg %6.2lf%%\n"
  266. EOF
  267. )
  268.  
  269. RRDgGRAPH[18]='3600|cpu1|CPU Usage (1H)|[ "$M" = 30 ]|-l 0 -r -u 99.99'
  270. RRDgGRAPH[19]='14400|cpu6|CPU Usage (4H)|[ "$M" = 30 ]|-r -l 0 -u 99.99'
  271. RRDgGRAPH[20]='86400|cpu24|CPU Usage (24H)|[ "$H" = 04 ] && [ "$M" = 30 ]|-r -l 0 -u 99.99 --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  272. RRDgGRAPH[21]='604800|cpuW|CPU Usage (last week)|[ "$H" = 04 ] && [ "$M" = 30 ]|-r -l 0 -u 99.99 --x-grid HOUR:4:DAY:1:DAY:1:0:"%a %d/%m"'
  273. RRDgGRAPH[22]='2678400|cpuM|CPU Usage (last month)|[ "$H" = 04 ] && [ "$M" = 30 ]|-r -l 0 -u 99.99'
  274. RRDgGRAPH[23]='31536000|cpuY|CPU Usage (last year)|[ "$H" = 04 ] && [ "$M" = 30 ]|-r -l 0 -u 99.99'
  275.  
  276. #-------------------------------------------------------------------
  277. # network stats
  278. #-------------------------------------------------------------------
  279.  
  280. RRDcFILE[4]="wan:60:WAN Traffic"
  281. RRDcDEF[4]='
  282. DS:in:DERIVE:600:0:12500000
  283. DS:out:DERIVE:600:0:12500000
  284. RRA:AVERAGE:0.5:1:576
  285. RRA:AVERAGE:0.5:6:672
  286. RRA:AVERAGE:0.5:24:732
  287. RRA:AVERAGE:0.5:144:1460
  288. '
  289. RRDuSRC[4]="in:out"
  290. RRDuVAL[4]='
  291. IF="vlan1"
  292. IN=$(grep "${IF}" /proc/net/dev|awk -F ":" "{print \$2}"|awk "{print \$1}")
  293. OUT=$(grep "${IF}" /proc/net/dev|awk -F ":" "{print \$2}"|awk "{print \$9}")
  294. echo "${IN}:${OUT}"
  295. '
  296. RRDgUM[4]='bytes/s'
  297. RRDgLIST[4]="24 25 26 27 28 29"
  298. RRDgDEF[4]=$(cat <<EOF
  299. 'DEF:ds1=\$RRD:in:AVERAGE'
  300. 'DEF:ds2=\$RRD:out:AVERAGE'
  301.   'VDEF:max1=ds1,MAXIMUM'
  302. 'CDEF:ui=ds1,UN,0,ds1,IF,0,GT,UNKN,NEGINF,IF'
  303. 'CDEF:uo=0,ds1,UN,0,ds1,IF,0,GT,max1,50,/,UNKN,IF,-'
  304. 'CDEF:bi=ds1,UN,0,ds1,IF,0,GT,INF,UNKN,IF'
  305. 'CDEF:bo=ds1,UN,0,ds1,IF,0,GT,UNKN,INF,IF'
  306. 'AREA:bi#EDFEED:'
  307. 'AREA:ds1#00B5E3:Incoming'
  308. 'LINE1:ds1#0085B3:'
  309.   'VDEF:min1=ds1,MINIMUM'
  310.   'VDEF:avg1=ds1,AVERAGE'
  311.   'VDEF:tot1=ds1,TOTAL'
  312.   GPRINT:max1:"Max %6.2lf %s"
  313.   GPRINT:min1:"Min %6.2lf %s"
  314.   GPRINT:avg1:"Avg %6.2lf %s"
  315.   GPRINT:tot1:"Sum %6.2lf %s"
  316. 'AREA:ui#FF6666:Offline\n'
  317. 'LINE2:ds2#E32D00:Outgoing'
  318.   'VDEF:max2=ds2,MAXIMUM'
  319.   'VDEF:min2=ds2,MINIMUM'
  320.   'VDEF:avg2=ds2,AVERAGE'
  321.   'VDEF:tot2=ds2,TOTAL'
  322.   GPRINT:max2:"Max %6.2lf %s"
  323.   GPRINT:min2:"Min %6.2lf %s"
  324.   GPRINT:avg2:"Avg %6.2lf %s"
  325.   GPRINT:tot2:"Sum %6.2lf %s"
  326. 'AREA:bo#FEEDED:'
  327. 'AREA:uo#00FE00:Online'
  328. 'HRULE:0#000000'
  329. EOF
  330. )  
  331.    
  332. RRDgGRAPH[24]='3600|wan1|WAN Traffic (1H)|[ "$M" = 30 ]|-r'
  333. RRDgGRAPH[25]='14400|wan6|WAN Traffic (4H)|[ "$M" = 30 ]|-r'
  334. RRDgGRAPH[26]='86400|wan24|WAN Traffic (24H)|[ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  335. RRDgGRAPH[27]='604800|wanW|WAN Traffic (last week)|[ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r --x-grid HOUR:4:DAY:1:DAY:1:0:"%a %d/%m"'
  336. RRDgGRAPH[28]='2678400|wanM|WAN Traffic (last month)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r '
  337. RRDgGRAPH[29]='31536000|wanY|WAN Traffic (last year)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r '
  338.  
  339. #-------------------------------------------------------------------
  340. # disk space
  341. #-------------------------------------------------------------------
  342.  
  343. RRDcFILE[5]="hdd:60:Disk space"
  344. RRDcDEF[5]='
  345. DS:optprosto:GAUGE:600:0:U 
  346. DS:optzasede:GAUGE:600:0:U
  347. DS:mntprosto:GAUGE:600:0:U
  348. DS:mntzasede:GAUGE:600:0:U
  349. RRA:AVERAGE:0.5:1:576
  350. RRA:AVERAGE:0.5:6:672
  351. RRA:AVERAGE:0.5:24:732
  352. RRA:AVERAGE:0.5:144:1460
  353. '
  354. RRDuSRC[5]="optprosto:optzasede:mntprosto:mntzasede"
  355. RRDuVAL[5]='
  356. SP=$(/opt/bin/coreutils-df "-B1")
  357. echo -n $(echo "$SP"|grep opt|awk "{print \$3\":\"\$2}"):
  358. echo -n $(echo "$SP"|grep mnt|awk "{print \$3\":\"\$2}")
  359. echo
  360. '
  361. RRDgUM[5]='space (bytes)'
  362. RRDgLIST[5]="30 31 32 33 34 35"
  363. RRDgDEF[5]=$(cat <<EOF
  364. 'DEF:optzasede=\$RRD:optzasede:AVERAGE'
  365. 'DEF:optprosto=\$RRD:optprosto:AVERAGE'
  366. 'DEF:mntzasede=\$RRD:mntzasede:AVERAGE'
  367. 'DEF:mntprosto=\$RRD:mntprosto:AVERAGE'
  368. 'CDEF:bo=mntzasede,UN,0,mntzasede,IF,0,GT,UNKN,INF,IF'
  369. 'AREA:bo#DDDDDD:'
  370. 'AREA:mntzasede#CC0033:/mnt:'
  371.   'CDEF:root=mntzasede,mntprosto,+'
  372.   'VDEF:sumr=root,LAST'
  373.   GPRINT:sumr:"Total %6.2lf %sB"
  374.   'VDEF:lasr=mntzasede,LAST'
  375.   GPRINT:lasr:"Used %6.2lf %sB"
  376.   'CDEF:rootPu=mntzasede,100,*,root,/'
  377.   'VDEF:procr=rootPu,LAST'
  378.   GPRINT:procr:"%6.2lf%%"
  379. 'AREA:mntprosto#EC2053:Free:STACK'
  380.   'VDEF:lasra=mntprosto,LAST'
  381.   GPRINT:lasra:"%6.2lf %sB"
  382.   'CDEF:rootPa=100,rootPu,-'
  383.   'VDEF:procar=rootPa,LAST'
  384.   GPRINT:procar:"%6.2lf%%\n"
  385. 'AREA:optzasede#33CC00:/opt:STACK'
  386.   'CDEF:home=optzasede,optprosto,+'
  387.   'VDEF:sumh=home,LAST'
  388.   GPRINT:sumh:"Total %6.2lf %sB"
  389.   'VDEF:lash=optzasede,LAST'
  390.   GPRINT:lash:"Used %6.2lf %sB"
  391.   'CDEF:homePu=optzasede,100,*,home,/'
  392.   'VDEF:proch=homePu,LAST'
  393.   GPRINT:proch:"%6.2lf%%"
  394. 'AREA:optprosto#53EC20:Free:STACK'
  395.   'VDEF:lasha=optprosto,LAST'
  396.   GPRINT:lasha:"%6.2lf %sB"
  397.   'CDEF:homePa=100,homePu,-'
  398.   'VDEF:procah=homePa,LAST'
  399.   GPRINT:procah:"%6.2lf%%\n"
  400. EOF
  401. )  
  402.  
  403. RRDgGRAPH[30]='3600|hdd1|Disk space (1H)|[ "$M" = 30 ]|-r -l 0'
  404. RRDgGRAPH[31]='14400|hdd6|Disk space (4H)|[ "$M" = 30 ]|-r -l 0'
  405. RRDgGRAPH[32]='86400|hdd24|Disk space (24H)|[ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r -l 0 --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  406. RRDgGRAPH[33]='604800|hddW|Disk space (last week)|[ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r -l 0 --x-grid HOUR:4:DAY:1:DAY:1:0:"%a %d/%m"'
  407. RRDgGRAPH[34]='2678400|hddM|Disk space (last month)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r -l 0'
  408. RRDgGRAPH[35]='31536000|hddY|Disk space (last year)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r -l 0'
  409.  
  410. #-------------------------------------------------------------------
  411. # network stats
  412. #-------------------------------------------------------------------
  413.  
  414. RRDcFILE[6]="wlan:60:WLAN Traffic"
  415. RRDcDEF[6]='
  416. DS:in:DERIVE:600:0:U
  417. DS:out:DERIVE:600:0:U
  418. RRA:AVERAGE:0.5:1:576
  419. RRA:AVERAGE:0.5:6:672
  420. RRA:AVERAGE:0.5:24:732
  421. RRA:AVERAGE:0.5:144:1460
  422. '
  423. RRDuSRC[6]="in:out"
  424. RRDuVAL[6]='
  425. IF="eth1"
  426. IN=$(grep "${IF}" /proc/net/dev|awk -F ":" "{print \$2}"|awk "{print \$1}")
  427. OUT=$(grep "${IF}" /proc/net/dev|awk -F ":" "{print \$2}"|awk "{print \$9}")
  428. echo "${IN}:${OUT}"
  429. '
  430. RRDgUM[6]='bytes/s'
  431. RRDgLIST[6]="36 37 38 39 40 41"
  432. RRDgDEF[6]=$(cat <<EOF
  433. 'DEF:ds1=\$RRD:in:AVERAGE'
  434. 'DEF:ds2=\$RRD:out:AVERAGE'
  435.   'VDEF:max1=ds1,MAXIMUM'
  436. 'CDEF:ui=ds1,UN,0,ds1,IF,0,GT,UNKN,NEGINF,IF'
  437. 'CDEF:uo=0,ds1,UN,0,ds1,IF,0,GT,max1,50,/,UNKN,IF,-'
  438. 'CDEF:bi=ds1,UN,0,ds1,IF,0,GT,INF,UNKN,IF'
  439. 'CDEF:bo=ds1,UN,0,ds1,IF,0,GT,UNKN,INF,IF'
  440. 'AREA:bi#EDFEED:'
  441. 'AREA:ds1#00B5E3:Incoming'
  442. 'LINE1:ds1#0085B3:'
  443.   'VDEF:min1=ds1,MINIMUM'
  444.   'VDEF:avg1=ds1,AVERAGE'
  445.   'VDEF:tot1=ds1,TOTAL'
  446.   GPRINT:max1:"Max %6.2lf %s"
  447.   GPRINT:min1:"Min %6.2lf %s"
  448.   GPRINT:avg1:"Avg %6.2lf %s"
  449.   GPRINT:tot1:"Sum %6.2lf %s"
  450. 'AREA:ui#FF6666:Offline\n'
  451. 'LINE2:ds2#E32D00:Outgoing'
  452.   'VDEF:max2=ds2,MAXIMUM'
  453.   'VDEF:min2=ds2,MINIMUM'
  454.   'VDEF:avg2=ds2,AVERAGE'
  455.   'VDEF:tot2=ds2,TOTAL'
  456.   GPRINT:max2:"Max %6.2lf %s"
  457.   GPRINT:min2:"Min %6.2lf %s"
  458.   GPRINT:avg2:"Avg %6.2lf %s"
  459.   GPRINT:tot2:"Sum %6.2lf %s"
  460. 'AREA:bo#FEEDED:'
  461. 'AREA:uo#00FE00:Online'
  462. 'HRULE:0#000000'
  463. EOF
  464. )  
  465.    
  466. RRDgGRAPH[36]='3600|wlan1|WLAN Traffic (1H)|[ "$M" = 30 ]|-r'
  467. RRDgGRAPH[37]='14400|wlan6|WLAN Traffic (4H)|[ "$M" = 30 ]|-r'
  468. RRDgGRAPH[38]='86400|wlan24|WLAN Traffic (24H)|[ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  469. RRDgGRAPH[39]='604800|wlanW|WLAN Traffic (last week)|[ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r --x-grid HOUR:4:DAY:1:DAY:1:0:"%a %d/%m"'
  470. RRDgGRAPH[40]='2678400|wlanM|WLAN Traffic (last month)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r '
  471. RRDgGRAPH[41]='31536000|wlanY|WLAN Traffic (last year)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r '
  472.  
  473. #-------------------------------------------------------------------
  474. # swap allocation
  475. #-------------------------------------------------------------------
  476.  
  477. RRDcFILE[7]="mem:60:Swap allocation"
  478. RRDgUM[7]='bytes'
  479. RRDgLIST[7]="42 43 44 45 46 47"
  480. RRDgDEF[7]=$(cat <<EOF
  481. 'DEF:sT=\$RRD:swapt:AVERAGE'
  482. 'DEF:sF=\$RRD:swapf:AVERAGE'
  483. 'CDEF:sU=sT,sF,-'
  484. 'CDEF:bo=sT,UN,0,sT,IF,0,GT,UNKN,561936,IF'
  485. 'AREA:bo#FFCCCC:'
  486. 'AREA:sU#9999FF:Used'
  487. 'AREA:sF#FFFF99:Free:STACK'
  488. 'LINE:sU#7777DD:'
  489. 'HRULE:31832#FF0000'
  490. 'HRULE:561936#FF0000'
  491. EOF
  492. )
  493.  
  494. RRDgGRAPH[42]='3600|swap1|Swap last hour|[ "$M" = 30 ]|-l 0 -r'
  495. RRDgGRAPH[43]='14400|swap6|Swap last 4H|[ "$M" = 30 ]|-l 0 -r'
  496. RRDgGRAPH[44]='86400|swap24|Swap last 24H|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  497. RRDgGRAPH[45]='604800|swapW|Swap last week|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r --x-grid HOUR:4:DAY:1:DAY:1:0:"%a %d/%m"'
  498. RRDgGRAPH[46]='2678400|swapM|Swap last month|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r'
  499. RRDgGRAPH[47]='31536000|swapY|Swap last year|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r'
  500.  
  501.  
  502.  
  503.  
  504. ####################################################################
  505. # STOP MODIFICATIONS HERE, UNLESS YOU REALLY KNOW WHAT YOU'RE DOING
  506. ####################################################################
  507.  
  508. #-------------------------------------------------------------------
  509. # functions
  510. #-------------------------------------------------------------------
  511.  
  512. #1=rrdfile 2=step 3=definition
  513. CreateRRD()
  514. {  
  515.     "$RRDTOOL" create "$1" --step "$2" $3
  516. }
  517.  
  518. #1=file, 2=data sources, 3=values
  519. UpdateRRD()
  520. {
  521.     "$RRDUPDATE" "$1" -t "$2" "N:${3}"
  522. }
  523.  
  524. #1=imgfile, 2=secs to go back, 3=um text, 4=title text,
  525. #5=rrdfile, 6=definition, 7=extra params
  526. CreateGraph()
  527. {
  528.   RRD="$5"
  529.     DEF=$(echo "${6} "|sed 's/"/\\"/g'|sed '/[^ ]$/s/$/ \\/')
  530.   eval "DEF=\"$DEF\""
  531.     eval "\"$RRDTOOL\" graph \"$1\" $7 -M -a PNG -s \"-${2}\" -e -20 -w 550 -h 240 -v \"$3\" -t \"$4\" $DEF"
  532. }
  533.  
  534. #-------------------------------------------------------------------
  535. # main code
  536. #-------------------------------------------------------------------
  537.  
  538. # TODO: examine parameters and output help if any mistake
  539.  
  540. # grab command
  541. COMMAND="$1"
  542. CRON_GRAPH_TIME="$2"
  543. shift
  544.  
  545. # prepare main HTML index file
  546. [ "$COMMAND" = create ] && {
  547.     HTMLINDEX="${RRDOUTPUT}/index.html"
  548.     [ -f "$HTMLINDEX" ] || {
  549.         echo "<head><title>RRDStorm</title>
  550.             <style>body{background:white;color:black}</style></head>
  551.             <body><h1>RRDStorm</h1><ul>" > "$HTMLINDEX"
  552.         MAKEINDEX=yes
  553.     }
  554. }
  555. # cycle numbers
  556. for N in "$@"; do
  557.     # does this N exist?
  558.     [ -z "${RRDcFILE[$N]}" ] && continue
  559.     # extract common data
  560.     FILEBASE=$(echo "${RRDcFILE[$N]}"|awk -F: '{print $1}')
  561.     RRDFILE="${RRDDATA}/${FILEBASE}.rrd"
  562.     # honor command
  563.     case "$COMMAND" in
  564.         create)
  565.             # extract base data
  566.             HTMLFILE="${RRDOUTPUT}/${FILEBASE}.html"
  567.             STEP=$(echo "${RRDcFILE[$N]}"|awk -F: '{print $2}')
  568.             HTITLE=$(echo "${RRDcFILE[$N]}"|awk -F: '{print $3}')
  569.             # check RRD archive
  570.             [ -d "$RRDDATA" ] || mkdir -p "$RRDDATA"
  571.             [ -f "$RRDFILE" ] || CreateRRD  "$RRDFILE" "$STEP" "${RRDcDEF[$N]}"
  572.             # check individual HTML file
  573.             [ -d "$RRDOUTPUT" ] || mkdir -p "$RRDOUTPUT"
  574.             [ -f "$HTMLFILE" ] || {
  575.                 echo "<head><title>${HTITLE}</title>
  576.                     <style>body{background:white;color:black}</style></head>
  577.                     <body><h1>${HTITLE}</h1><center>" > "$HTMLFILE"
  578.                 for P in ${RRDgLIST[$N]}; do
  579.                     [ -z "${RRDgGRAPH[$P]}" ] && continue
  580.                     IMGBASE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f2)
  581.                     echo "<img src=\"${IMGBASE}.png\"><br>" >> "$HTMLFILE"
  582.                 done
  583.                 echo "</center><p>RRDStorm for ${VERSION} / ${DATE}</p></body>" >> "$HTMLFILE"
  584.             }
  585.             # update the main HTML index
  586.             [ ! -z "$MAKEINDEX" ] && {
  587.                 echo "<li><a href=\"${FILEBASE}.html\">${HTITLE}</a>" >> "$HTMLINDEX"
  588.             }
  589.         ;;
  590.         update)
  591.             VAL=$(eval "${RRDuVAL[$N]}")
  592.             echo "Updating ($N) $RRDFILE with $VAL .."
  593.             UpdateRRD "$RRDFILE" "${RRDuSRC[$N]}" "$VAL"
  594.         ;;
  595.         help)
  596.             echo "Usage: rrdstorm {create|update|graph|graph_cron[s h d w m y]} 0 1 2 .."
  597.             echo "graph_cron is for cron to quicky update just one graph [1h=s 4h=h 24h=d 1week=w 1 month=m 1year=y]} 0 1 2 .."
  598.         ;;
  599.         graph)
  600.             # grab hour and minute
  601.             M=$(date "+%M")
  602.             H=$(date "+%H")
  603.             # do graphs
  604.             for P in ${RRDgLIST[$N]}; do
  605.                 [ -z "${RRDgGRAPH[$P]}" ] && continue
  606.                 BACK=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f1)
  607.                 IMGBASE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f2)
  608.                 TITLE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f3)
  609.                 EXTRA=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f5)
  610.                 [ ! -z "$FORCEGRAPH" ] && {
  611.                     RET=1
  612.                 } || {
  613.                     COND=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f4)
  614.                     [ -z "$COND" ] && RET=1 || {
  615.                         COND="if ${COND}; then RET=1; else RET=0; fi"
  616.                         eval "$COND"
  617.                     }
  618.                 }
  619.                 [ "$RET" = 1 ] && {
  620.                     echo "Making graph (${N}:${P}) ${RRDOUTPUT}/${IMGBASE}.png .."
  621.                     CreateGraph "${RRDOUTPUT}/${IMGBASE}.png" "$BACK" "${RRDgUM[$N]}" "$TITLE" "$RRDFILE" "${RRDgDEF[$N]}" "$EXTRA" "--graph-render-mode mono"
  622.                 }
  623.             done
  624.         ;;
  625.         graph_cron)
  626.             if [[ $N =~ ^[0-9]{1,3}$ ]]; then
  627.                 # grab hour and minute
  628.                 M=$(date "+%M")
  629.                 H=$(date "+%H")
  630.                 # do graphs
  631.                 if [ $CRON_GRAPH_TIME == "s" ]; then
  632.                         CRON_SUB_GRAPH=0
  633.                 elif [ $CRON_GRAPH_TIME == "h" ]; then
  634.                         CRON_SUB_GRAPH=1
  635.                 elif [ $CRON_GRAPH_TIME == "d" ]; then
  636.                         CRON_SUB_GRAPH=2
  637.                 elif [ $CRON_GRAPH_TIME == "w" ]; then
  638.                         CRON_SUB_GRAPH=3
  639.                 elif [ $CRON_GRAPH_TIME == "m" ]; then
  640.                         CRON_SUB_GRAPH=4
  641.                 elif [ $CRON_GRAPH_TIME == "y" ]; then
  642.                         CRON_SUB_GRAPH=5
  643.                 else
  644.                     exit 1
  645.                 fi
  646.                 P=$((((($N+1)*6)-6)+$CRON_SUB_GRAPH))
  647.                 [ -z "${RRDgGRAPH[$P]}" ] && continue
  648.                 BACK=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f1)
  649.                 IMGBASE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f2)
  650.                 TITLE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f3)
  651.                 EXTRA=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f5)
  652.                 [ ! -z "$FORCEGRAPH" ] && {
  653.                     RET=1
  654.                 } || {
  655.                     COND=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f4)
  656.                     [ -z "$COND" ] && RET=1 || {
  657.                         COND="if ${COND}; then RET=1; else RET=0; fi"
  658.                         eval "$COND"
  659.                     }
  660.                 }
  661.                 [ "$RET" = 1 ] && {
  662.                     echo "Making graph (${N}:${P}) ${RRDOUTPUT}/${IMGBASE}.png .."
  663.                     CreateGraph "${RRDOUTPUT}/${IMGBASE}.png" "$BACK" "${RRDgUM[$N]}" "$TITLE" "$RRDFILE" "${RRDgDEF[$N]}" "$EXTRA"
  664.                 }
  665.             fi
  666.         ;;
  667.         *)
  668.             echo "Usage: rrdstorm {create|update|graph|graph_cron[s h d w m y]} 0 1 2 .."
  669.             exit 1
  670.         ;;
  671.     esac
  672. done
  673.  
  674. # close the main HTML index
  675. [ ! -z "$MAKEINDEX" ] && {
  676.     echo "</ul><p>RRDStorm for ${VERSION} / ${DATE}</p></body>" >> "$HTMLINDEX"
  677. }
  678.  
  679. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement