source: trunk/daemon/togad.py @ 6

Last change on this file since 6 was 6, checked in by bastiaans, 18 years ago

daemon/togad.py:

First attempt at XML parsing

File size: 2.5 KB
Line 
1#!/usr/bin/env python
2
3from xml.sax import make_parser
4from xml.sax.handler import ContentHandler
5import socket
6import sys
7
8DEBUG = 1
9
10class GangliaXMLHandler( ContentHandler ):
11        """
12        Parse/Handle XML
13        """
14
15        metrics = [ ]
16
17        #def __init__ ( self ):
18                #self.isHostElement, self.isMetricElement, self.isGridElement, self.isClusterElement = 0, 0, 0, 0
19                #self.isGangliaXMLElement = 0
20   
21        def startElement( self, name, attrs ):
22
23                if name == 'ganglia_xml':
24                        self.XMLSource = attrs.get('source',"")
25                        self.gangliaVersion = attrs.get('version',"")
26
27                elif name == 'grid':
28                        self.gridName = attrs.get('name',"")
29
30                elif name == 'cluster':
31                        self.clusterName = attrs.get('name',"")
32
33                elif name == 'host':     
34                        self.hostName = attrs.get('name',"")
35                        self.hostIp = attrs.get('ip',"")
36                        self.hostReported = attrs.get('reported',"")
37
38                elif name == 'metric':
39                        myMetric = { }
40                        myMetric['name'] = attrs.get('name',"")
41                        myMetric['val'] = attrs.get('val',"")
42
43                        self.metrics.append( myMetric ) 
44                        if DEBUG: print ' | | |-metric: %s:%s' %( myMetric['name'], myMetric['val'] )
45
46                return
47
48        def endElement( self, name ):
49                if name == 'ganglia_xml':
50                        if DEBUG: print 'Found XML data: source %s version %s' %( self.XMLSource, self.gangliaVersion )
51
52                if name == 'grid':
53                        if DEBUG: print '`-Grid found: %s' %( self.gridName )
54
55                if name == 'cluster':
56                        if DEBUG: print ' |-Cluster found: %s' %( self.clusterName )
57
58                if name == 'host':     
59                        if DEBUG: print ' | |-Host found: %s - ip %s reported %s' %( self.hostName, self.hostIp, self.hostReported )
60
61                #if name == 'metric':
62
63class GangliaXMLGatherer:
64        """
65        Connect to a gmetad and return fd
66        """
67
68        def __init__(self, host, port):
69                self.host = host
70                self.port = port
71
72        def getFileDescriptor(self):
73                s = None
74                for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM):
75                        af, socktype, proto, canonname, sa = res
76                        try:
77                                s = socket.socket(af, socktype, proto)
78                        except socket.error, msg:
79                                s = None
80                                continue
81                        try:
82                                s.connect(sa)
83                        except socket.error, msg:
84                                s.close()
85                                s = None
86                                continue
87                        break
88
89                if s is None:
90                        print 'could not open socket'
91                        sys.exit(1)
92
93                return s.makefile()
94
95                #s.send('Hello, world')
96                #data = s.recv(1024)
97                #s.close()
98                #print 'Received', `data`
99
100def main():
101        """
102        My Main
103        """
104
105        myXMLGatherer = GangliaXMLGatherer( 'localhost', 8651 ) 
106
107        myParser = make_parser()   
108        myHandler = GangliaXMLHandler()
109        myParser.setContentHandler( myHandler )
110        myParser.parse( myXMLGatherer.getFileDescriptor() )
111
112# Let's go
113main()
Note: See TracBrowser for help on using the repository browser.