slitaz-modular annotate initramfs/usr/bin/makegraphs @ rev 179

makegraphs: tune cpuinfo
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jan 15 08:09:01 2021 +0000 (2021-01-15)
parents 1015acfa7c32
children
rev   line source
slaxemulator@147 1 #!/bin/sh
slaxemulator@171 2 #*/5 * * * * /home/slitaz/www/tank/lib/makegraphs >/dev/null
slaxemulator@147 3
slaxemulator@147 4 # RRD database directory
slaxemulator@171 5 rrdlog="/home/slitaz/www/graphs/log/rrd"
slaxemulator@147 6
slaxemulator@147 7 # Images directory
slaxemulator@171 8 rrdgraph="/home/slitaz/www/graphs/images/rrd"
slaxemulator@147 9
slaxemulator@147 10 # Colors
slaxemulator@147 11 rrdcolors="--color SHADEA#FFFFFF --color SHADEB#FFFFFF --color BACK#FFFFFF"
slaxemulator@147 12 rrdgraphargs="-aPNG -i -z --alt-y-grid -w 600 -h 100 -r $rrdcolors"
slaxemulator@147 13
slaxemulator@147 14 [ -d $rrdlog ] || mkdir -p $rrdlog
slaxemulator@147 15 [ -d $rrdgraph ] || mkdir -p $rrdgraph
slaxemulator@147 16
slaxemulator@147 17 updatecpudata() {
slaxemulator@147 18 [ -e "$rrdlog/cpu.rrd" ] || rrdtool create $rrdlog/cpu.rrd --step=300 \
slaxemulator@147 19 DS:user:COUNTER:600:0:500000000 \
slaxemulator@171 20 DS:nice:COUNTER:600:0:500000000 \
slaxemulator@147 21 DS:system:COUNTER:600:0:500000000 \
slaxemulator@147 22 DS:idle:COUNTER:600:0:500000000 \
slaxemulator@171 23 DS:iowait:COUNTER:600:0:500000000 \
slaxemulator@171 24 DS:irq:COUNTER:600:0:500000000 \
slaxemulator@171 25 DS:softirq:COUNTER:600:0:500000000 \
slaxemulator@171 26 DS:celsius:GAUGE:600:0:50000 \
slaxemulator@147 27 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@147 28 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@171 29 grep '^cpu' /proc/stat | while read cpu user nice system idle iowait irq softirq misc; do
slaxemulator@171 30 celsius=$(find /sys | grep /temp._input | xargs cat | \
slaxemulator@171 31 awk '{ if ($0 > max) max=$0 } END { print max/1 }')
slaxemulator@171 32 rrdtool update $rrdlog/cpu.rrd \
slaxemulator@171 33 -t celsius:nice:user:system:idle:iowait:irq:softirq \
slaxemulator@171 34 N:$celsius:$nice:$user:$system:$idle:$iowait:$irq:$softirq
slaxemulator@147 35 break
slaxemulator@147 36 done
slaxemulator@147 37 }
slaxemulator@147 38
slaxemulator@147 39 updatecpugraph() {
slaxemulator@147 40 period=$1
pascal@179 41 info="$(grep '^model name' /etc/cpuinfo | cut -d: -f2 \
slaxemulator@171 42 | sed 's/ * / /g' | awk '
slaxemulator@171 43 { s=$0 ; n++ }
slaxemulator@171 44 END { if (n > 1) printf " %dx",n; print s }')"
slaxemulator@147 45 rrdtool graph "$rrdgraph/cpu-$period.png" --start -1$period \
slaxemulator@147 46 $rrdgraphargs -l 0 -u 100 -t "cpu usage per $period [$info ]" \
slaxemulator@147 47 DEF:user=$rrdlog/cpu.rrd:user:AVERAGE \
slaxemulator@147 48 DEF:system=$rrdlog/cpu.rrd:system:AVERAGE \
slaxemulator@147 49 DEF:idle=$rrdlog/cpu.rrd:idle:AVERAGE \
slaxemulator@171 50 DEF:nice=$rrdlog/cpu.rrd:nice:AVERAGE \
slaxemulator@171 51 DEF:celsius=$rrdlog/cpu.rrd:celsius:AVERAGE \
slaxemulator@171 52 'CDEF:total=user,system,idle,nice,+,+,+' \
slaxemulator@147 53 'CDEF:userpct=100,user,total,/,*' \
slaxemulator@147 54 'CDEF:systempct=100,system,total,/,*' \
slaxemulator@147 55 'CDEF:idlepct=100,idle,total,/,*' \
slaxemulator@171 56 'CDEF:nicepct=100,nice,total,/,*' \
slaxemulator@171 57 'CDEF:temp=celsius,1000,/' \
slaxemulator@147 58 'AREA:userpct#0000FF:user cpu usage' \
slaxemulator@171 59 'STACK:nicepct#C0C0FF:nice cpu usage' \
slaxemulator@147 60 'STACK:systempct#FF0000:system cpu usage' \
slaxemulator@171 61 'STACK:idlepct#00FF00:idle cpu usage' \
slaxemulator@171 62 'LINE1:temp#000000:temperature\g' \
slaxemulator@171 63 'GPRINT:temp:MAX:max %2.0lfC\j'
slaxemulator@147 64 }
slaxemulator@147 65
slaxemulator@147 66 updatememgraph() {
slaxemulator@147 67 period=$1
slaxemulator@147 68 info="$(free | awk '\
slaxemulator@147 69 { \
slaxemulator@147 70 if (/Mem:/) { \
slaxemulator@147 71 if ($2 < 10000) printf "%d KB",$2; \
slaxemulator@147 72 else if ($2 < 10000000) printf "%d MB",$2/1024; \
slaxemulator@147 73 else printf "%d GB",$2/1024/1024; \
slaxemulator@147 74 } \
slaxemulator@147 75 }')"
slaxemulator@147 76 info2="$(free | awk '\
slaxemulator@147 77 { \
slaxemulator@147 78 if (/Swap:/) { \
slaxemulator@147 79 if ($2 < 10000) printf "%d KB",$2; \
slaxemulator@147 80 else if ($2 < 10000000) printf "%d MB",$2/1024; \
slaxemulator@147 81 else printf "%d GB",$2/1024/1024; \
slaxemulator@147 82 } \
slaxemulator@147 83 }')"
slaxemulator@147 84 rrdtool graph "$rrdgraph/memory-$period.png" --start -1$period \
slaxemulator@147 85 $rrdgraphargs -l 0 -u 100 \
slaxemulator@147 86 -t "memory usage per $period [ $info + $info2 swap ]" \
slaxemulator@147 87 DEF:used=$rrdlog/mem.rrd:memused:AVERAGE \
slaxemulator@147 88 DEF:free=$rrdlog/mem.rrd:memfree:AVERAGE \
slaxemulator@147 89 DEF:shared=$rrdlog/mem.rrd:memshared:AVERAGE \
slaxemulator@147 90 DEF:buffer=$rrdlog/mem.rrd:membuffers:AVERAGE \
slaxemulator@147 91 DEF:cache=$rrdlog/mem.rrd:memcache:AVERAGE \
slaxemulator@147 92 DEF:swused=$rrdlog/mem.rrd:swapused:AVERAGE \
slaxemulator@147 93 DEF:swfree=$rrdlog/mem.rrd:swapfree:AVERAGE \
slaxemulator@147 94 'CDEF:total=used,free,+' \
slaxemulator@147 95 'CDEF:used2=used,buffer,cache,shared,+,+,-' \
slaxemulator@147 96 'CDEF:usedpct=100,used2,total,/,*' \
slaxemulator@147 97 'CDEF:sharedpct=100,shared,total,/,*' \
slaxemulator@147 98 'CDEF:bufferpct=100,buffer,total,/,*' \
slaxemulator@147 99 'CDEF:cachepct=100,cache,total,/,*' \
slaxemulator@147 100 'CDEF:freepct=100,free,total,/,*' \
slaxemulator@147 101 'CDEF:swtotal=swused,swfree,+' \
slaxemulator@147 102 'CDEF:swusedpct=100,swused,swtotal,/,*' \
slaxemulator@147 103 'AREA:usedpct#0000FF:used memory' \
slaxemulator@147 104 'STACK:sharedpct#FF7F00:shared memory' \
slaxemulator@147 105 'STACK:bufferpct#FF00FF:buffered memory' \
slaxemulator@147 106 'STACK:cachepct#FFFF00:cached memory' \
slaxemulator@147 107 'STACK:freepct#00FF00:free memory' \
slaxemulator@147 108 'LINE2:swusedpct#FF0000:used swap\j'
slaxemulator@147 109 }
slaxemulator@147 110
slaxemulator@147 111 updatememdata () {
slaxemulator@147 112 [ -e "$rrdlog/mem.rrd" ] ||
slaxemulator@147 113 rrdtool create "$rrdlog/mem.rrd" --step=300 \
slaxemulator@147 114 DS:memused:ABSOLUTE:600:0:5000000000 \
slaxemulator@147 115 DS:memfree:ABSOLUTE:600:0:5000000000 \
slaxemulator@147 116 DS:memshared:ABSOLUTE:600:0:5000000000 \
slaxemulator@147 117 DS:membuffers:ABSOLUTE:600:0:5000000000 \
slaxemulator@147 118 DS:memcache:ABSOLUTE:600:0:5000000000 \
slaxemulator@147 119 DS:swapused:ABSOLUTE:600:0:5000000000 \
slaxemulator@147 120 DS:swapfree:ABSOLUTE:600:0:5000000000 \
slaxemulator@147 121 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@147 122 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@147 123
slaxemulator@147 124 while read tag count unit; do
slaxemulator@147 125 case "$tag" in
slaxemulator@171 126 MemTotal:) memtotal=$count;;
slaxemulator@171 127 MemFree:) memfree=$count
slaxemulator@147 128 memused=$(($memtotal - $memfree))
slaxemulator@147 129 memshared=0;;
slaxemulator@171 130 MemShared:) memshared=$count;;
slaxemulator@171 131 Buffers:) membuffers=$count;;
slaxemulator@171 132 Cached:) memcache=$count;;
slaxemulator@171 133 SwapTotal:) swaptotal=$count;;
slaxemulator@171 134 SwapFree:) swapfree=$count
slaxemulator@147 135 swapused=$(( $swaptotal - $swapfree));;
slaxemulator@147 136 esac
slaxemulator@147 137 done < /proc/meminfo
slaxemulator@147 138
slaxemulator@147 139 rrdtool update "$rrdlog/mem.rrd" \
slaxemulator@147 140 -t memused:memfree:memshared:membuffers:memcache:swapused:swapfree \
slaxemulator@147 141 "N:$memused:$memfree:$memshared:$membuffers:$memcache:$swapused:$swapfree"
slaxemulator@147 142 }
slaxemulator@147 143
slaxemulator@147 144 getmax() {
slaxemulator@147 145 rrdtool fetch $rrdlog/$1.rrd AVERAGE | awk '\
slaxemulator@147 146 BEGIN {max=0} \
slaxemulator@147 147 /^[0-9]/ { \
slaxemulator@147 148 if ($2 != "nan" && $2 > max) max=$2; \
slaxemulator@147 149 if ($3 != "nan" && $3 > max) max=$3; \
slaxemulator@147 150 } \
slaxemulator@147 151 END { print max }' | sed 's/,/./'
slaxemulator@147 152 }
slaxemulator@147 153
slaxemulator@147 154 updatediskgraph() {
slaxemulator@147 155 period=$1
pascal@178 156 [ "$period" = "day" ] && maxdisk="$(getmax disk)"
slaxemulator@147 157 info=""
slaxemulator@147 158 [ -r $2 ] &&
slaxemulator@147 159 info="[ $(fdisk -l 2> /dev/null | grep "^Disk $2:" | \
slaxemulator@147 160 sed "s|Disk $2: \(.*\), .*|\1|") ]"
slaxemulator@147 161 if [ -e /sys/block/${2#/dev/}/device/iodone_cnt ]; then
slaxemulator@171 162 err=$(printf "%d\n" $(cat /sys/block/${2#/dev/}/device/ioerr_cnt) )
slaxemulator@171 163 done=$(printf "%d\n" $(cat /sys/block/${2#/dev/}/device/iodone_cnt) )
slaxemulator@171 164 rate=$(echo | awk "BEGIN { printf \"%.0e\\n\",$err/$done }")
slaxemulator@171 165 [ $err -eq 0 ] && rate="0"
slaxemulator@147 166 # --right-axis-label "I/O state %"
slaxemulator@147 167 rrdtool graph "$rrdgraph/disk-$period.png" --start -1$period \
slaxemulator@147 168 $rrdgraphargs -t "disk access per $period $info" \
slaxemulator@147 169 --logarithmic --lower-limit 1 -v "Sectors/second" --units=si \
slaxemulator@147 170 DEF:read=$rrdlog/disk.rrd:readsect:AVERAGE \
slaxemulator@147 171 DEF:write=$rrdlog/disk.rrd:writesect:AVERAGE \
slaxemulator@147 172 DEF:req=$rrdlog/iodisk.rrd:req:AVERAGE \
slaxemulator@147 173 DEF:done=$rrdlog/iodisk.rrd:done:AVERAGE \
slaxemulator@147 174 DEF:err=$rrdlog/iodisk.rrd:err:AVERAGE \
slaxemulator@147 175 "CDEF:readpct=100,read,$maxdisk,/,*" \
slaxemulator@147 176 "CDEF:writepct=100,write,$maxdisk,/,*" \
slaxemulator@147 177 "CDEF:errpct=100,err,req,/,*" \
slaxemulator@147 178 "CDEF:donepct=100,done,req,/,*" \
slaxemulator@171 179 "CDEF:errrate=err,done,/" \
slaxemulator@147 180 'AREA:readpct#0000FF:sectors read from disk' \
slaxemulator@171 181 "COMMENT:I/O error rate $rate" \
slaxemulator@147 182 'STACK:writepct#00FF00:sectors written to disk' \
slaxemulator@171 183 'LINE2:donepct#FFFF00:% I/O complete' \
slaxemulator@171 184 'LINE2:errpct#FF0000:% I/O error\j'
slaxemulator@147 185 else
slaxemulator@147 186 rrdtool graph "$rrdgraph/disk-$period.png" --start -1$period \
slaxemulator@147 187 $rrdgraphargs -t "disk access per $period $info" \
slaxemulator@147 188 --logarithmic --lower-limit 1 -v "Sectors/second" --units=si \
slaxemulator@147 189 DEF:read=$rrdlog/disk.rrd:readsect:AVERAGE \
slaxemulator@147 190 DEF:write=$rrdlog/disk.rrd:writesect:AVERAGE \
slaxemulator@147 191 "CDEF:readpct=100,read,$maxdisk,/,*" \
slaxemulator@147 192 "CDEF:writepct=100,write,$maxdisk,/,*" \
slaxemulator@147 193 'AREA:readpct#0000FF:sectors read from disk' \
slaxemulator@147 194 'STACK:writepct#00FF00:sectors written to disk'
slaxemulator@147 195 fi
slaxemulator@147 196 }
slaxemulator@147 197
slaxemulator@147 198 updatediskdata() {
slaxemulator@147 199 dev=$1
slaxemulator@147 200 [ -e "$rrdlog/disk.rrd" ] ||
slaxemulator@147 201 rrdtool create "$rrdlog/disk.rrd" --step=300 \
slaxemulator@147 202 DS:readsect:COUNTER:600:0:5000000000 \
slaxemulator@147 203 DS:writesect:COUNTER:600:0:5000000000 \
slaxemulator@147 204 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@147 205 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@147 206 [ -e "$rrdlog/iodisk.rrd" ] ||
slaxemulator@147 207 rrdtool create "$rrdlog/iodisk.rrd" --step=300 \
slaxemulator@147 208 DS:done:GAUGE:600:0:U DS:err:GAUGE:600:0:U \
slaxemulator@147 209 DS:req:GAUGE:600:0:U \
slaxemulator@147 210 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@147 211 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@147 212
slaxemulator@147 213 while read major minor name readreq readsect writereq writesect misc; do
slaxemulator@147 214 [ $major = $(( 0x$(stat -c %t $dev) )) ] || continue
slaxemulator@147 215 [ $minor = $(( 0x$(stat -c %T $dev) )) ] || continue
slaxemulator@147 216 rrdtool update "$rrdlog/disk.rrd" -t readsect:writesect \
slaxemulator@147 217 N:$readsect:$writesect
slaxemulator@147 218 done < /proc/diskstats
slaxemulator@147 219 disk=${dev:0:8}
slaxemulator@147 220 dir=/sys/block/${disk#/dev/}/device
slaxemulator@147 221 done=$(printf "%d\n" $(cat $dir/iodone_cnt 2> /dev/null) )
slaxemulator@147 222 err=$(printf "%d\n" $(cat $dir/ioerr_cnt 2> /dev/null) )
slaxemulator@147 223 req=$(printf "%d\n" $(cat $dir/iorequest_cnt 2> /dev/null) )
slaxemulator@147 224 rrdtool update "$rrdlog/iodisk.rrd" -t done:err:req N:$done:$err:$req
slaxemulator@147 225 }
slaxemulator@147 226
slaxemulator@147 227 updateifgraph() {
slaxemulator@147 228 interface=$1
slaxemulator@147 229 period=$2
slaxemulator@147 230 rrdtool graph "$rrdgraph/$interface-$period.png" --start -1$period \
slaxemulator@147 231 $rrdgraphargs -t "traffic on $interface graph per $period" \
slaxemulator@147 232 --logarithmic -A -v "Bytes/second" --units=si \
slaxemulator@147 233 DEF:incoming=$rrdlog/$interface.rrd:incoming:AVERAGE \
slaxemulator@147 234 DEF:outgoing=$rrdlog/$interface.rrd:outgoing:AVERAGE \
slaxemulator@147 235 'AREA:incoming#00FF00:incoming traffic' \
slaxemulator@171 236 'GPRINT:incoming:MAX:max input%8.3lf %sBps' \
slaxemulator@171 237 'GPRINT:outgoing:MAX:max output%8.3lf %sBps' \
slaxemulator@147 238 'LINE1:outgoing#0000FF:outgoing traffic\j'
slaxemulator@147 239 }
slaxemulator@147 240
slaxemulator@147 241 netframes() {
slaxemulator@147 242 ifconfig $1 | grep "$2 packets" | sed -re "s/.*$3:([0-9]+).*/\1/g"
slaxemulator@147 243 }
slaxemulator@147 244
slaxemulator@147 245 netstats() {
slaxemulator@147 246 ifconfig $1 | grep bytes | sed -re "s/.*$2 bytes:([0-9]+).*/\1/g"
slaxemulator@147 247 }
slaxemulator@147 248
slaxemulator@147 249 updateifdata() {
slaxemulator@147 250 interface=$1
slaxemulator@147 251 [ -e "$rrdlog/$interface.rrd" ] ||
slaxemulator@147 252 rrdtool create "$rrdlog/$interface.rrd" --step=300 \
slaxemulator@147 253 DS:incoming:COUNTER:600:0:U \
slaxemulator@147 254 DS:outgoing:COUNTER:600:0:U \
slaxemulator@147 255 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@147 256 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@147 257 [ -e "$rrdlog/packets-$interface.rrd" ] ||
slaxemulator@147 258 rrdtool create "$rrdlog/packets-$interface.rrd" --step=300 \
slaxemulator@147 259 DS:in:COUNTER:600:0:U DS:out:COUNTER:600:0:U \
slaxemulator@147 260 DS:inerr:COUNTER:600:0:U DS:outerr:COUNTER:600:0:U \
slaxemulator@147 261 DS:indrop:COUNTER:600:0:U DS:outdrop:COUNTER:600:0:U \
slaxemulator@147 262 DS:inov:COUNTER:600:0:U DS:outov:COUNTER:600:0:U \
slaxemulator@147 263 DS:frame:COUNTER:600:0:U DS:carrier:COUNTER:600:0:U \
slaxemulator@147 264 RRA:AVERAGE:0.5:1:576 RRA:AVERAGE:0.5:6:672 \
slaxemulator@147 265 RRA:AVERAGE:0.5:24:732 RRA:AVERAGE:0.5:144:1460
slaxemulator@147 266 rx=$(netstats $interface RX)
slaxemulator@147 267 tx=$(netstats $interface TX)
slaxemulator@147 268 rrdtool update "$rrdlog/$interface.rrd" -t incoming:outgoing \
slaxemulator@147 269 N:${rx:-U}:${tx:-U}
slaxemulator@147 270 rx=$(netframes $interface RX packets)
slaxemulator@147 271 tx=$(netframes $interface TX packets)
slaxemulator@147 272 rxerr=$(netframes $interface RX errors)
slaxemulator@147 273 txerr=$(netframes $interface TX errors)
slaxemulator@147 274 rxdrop=$(netframes $interface RX dropped)
slaxemulator@147 275 txdrop=$(netframes $interface TX dropped)
slaxemulator@147 276 rxov=$(netframes $interface RX overruns)
slaxemulator@147 277 txov=$(netframes $interface TX overruns)
slaxemulator@147 278 frame=$(netframes $interface RX frame)
slaxemulator@147 279 carrier=$(netframes $interface TX carrier)
slaxemulator@147 280 rrdtool update "$rrdlog/packets-$interface.rrd" \
slaxemulator@147 281 -t in:out:inerr:outerr:indrop:outdrop:inov:outov:frame:carrier \
slaxemulator@147 282 N:${rx:-U}:${tx:-U}:${rxerr:-U}:${txerr:-U}:${rxdrop:-U}:${txdrop:-U}:${rxov:-U}:${txov:-U}:${frame:-U}:${carrier:-U}
slaxemulator@147 283 }
slaxemulator@147 284
slaxemulator@147 285 getdisk()
slaxemulator@147 286 {
slaxemulator@147 287 local d
slaxemulator@147 288 local i
slaxemulator@147 289 d=$(stat -c %04D $1)
slaxemulator@147 290 for i in /dev/* ; do
pascal@178 291 [ $(stat -c "%02t%02T" $i) = $d ] || continue
slaxemulator@147 292 echo $i
slaxemulator@171 293 return
slaxemulator@147 294 done
slaxemulator@171 295 df $1 | sed '$!d;s/ .*$//'
slaxemulator@147 296 }
slaxemulator@147 297
slaxemulator@147 298 ###
slaxemulator@147 299 ### System graphs
slaxemulator@147 300 ###
slaxemulator@147 301
slaxemulator@147 302 updatecpudata
slaxemulator@147 303 updatecpugraph day
slaxemulator@147 304 updatecpugraph week
slaxemulator@147 305 updatecpugraph month
slaxemulator@147 306 updatecpugraph year
slaxemulator@147 307
slaxemulator@147 308 updatememdata
slaxemulator@147 309 updatememgraph day
slaxemulator@147 310 updatememgraph week
slaxemulator@147 311 updatememgraph month
slaxemulator@147 312 updatememgraph year
slaxemulator@147 313
slaxemulator@147 314 if [ -e /proc/diskstats ]; then
slaxemulator@147 315 disk=$(getdisk $0)
slaxemulator@147 316 updatediskdata $disk
slaxemulator@147 317 updatediskgraph day ${disk:0:8}
slaxemulator@147 318 updatediskgraph week ${disk:0:8}
slaxemulator@147 319 updatediskgraph month ${disk:0:8}
slaxemulator@147 320 updatediskgraph year ${disk:0:8}
slaxemulator@147 321 fi
slaxemulator@147 322
slaxemulator@147 323 iface=$(/sbin/route -n | awk '{ if (/^0.0.0.0/) print $8 }')
slaxemulator@147 324 updateifdata $iface
slaxemulator@147 325 updateifgraph $iface day
slaxemulator@147 326 updateifgraph $iface week
slaxemulator@147 327 updateifgraph $iface month
slaxemulator@147 328 updateifgraph $iface year