Layout 'Krebs'
Display 'DPF'

Variables {
    # Ticks:
    second 1000
    minute 60 * second
    
    # Standard Dimensions:
    linesize 53	# max line length, for status lines etc.
    width100 51	# full width after padding (border)
    width050 24	# 1/2 of full width
    width033 17	# 1/3 of full width
    width025 12	# 1/4 of full width
    width010  5	# 1/10 of full width

    # Colors:
    # ToDo: Alphakanal ausnutzen
    black     '000000'
    white     'ffffff'
    red       'ff0000'
    darkblue  '000066'
    lightgray 'b2b2b2'
    darkgray  '191919'
    barcolor0 '5f5fff'
    barcolor1 'ff5f5c'

    # To be set later by timers:
    FileMsg 'Dummy'
}

Display dpf {
   Driver 'DPF'
   Port 'usb0'
   Font '6x8'
   Foreground white
   Background darkblue
   Basecolor darkblue
}

Widget System {
    class 'Text'
    expression '*** ' . uname('nodename') . ' '. netinfo::ipaddr('eth0') . ' ***'
    width linesize
    align 'C'
    update 0
    Background lightgray
    Foreground darkgray
}

Widget Time {
    class 'Text' 
    expression strftime('%a, %d.%m.%Y  %H:%M:%S', time()) . '     Up: ' . uptime('%d days %H:%M:%S')
    width linesize   
    align 'C'
    update 1 * second
    Background lightgray
    Foreground darkgray
}

Widget Busy {
    class 'Text'
    expression proc_stat::cpu('busy', 0.5 * second)
    prefix 'Busy'
    postfix '%'
    width width050
    precision 1
    align 'R'
    update 0.5 * second
}

Widget BusyBar {
    class 'Bar'
    expression proc_stat::cpu('busy', 0.5 * second)
    expression2 proc_stat::cpu('system', 0.5 * second)
    length width050 
    direction 'E'
    update 0.5 * second
    Background darkgray
    BarColor0 barcolor0 
    BarColor1 barcolor1 
}

Widget Load {
    class 'Text'
    expression loadavg(1)
    prefix 'Load'
    postfix loadavg(1) > 1.0 ? '!' : ' '
    width width050
    precision 1
    align 'R'
    update 0.5 * second
#    Foreground loadavg(1) > 1.0 ? red : white
}

Widget LoadBar {
    class 'Bar'
    expression loadavg(1)
    max 4.0
    length width050
    direction 'E'
    update 0.5 * second
    Background darkgray
    BarColor0 barcolor0 
    BarColor1 barcolor1 
}

Widget Disk {
    class 'Text'
    # disk.[rw]blk return blocks, we assume a blocksize of 512
    # to get the number in kB/s we would do blk*512/1024, which is blk/2
    # expression (proc_stat::disk('.*', 'rblk', 0.5 * second)+proc_stat::disk('.*', 'wblk', 0.5 * second))/2
    # with kernel 2.6, disk_io disappeared from /proc/stat but moved to /proc/diskstat
    # therefore you have to use another function called 'diskstats':
    expression (diskstats('sd[a-z]$', 'read_sectors', 0.5 * second) + diskstats('sd[a-z]$', 'write_sectors', 0.5 * second)) / 2 / 1024
    prefix 'Disk'
    postfix ' MB/s'
    width width050
    precision 1
    align 'R'
    update 0.5 * second
}

Widget DiskBar {
    class 'Bar'
    #expression  proc_stat::disk('.*', 'rblk', 0.5 * second)
    #expression2 proc_stat::disk('.*', 'wblk', 0.5 * second)
    # for kernel 2.6:
    expression  diskstats('sd[a-z]$', 'read_sectors',  0.5 * second) / 2 / 1024
    expression2 diskstats('sd[a-z]$', 'write_sectors', 0.5 * second) / 2 / 1024
    length width050
    direction 'E'
    update 0.5 * second
    Background darkgray
    BarColor0 barcolor0 
    BarColor1 barcolor1 
}

Widget Eth0 {
    class 'Text'
    expression (netdev('eth0', 'Rx_bytes', 0.5 * second) + netdev('eth0', 'Tx_bytes', 0.5 * second)) / 1024
    prefix 'eth0'
    postfix ' KB/s'
    width width050
    precision 1
    align 'R'
    update 0.5 * second
}

Widget Eth0Bar {
    class 'Bar'
    expression netdev('eth0', 'Rx_bytes', 0.5 * second) / 1024
    expression2 netdev('eth0', 'Tx_bytes', 0.5 * second) / 1024
    length width050
    direction 'E'
    update 0.5 * second
    Background darkgray
    BarColor0 barcolor0 
    BarColor1 barcolor1 
}

Widget Eth0Traffic {
    class 'Text'
    expression (netdev('eth0', 'Rx_bytes', 0)+netdev('eth0', 'Tx_bytes', 0))/1024/1024/1024
    prefix 'Traffic:'
    postfix ' GB'
    width 21
    precision 3
    align 'R'
    update 10 * second
}

Widget MemoryTitle {
    class 'Text'
    expression 'Memory/Swap'
    width width050
    align 'L'
    update 0
}

Widget MemoryTotal {
    class 'Text'
    expression meminfo('MemTotal') / 1024
    prefix 'Memory Total '
    postfix ' MB'
    width width050
    precision 0
    align 'R'
    update 0
}

Widget MemoryFree {
    class 'Text'
    expression (meminfo('MemFree') + meminfo('Cached')) / 1024
    prefix 'Memory Free '
    postfix ' MB'
    width width050
    precision 0
    align 'R'
    update 1 * second
}

Widget MemorySwappedTotal {
    class 'Text'
    expression (meminfo('SwapTotal')) / 1024
    prefix 'Swap Total '
    postfix ' MB'
    width width050
    precision 0
    align 'R'
    update 1 * second
}

Widget MemorySwappedFree {
    class 'Text'
    expression (meminfo('SwapTotal') - meminfo('SwapUsed')) / 1024
    prefix 'Swap Free''
    postfix ' MB'
    width width050
    precision 0
    align 'R'
    update 1 * second
}

Widget MemorySwappedUsed {
    class 'Text'
    expression (meminfo('SwapTotal') - meminfo('SwapFree')) / 1024
    prefix 'Swap Used '
    postfix ' MB'
    width width050
    precision 0
    align 'R'
    update 1 * second
}

Widget LoggedInTitle {
    class 'Text'
    expression 'Hosts in Krebs Darknet'
    width width050
    align 'L'
    update 0
}

Widget LoggedIn {
    class 'Text' 
    expression exec('/krebs/oncology/bin/krebshostup')
    width width050
    align 'L' 
    update 300 * second 
}

Widget FSSpaceTitle {
    class 'Text'
    expression 'Disk Space available'
    width width050
    align 'L'
    update 0
}

Widget FSSpace1 {
    class 'Text' 
    expression statfs('/', 'bavail') * statfs('/', 'bsize') / 1024 / 1024 / 1024
    prefix '/ (Root FS)' 
    postfix ' GB'
    width width050
    precision 2
    align 'R' 
    update 10 * second  
}

Widget HDDTempTitle {
    class 'Text'
    expression 'Disk Temperature�C'
    width width050
    align 'L'
    update 0
}

Widget HDDTemp1 { 
    class 'Text' 
    expression hddtemp('/dev/sda') 
    width width010
    precision 1 
    align 'R' 
    update 10 * second 
}

Widget HDDTemp2 { 
    class 'Text' 
    expression hddtemp('/dev/sdb') 
    width width010
    precision 1
    align 'R' 
    update 10 * second 
}

Widget HDDTemp3 { 
    class 'Text' 
    expression hddtemp('/dev/sdc') 
    width width010
    precision 1
    align 'R' 
    update 10 * second 
}

Widget ServicesTitle {
    class 'Text'
    expression 'Services'
    width width100
    align 'C'
    Background lightgray
    Foreground darkgray
}

Widget ApacheStatus {
    class 'Text'
    expression 'Apache '
    width width050  
    postfix strstr(exec('/etc/init.d/apache2 status', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget BindDNSStatus {
    class 'Text'
    expression 'Bind DNS '
    width width050  
    postfix strstr(exec('/etc/init.d/bind9 status', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget MuninStatus {
    class 'Text'
    expression 'Monitoring '
    width width050  
    postfix strstr(exec('/etc/init.d/munin-node status', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget MiniDLNAStatus {
    class 'Text'
    expression 'MiniDLNA '
    width width050  
    postfix strstr(exec('/etc/init.d/minidlna status', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget MySQLStatus {
    class 'Text'
    expression 'MySQL '
    width width050  
    postfix strstr(exec('/sbin/status mysql', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget MythTVStatus {
    class 'Text'
    expression 'MythTV Backend '
    width width050  
    postfix strstr(exec('/sbin/status mythtv-backend', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second 
}

Widget PostfixStatus {
    class 'Text'
    expression 'Postfix '
    width width050  
    postfix strstr(exec('/etc/init.d/postfix status', 10 * second), 'not running') > 0 ? 'down!' : 'up'
    update 10 * second  
}

Widget ProFTPStatus {
    class 'Text'
    expression 'ProFTP '
    width width050  
    postfix strstr(exec('/etc/init.d/proftpd status', 10 * second), 'not running') > 0 ? 'down!' : 'up'
    update 10 * second  
}

Widget SambaStatus {
    class 'Text'
    expression 'Samba '
    width width050  
    postfix strstr(exec('/sbin/status smbd', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget SambaStatusDS {
    class 'Text'
    expression 'Samba '
    width width050  
    postfix strstr(exec('/etc/init.d/samba status', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget SSHStatus {
    class 'Text'
    expression 'SSH '
    width width050  
    postfix strstr(exec('/sbin/status ssh', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget SSHStatusDS {
    class 'Text'
    expression 'SSH '
    width width050  
    postfix strstr(exec('/etc/init.d/ssh status', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget SWRAIDStatus {
    class 'Text'
    expression 'SW RAID '
    width width050  
    postfix strstr(exec('cat /proc/mdstat', 10 * second), '[UUU]') > 0 ? 'up' : 'attention!'
    update 10 * second  
}

Widget TwonkyStatus {
    class 'Text'
    expression 'Twonkymedia '
    width width050  
    postfix strstr(exec('/sbin/status twonkymedia', 10 * second), 'running') > 0 ? 'up' : 'down!'
    update 10 * second  
}

Widget FileTitle {
    class 'Text'
    expression 'Syslog'
    width width100
    align 'C'
    Background lightgray
    Foreground darkgray
}

Widget SetFileMsg {
    class 'Timer'
    expression FileMsg = exec('tail -n 1 /var/log/syslog', 2 * second)
    active 1
    update 2 * second  
}

Widget File1 {
    class 'Text'
    expression substr(FileMsg, 0 * width100, width100)
    width width100
    align 'L'
    Background darkgray
    update 2 * second  
}

Widget File2 {
    class 'Text'
    expression substr(FileMsg, 1 * width100, width100)
    width width100
    align 'L'
    Background darkgray
    update 2 * second  
}

Widget File3 {
    class 'Text'
    expression substr(FileMsg, 2 * width100, width100)
    width width100
    align 'L'
    Background darkgray
    update 2 * second  
}

Widget Weather1 {
    class 'Text'
    expression exec('/krebs/kachelmann/wetter', 10 * second)
    prefix 'Wetter:'
    width width100
    align 'L'
    Background darkgray
    update 10 * second  
}
Widget Bitcoin {
    class 'Text'
    expression exec('/krebs/btc/mtgox/ticker_text.sh', 10 * second)
    prefix 'BTC:   '
    width width100
    align 'L'
    Background darkgray
    update 30 * second  
}

Widget Stream {
    class 'Text'
    expression exec('/krebs/streams/streams status', 10 * second)
    #prefix 'Stream:'
    width width100
    align 'L'
    Background darkgray
    update 10 * second  
}

Widget Debug {
    class 'Text'
    expression 'Serverdisplay - Krebs'
    width linesize   
    align 'C'
    Foreground lightgray
}

Widget na {
    class 'Text'
    expression 'n/a'
    width 3   
    align 'L'
}

Widget Bgnd {
    class 'Image'
    file '/krebs/cholerab/bling/krebs-v2_320x240.png'
    reload 0
    update 0
    inverted 0
    visible 1
}

Layout Krebs {
    Row01.Col01 'System'
    Row02.Col01 'Time'
    Row04.Col02 'Busy'
    Row05.Col02 'BusyBar'
    Row07.Col02 'Load'
    Row08.Col02 'LoadBar'
    Row10.Col02 'Disk'
    Row11.Col02 'DiskBar'
    Row13.Col02 'Eth0'
    Row14.Col02 'Eth0Bar'
    Row15.Col02 'Eth0Traffic'

    Row04.Col28 'MemoryTitle'
    Row05.Col29 'MemoryTotal'
    Row06.Col29 'MemoryFree'
    Row07.Col29 'MemorySwappedTotal'
    Row08.Col29 'MemorySwappedUsed'
    Row10.Col28 'LoggedInTitle'
    Row11.Col29 'LoggedIn'
    Row13.Col28 'FSSpaceTitle'
    Row14.Col29 'FSSpace1'

    Row17.Col02 'ServicesTitle'
    #Row18.Col02 'BindDNSStatus'
    #Row19.Col02 'MuninStatus'
    Row18.Col02 'ApacheStatus'
    #Row21.Col02 'MiniDLNAStatus'
    #Row18.Col29 'PostfixStatus'
    #Row19.Col29 'ProFTPStatus'
    #Row20.Col29 'SambaStatusDS'
    Row18.Col29 'SSHStatusDS'

    Row19.Col02 'Weather1'
    Row21.Col02 'Bitcoin'
    Row23.Col02 'Stream'

    Row25.Col02 'FileTitle'
    Row26.Col02 'File1'
    Row27.Col02 'File2'
    Row28.Col02 'File3'

    Row30.Col01 'Debug'

    Timer1 'SetFileMsg'

    Layer 2 {
        X1.Y1 'Bgnd'
    }
}