Advertisement
Guest User

dz0ny

a guest
Jul 29th, 2008
1,585
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 22.45 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.   'VDEF:avgU=usr,AVERAGE'
  255.   GPRINT:maxU:"Max %6.2lf%%"
  256.   GPRINT:minU:"Min %6.2lf%%"
  257.   GPRINT:avgU:"Avg %6.2lf%%\n"
  258. 'AREA:idl#EEFFFF:Idle  :STACK'
  259.   'VDEF:maxI=idl,MAXIMUM'
  260.   'VDEF:minI=idl,MINIMUM'
  261.   'VDEF:avgI=idl,AVERAGE'
  262.   GPRINT:maxI:"Max %6.2lf%%"
  263.   GPRINT:minI:"Min %6.2lf%%"
  264.   GPRINT:avgI:"Avg %6.2lf%%\n"
  265. EOF
  266. )
  267.  
  268. RRDgGRAPH[18]='3600|cpu1|CPU Usage (1H)|[ "$M" = 30 ]|-l 0 -r -u 99.99'
  269. RRDgGRAPH[19]='14400|cpu6|CPU Usage (4H)|[ "$M" = 30 ]|-r -l 0 -u 99.99'
  270. 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'
  271. 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"'
  272. RRDgGRAPH[22]='2678400|cpuM|CPU Usage (last month)|[ "$H" = 04 ] && [ "$M" = 30 ]|-r -l 0 -u 99.99'
  273. RRDgGRAPH[23]='31536000|cpuY|CPU Usage (last year)|[ "$H" = 04 ] && [ "$M" = 30 ]|-r -l 0 -u 99.99'
  274.  
  275. #-------------------------------------------------------------------
  276. # network stats
  277. #-------------------------------------------------------------------
  278.  
  279. RRDcFILE[4]="wan:60:WAN Traffic"
  280. RRDcDEF[4]='
  281. DS:in:DERIVE:600:0:12500000
  282. DS:out:DERIVE:600:0:12500000
  283. RRA:AVERAGE:0.5:1:576
  284. RRA:AVERAGE:0.5:6:672
  285. RRA:AVERAGE:0.5:24:732
  286. RRA:AVERAGE:0.5:144:1460
  287. '
  288. RRDuSRC[4]="in:out"
  289. RRDuVAL[4]='
  290. IF="vlan1"
  291. IN=$(grep "${IF}" /proc/net/dev|awk -F ":" "{print \$2}"|awk "{print \$1}")
  292. OUT=$(grep "${IF}" /proc/net/dev|awk -F ":" "{print \$2}"|awk "{print \$9}")
  293. echo "${IN}:${OUT}"
  294. '
  295. RRDgUM[4]='bytes/s'
  296. RRDgLIST[4]="24 25 26 27 28 29"
  297. RRDgDEF[4]=$(cat <<EOF
  298. 'DEF:ds1=\$RRD:in:AVERAGE'
  299. 'DEF:ds2=\$RRD:out:AVERAGE'
  300.   'VDEF:max1=ds1,MAXIMUM'
  301. 'CDEF:ui=ds1,UN,0,ds1,IF,0,GT,UNKN,NEGINF,IF'
  302. 'CDEF:uo=0,ds1,UN,0,ds1,IF,0,GT,max1,50,/,UNKN,IF,-'
  303. 'CDEF:bi=ds1,UN,0,ds1,IF,0,GT,INF,UNKN,IF'
  304. 'CDEF:bo=ds1,UN,0,ds1,IF,0,GT,UNKN,INF,IF'
  305. 'AREA:bi#EDFEED:'
  306. 'AREA:ds1#00B5E3:Incoming'
  307. 'LINE1:ds1#0085B3:'
  308.   'VDEF:min1=ds1,MINIMUM'
  309.   'VDEF:avg1=ds1,AVERAGE'
  310.   'VDEF:tot1=ds1,TOTAL'
  311.   GPRINT:max1:"Max %6.2lf %s"
  312.   GPRINT:min1:"Min %6.2lf %s"
  313.   GPRINT:avg1:"Avg %6.2lf %s"
  314.   GPRINT:tot1:"Sum %6.2lf %s"
  315. 'AREA:ui#FF6666:Offline\n'
  316. 'LINE2:ds2#E32D00:Outgoing'
  317.   'VDEF:max2=ds2,MAXIMUM'
  318.   'VDEF:min2=ds2,MINIMUM'
  319.   'VDEF:avg2=ds2,AVERAGE'
  320.   'VDEF:tot2=ds2,TOTAL'
  321.   GPRINT:max2:"Max %6.2lf %s"
  322.   GPRINT:min2:"Min %6.2lf %s"
  323.   GPRINT:avg2:"Avg %6.2lf %s"
  324.   GPRINT:tot2:"Sum %6.2lf %s"
  325. 'AREA:bo#FEEDED:'
  326. 'AREA:uo#00FE00:Online'
  327. 'HRULE:0#000000'
  328. EOF
  329. )  
  330.    
  331. RRDgGRAPH[24]='3600|wan1|WAN Traffic (1H)|[ "$M" = 30 ]|-r'
  332. RRDgGRAPH[25]='14400|wan6|WAN Traffic (4H)|[ "$M" = 30 ]|-r'
  333. RRDgGRAPH[26]='86400|wan24|WAN Traffic (24H)|[ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  334. 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"'
  335. RRDgGRAPH[28]='2678400|wanM|WAN Traffic (last month)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r '
  336. RRDgGRAPH[29]='31536000|wanY|WAN Traffic (last year)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r '
  337.  
  338. #-------------------------------------------------------------------
  339. # disk space
  340. #-------------------------------------------------------------------
  341.  
  342. RRDcFILE[5]="hdd:60:Disk space"
  343. RRDcDEF[5]='
  344. DS:optprosto:GAUGE:600:0:U 
  345. DS:optzasede:GAUGE:600:0:U
  346. DS:mntprosto:GAUGE:600:0:U
  347. DS:mntzasede:GAUGE:600:0:U
  348. RRA:AVERAGE:0.5:1:576
  349. RRA:AVERAGE:0.5:6:672
  350. RRA:AVERAGE:0.5:24:732
  351. RRA:AVERAGE:0.5:144:1460
  352. '
  353. RRDuSRC[5]="optprosto:optzasede:mntprosto:mntzasede"
  354. RRDuVAL[5]='
  355. SP=$(/opt/bin/coreutils-df "-B1")
  356. echo -n $(echo "$SP"|grep opt|awk "{print \$3\":\"\$2}"):
  357. echo -n $(echo "$SP"|grep mnt|awk "{print \$3\":\"\$2}")
  358. echo
  359. '
  360. RRDgUM[5]='space (bytes)'
  361. RRDgLIST[5]="30 31 32 33 34 35"
  362. RRDgDEF[5]=$(cat <<EOF
  363. 'DEF:optzasede=\$RRD:optzasede:AVERAGE'
  364. 'DEF:optprosto=\$RRD:optprosto:AVERAGE'
  365. 'DEF:mntzasede=\$RRD:mntzasede:AVERAGE'
  366. 'DEF:mntprosto=\$RRD:mntprosto:AVERAGE'
  367. 'CDEF:bo=mntzasede,UN,0,mntzasede,IF,0,GT,UNKN,INF,IF'
  368. 'AREA:bo#DDDDDD:'
  369. 'AREA:mntzasede#CC0033:/mnt:'
  370.   'CDEF:root=mntzasede,mntprosto,+'
  371.   'VDEF:sumr=root,LAST'
  372.   GPRINT:sumr:"Total %6.2lf %sB"
  373.   'VDEF:lasr=mntzasede,LAST'
  374.   GPRINT:lasr:"Used %6.2lf %sB"
  375.   'CDEF:rootPu=mntzasede,100,*,root,/'
  376.   'VDEF:procr=rootPu,LAST'
  377.   GPRINT:procr:"%6.2lf%%"
  378. 'AREA:mntprosto#EC2053:Free:STACK'
  379.   'VDEF:lasra=mntprosto,LAST'
  380.   GPRINT:lasra:"%6.2lf %sB"
  381.   'CDEF:rootPa=100,rootPu,-'
  382.   'VDEF:procar=rootPa,LAST'
  383.   GPRINT:procar:"%6.2lf%%\n"
  384. 'AREA:optzasede#33CC00:/opt:STACK'
  385.   'CDEF:home=optzasede,optprosto,+'
  386.   'VDEF:sumh=home,LAST'
  387.   GPRINT:sumh:"Total %6.2lf %sB"
  388.   'VDEF:lash=optzasede,LAST'
  389.   GPRINT:lash:"Used %6.2lf %sB"
  390.   'CDEF:homePu=optzasede,100,*,home,/'
  391.   'VDEF:proch=homePu,LAST'
  392.   GPRINT:proch:"%6.2lf%%"
  393. 'AREA:optprosto#53EC20:Free:STACK'
  394.   'VDEF:lasha=optprosto,LAST'
  395.   GPRINT:lasha:"%6.2lf %sB"
  396.   'CDEF:homePa=100,homePu,-'
  397.   'VDEF:procah=homePa,LAST'
  398.   GPRINT:procah:"%6.2lf%%\n"
  399. EOF
  400. )  
  401.  
  402. RRDgGRAPH[30]='3600|hdd1|Disk space (1H)|[ "$M" = 30 ]|-r -l 0'
  403. RRDgGRAPH[31]='14400|hdd6|Disk space (4H)|[ "$M" = 30 ]|-r -l 0'
  404. 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'
  405. 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"'
  406. RRDgGRAPH[34]='2678400|hddM|Disk space (last month)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r -l 0'
  407. RRDgGRAPH[35]='31536000|hddY|Disk space (last year)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r -l 0'
  408.  
  409. #-------------------------------------------------------------------
  410. # network stats
  411. #-------------------------------------------------------------------
  412.  
  413. RRDcFILE[6]="wlan:60:WLAN Traffic"
  414. RRDcDEF[6]='
  415. DS:in:DERIVE:600:0:U
  416. DS:out:DERIVE:600:0:U
  417. RRA:AVERAGE:0.5:1:576
  418. RRA:AVERAGE:0.5:6:672
  419. RRA:AVERAGE:0.5:24:732
  420. RRA:AVERAGE:0.5:144:1460
  421. '
  422. RRDuSRC[6]="in:out"
  423. RRDuVAL[6]='
  424. IF="eth1"
  425. IN=$(grep "${IF}" /proc/net/dev|awk -F ":" "{print \$2}"|awk "{print \$1}")
  426. OUT=$(grep "${IF}" /proc/net/dev|awk -F ":" "{print \$2}"|awk "{print \$9}")
  427. echo "${IN}:${OUT}"
  428. '
  429. RRDgUM[6]='bytes/s'
  430. RRDgLIST[6]="36 37 38 39 40 41"
  431. RRDgDEF[6]=$(cat <<EOF
  432. 'DEF:ds1=\$RRD:in:AVERAGE'
  433. 'DEF:ds2=\$RRD:out:AVERAGE'
  434.   'VDEF:max1=ds1,MAXIMUM'
  435. 'CDEF:ui=ds1,UN,0,ds1,IF,0,GT,UNKN,NEGINF,IF'
  436. 'CDEF:uo=0,ds1,UN,0,ds1,IF,0,GT,max1,50,/,UNKN,IF,-'
  437. 'CDEF:bi=ds1,UN,0,ds1,IF,0,GT,INF,UNKN,IF'
  438. 'CDEF:bo=ds1,UN,0,ds1,IF,0,GT,UNKN,INF,IF'
  439. 'AREA:bi#EDFEED:'
  440. 'AREA:ds1#00B5E3:Incoming'
  441. 'LINE1:ds1#0085B3:'
  442.   'VDEF:min1=ds1,MINIMUM'
  443.   'VDEF:avg1=ds1,AVERAGE'
  444.   'VDEF:tot1=ds1,TOTAL'
  445.   GPRINT:max1:"Max %6.2lf %s"
  446.   GPRINT:min1:"Min %6.2lf %s"
  447.   GPRINT:avg1:"Avg %6.2lf %s"
  448.   GPRINT:tot1:"Sum %6.2lf %s"
  449. 'AREA:ui#FF6666:Offline\n'
  450. 'LINE2:ds2#E32D00:Outgoing'
  451.   'VDEF:max2=ds2,MAXIMUM'
  452.   'VDEF:min2=ds2,MINIMUM'
  453.   'VDEF:avg2=ds2,AVERAGE'
  454.   'VDEF:tot2=ds2,TOTAL'
  455.   GPRINT:max2:"Max %6.2lf %s"
  456.   GPRINT:min2:"Min %6.2lf %s"
  457.   GPRINT:avg2:"Avg %6.2lf %s"
  458.   GPRINT:tot2:"Sum %6.2lf %s"
  459. 'AREA:bo#FEEDED:'
  460. 'AREA:uo#00FE00:Online'
  461. 'HRULE:0#000000'
  462. EOF
  463. )  
  464.    
  465. RRDgGRAPH[36]='3600|wlan1|WLAN Traffic (1H)|[ "$M" = 30 ]|-r'
  466. RRDgGRAPH[37]='14400|wlan6|WLAN Traffic (4H)|[ "$M" = 30 ]|-r'
  467. RRDgGRAPH[38]='86400|wlan24|WLAN Traffic (24H)|[ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  468. 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"'
  469. RRDgGRAPH[40]='2678400|wlanM|WLAN Traffic (last month)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r '
  470. RRDgGRAPH[41]='31536000|wlanY|WLAN Traffic (last year)|[ "$H" = 04 ] && [ "$M" -ge 30 ] && [ "$M" -le 45 ]|-r '
  471.  
  472. #-------------------------------------------------------------------
  473. # swap allocation
  474. #-------------------------------------------------------------------
  475.  
  476. RRDcFILE[7]="mem:60:Swap allocation"
  477. RRDgUM[7]='bytes'
  478. RRDgLIST[7]="42 43 44 45 46 47"
  479. RRDgDEF[7]=$(cat <<EOF
  480. 'DEF:sT=\$RRD:swapt:AVERAGE'
  481. 'DEF:sF=\$RRD:swapf:AVERAGE'
  482. 'CDEF:sU=sT,sF,-'
  483. 'CDEF:bo=sT,UN,0,sT,IF,0,GT,UNKN,561936,IF'
  484. 'AREA:bo#FFCCCC:'
  485. 'AREA:sU#9999FF:Used'
  486. 'AREA:sF#FFFF99:Free:STACK'
  487. 'LINE:sU#7777DD:'
  488. 'HRULE:31832#FF0000'
  489. 'HRULE:561936#FF0000'
  490. EOF
  491. )
  492.  
  493. RRDgGRAPH[42]='3600|swap1|Swap last hour|[ "$M" = 30 ]|-l 0 -r'
  494. RRDgGRAPH[43]='14400|swap6|Swap last 4H|[ "$M" = 30 ]|-l 0 -r'
  495. RRDgGRAPH[44]='86400|swap24|Swap last 24H|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r --x-grid HOUR:1:DAY:1:HOUR:1:0:%H'
  496. 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"'
  497. RRDgGRAPH[46]='2678400|swapM|Swap last month|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r'
  498. RRDgGRAPH[47]='31536000|swapY|Swap last year|[ "$H" = 04 ] && [ "$M" = 30 ]|-l 0 -r'
  499.  
  500.  
  501.  
  502.  
  503. ####################################################################
  504. # STOP MODIFICATIONS HERE, UNLESS YOU REALLY KNOW WHAT YOU'RE DOING
  505. ####################################################################
  506.  
  507. #-------------------------------------------------------------------
  508. # functions
  509. #-------------------------------------------------------------------
  510.  
  511. #1=rrdfile 2=step 3=definition
  512. CreateRRD()
  513. {  
  514.     "$RRDTOOL" create "$1" --step "$2" $3
  515. }
  516.  
  517. #1=file, 2=data sources, 3=values
  518. UpdateRRD()
  519. {
  520.     "$RRDUPDATE" "$1" -t "$2" "N:${3}"
  521. }
  522.  
  523. #1=imgfile, 2=secs to go back, 3=um text, 4=title text,
  524. #5=rrdfile, 6=definition, 7=extra params
  525. CreateGraph()
  526. {
  527.   RRD="$5"
  528.     DEF=$(echo "${6} "|sed 's/"/\\"/g'|sed '/[^ ]$/s/$/ \\/')
  529.   eval "DEF=\"$DEF\""
  530.     eval "\"$RRDTOOL\" graph \"$1\" $7 -M -a PNG -s \"-${2}\" -e -20 -w 550 -h 240 -v \"$3\" -t \"$4\" $DEF"
  531. }
  532.  
  533. #-------------------------------------------------------------------
  534. # main code
  535. #-------------------------------------------------------------------
  536.  
  537. # TODO: examine parameters and output help if any mistake
  538.  
  539. # grab command
  540. COMMAND="$1"
  541. CRON_GRAPH_TIME="$2"
  542. shift
  543.  
  544. # prepare main HTML index file
  545. [ "$COMMAND" = create ] && {
  546.     HTMLINDEX="${RRDOUTPUT}/index.html"
  547.     [ -f "$HTMLINDEX" ] || {
  548.         echo "<head><title>RRDStorm</title>
  549.             <style>body{background:white;color:black}</style></head>
  550.             <body><h1>RRDStorm</h1><ul>" > "$HTMLINDEX"
  551.         MAKEINDEX=yes
  552.     }
  553. }
  554. # cycle numbers
  555. for N in "$@"; do
  556.     # does this N exist?
  557.     [ -z "${RRDcFILE[$N]}" ] && continue
  558.     # extract common data
  559.     FILEBASE=$(echo "${RRDcFILE[$N]}"|awk -F: '{print $1}')
  560.     RRDFILE="${RRDDATA}/${FILEBASE}.rrd"
  561.     # honor command
  562.     case "$COMMAND" in
  563.         create)
  564.             # extract base data
  565.             HTMLFILE="${RRDOUTPUT}/${FILEBASE}.html"
  566.             STEP=$(echo "${RRDcFILE[$N]}"|awk -F: '{print $2}')
  567.             HTITLE=$(echo "${RRDcFILE[$N]}"|awk -F: '{print $3}')
  568.             # check RRD archive
  569.             [ -d "$RRDDATA" ] || mkdir -p "$RRDDATA"
  570.             [ -f "$RRDFILE" ] || CreateRRD  "$RRDFILE" "$STEP" "${RRDcDEF[$N]}"
  571.             # check individual HTML file
  572.             [ -d "$RRDOUTPUT" ] || mkdir -p "$RRDOUTPUT"
  573.             [ -f "$HTMLFILE" ] || {
  574.                 echo "<head><title>${HTITLE}</title>
  575.                     <style>body{background:white;color:black}</style></head>
  576.                     <body><h1>${HTITLE}</h1><center>" > "$HTMLFILE"
  577.                 for P in ${RRDgLIST[$N]}; do
  578.                     [ -z "${RRDgGRAPH[$P]}" ] && continue
  579.                     IMGBASE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f2)
  580.                     echo "<img src=\"${IMGBASE}.png\"><br>" >> "$HTMLFILE"
  581.                 done
  582.                 echo "</center><p>RRDStorm for ${VERSION} / ${DATE}</p></body>" >> "$HTMLFILE"
  583.             }
  584.             # update the main HTML index
  585.             [ ! -z "$MAKEINDEX" ] && {
  586.                 echo "<li><a href=\"${FILEBASE}.html\">${HTITLE}</a>" >> "$HTMLINDEX"
  587.             }
  588.         ;;
  589.         update)
  590.             VAL=$(eval "${RRDuVAL[$N]}")
  591.             echo "Updating ($N) $RRDFILE with $VAL .."
  592.             UpdateRRD "$RRDFILE" "${RRDuSRC[$N]}" "$VAL"
  593.         help)
  594.             echo "Usage: rrdstorm {create|update|graph|graph_cron[s h d w m y]} 0 1 2 .."
  595.             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 .."
  596.         ;;
  597.         graph)
  598.             # grab hour and minute
  599.             M=$(date "+%M")
  600.             H=$(date "+%H")
  601.             # do graphs
  602.             for P in ${RRDgLIST[$N]}; do
  603.                 [ -z "${RRDgGRAPH[$P]}" ] && continue
  604.                 BACK=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f1)
  605.                 IMGBASE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f2)
  606.                 TITLE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f3)
  607.                 EXTRA=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f5)
  608.                 [ ! -z "$FORCEGRAPH" ] && {
  609.                     RET=1
  610.                 } || {
  611.                     COND=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f4)
  612.                     [ -z "$COND" ] && RET=1 || {
  613.                         COND="if ${COND}; then RET=1; else RET=0; fi"
  614.                         eval "$COND"
  615.                     }
  616.                 }
  617.                 [ "$RET" = 1 ] && {
  618.                     echo "Making graph (${N}:${P}) ${RRDOUTPUT}/${IMGBASE}.png .."
  619.                     CreateGraph "${RRDOUTPUT}/${IMGBASE}.png" "$BACK" "${RRDgUM[$N]}" "$TITLE" "$RRDFILE" "${RRDgDEF[$N]}" "$EXTRA" "--graph-render-mode mono"
  620.                 }
  621.             done
  622.         ;;
  623.         graph_cron)
  624.             if [[ $N =~ ^[0-9]{1,3}$ ]]; then
  625.                 # grab hour and minute
  626.                 M=$(date "+%M")
  627.                 H=$(date "+%H")
  628.                 # do graphs
  629.                 if [ $CRON_GRAPH_TIME == "s" ]; then
  630.                         CRON_SUB_GRAPH=0
  631.                 elif [ $CRON_GRAPH_TIME == "h" ]; then
  632.                         CRON_SUB_GRAPH=1
  633.                 elif [ $CRON_GRAPH_TIME == "d" ]; then
  634.                         CRON_SUB_GRAPH=2
  635.                 elif [ $CRON_GRAPH_TIME == "w" ]; then
  636.                         CRON_SUB_GRAPH=3
  637.                 elif [ $CRON_GRAPH_TIME == "m" ]; then
  638.                         CRON_SUB_GRAPH=4
  639.                 elif [ $CRON_GRAPH_TIME == "y" ]; then
  640.                         CRON_SUB_GRAPH=5
  641.                 else
  642.                     exit 1
  643.                 fi
  644.                 P=$((((($N+1)*6)-6)+$CRON_SUB_GRAPH))
  645.                 [ -z "${RRDgGRAPH[$P]}" ] && continue
  646.                 BACK=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f1)
  647.                 IMGBASE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f2)
  648.                 TITLE=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f3)
  649.                 EXTRA=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f5)
  650.                 [ ! -z "$FORCEGRAPH" ] && {
  651.                     RET=1
  652.                 } || {
  653.                     COND=$(echo "${RRDgGRAPH[$P]}"|cut -d'|' -f4)
  654.                     [ -z "$COND" ] && RET=1 || {
  655.                         COND="if ${COND}; then RET=1; else RET=0; fi"
  656.                         eval "$COND"
  657.                     }
  658.                 }
  659.                 [ "$RET" = 1 ] && {
  660.                     echo "Making graph (${N}:${P}) ${RRDOUTPUT}/${IMGBASE}.png .."
  661.                     CreateGraph "${RRDOUTPUT}/${IMGBASE}.png" "$BACK" "${RRDgUM[$N]}" "$TITLE" "$RRDFILE" "${RRDgDEF[$N]}" "$EXTRA"
  662.                 }
  663.             fi
  664.         ;;
  665.         *)
  666.             echo "Usage: rrdstorm {create|update|graph|graph_cron[s h d w m y]} 0 1 2 .."
  667.             exit 1
  668.         ;;
  669.     esac
  670. done
  671.  
  672. # close the main HTML index
  673. [ ! -z "$MAKEINDEX" ] && {
  674.     echo "</ul><p>RRDStorm for ${VERSION} / ${DATE}</p></body>" >> "$HTMLINDEX"
  675. }
  676.  
  677. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement