#!/usr/bin/python
import string, os, time, sys, socket

#
# Gather free disk and memory info an output as an XML document.
#
# See gr_monitor license in the gr_monitor.1 man page for licensing.
#
# michael@actrix.gen.nz, Nov 1999 (for Gentoo South Pacific Limited).
#

def printdtd():
    print '''<?xml version="1.0"?>
    <!DOCTYPE datastream [
    <!ELEMENT datastream (dataset)*>
    <!ELEMENT dataset (group)*>
    <!ATTLIST dataset
              id      CDATA   #REQUIRED>
    <!ELEMENT group (item)*>
    <!ATTLIST group
              id      CDATA   #REQUIRED>
    <!ELEMENT item (total, used, free, cached, buffers)>
    <!ATTLIST item
              id      CDATA   #REQUIRED>
    <!ELEMENT size EMPTY>
    <!ATTLIST size
              data    CDATA   #REQUIRED>
    <!ELEMENT used EMPTY>
    <!ATTLIST used
              data    CDATA   #REQUIRED>
    <!ELEMENT avail EMPTY>
    <!ATTLIST avail
              data    CDATA   #REQUIRED>
    ]>'''

def printdf():

    print '<group id="Disk Space">'
    dfInput = os.popen("df -k", "r");
    colnames = string.split(dfInput.readline());
    biggest = 0
    dflist = []
    
    for line in dfInput.readlines(): 
	cols = string.split(line)
	(size, used, avail) = map(int, cols[1:4])
	filesys = string.join(cols[5:])
	dflist.append((filesys, size, used, avail))
	if size > biggest:
	    biggest = size
    dfInput.close()
    for data in dflist:
	(filesys, size, used, avail) = data;
	if string.strip(filesys) != "/":
	    filesys = filesys[string.rfind(filesys,"/") + 1:]
	print '''
	<item id="%s">
	  <free data="%f"/>
	  <used data="%f"/>
	  <total data="%f"/>
	</item>
	''' % ( filesys, 
		100.0 * avail / biggest,
		100.0 * used / biggest, 
		100.0 * size / biggest )
    print '</group>'

def printfree():

    print '<group id="Memory">'
    procMeminfo = open("/proc/meminfo", "r");
    procMeminfo.readline();
    line = procMeminfo.readline();
    (total, used, free, 
     shared, buffers, cached) = map(int, string.split(line)[1:])
    line = procMeminfo.readline();
    (swapTotal, swapUsed, swapFree) = map(int, string.split(line)[1:])
    procMeminfo.close();

    print '''
    <item id="RAM">
      <free data="%f"/>
      <cached data="%f"/>
      <buffers data="%f"/>
      <used data="%f"/>
      <total data="100.0"/>
    </item>
    ''' % ( 
	    (100.0 * free) / total,
	    (100.0 * cached) / total,
	    (100.0 * buffers) / total,
	    (100.0 * used - buffers) / total
	    )
	    
    print '</group>'
    print '<group id="Swap">'
    print '''
    <item id="Swap">
      <free data="%f"/>
      <used data="%f"/>
      <total data="%f"/>
    </item>
    ''' % ( 
	    (100.0 * swapFree) / total,
	    (100.0 * swapUsed) / total,
	    (100.0 * swapTotal) / total,
	    )
    print '</group>'


# Main Program starts here 

if len(sys.argv) > 1 and sys.argv[1] == "-sleep":
    sleepSecs = int(sys.argv[2])
else:
    sleepSecs = 5

hostname = socket.gethostname()

try:
    printdtd()
    print "<datastream>"
    
    while 1:
	when = time.asctime(time.localtime(time.time()))
	print '<dataset id="%s %s">' % (hostname, when)
	printdf()
	printfree()
	print '</dataset>'
	sys.stdout.flush()
	time.sleep(sleepSecs)
    
    print "</datastream>"
except IOError:
    sys.exit(-1)

