1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
#!/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)
|