clearer names for actions, and infer actions better
[monitor.git] / commands / plcquery.py
1 #!/usr/bin/python
2
3
4 import sys
5 from monitor.wrapper import plc
6 api = plc.api
7
8 from monitor import config
9
10 def parse_fields(fields):
11     if fields:
12         s = fields.split(",")
13         if s == []:
14             return None
15         else:
16             return s
17     else:
18         return None
19
20 def parse_filter(filter):
21     if filter:
22         s = filter.split("=")
23         if len(s) == 2:
24             return {s[0] : s[1]}
25         else:
26             raise Exception("filter format should be name=value")
27     else:
28         return None
29
30 def conv(s):
31     # strip non-ascii characters to prvent errors
32     r = "".join([x for x in s if ord(x) < 128])
33     return r
34
35 def print_fields(obj, fields, format):
36     if format:
37         for f in obj:
38             if type(obj[f]) in (str, unicode): 
39                 obj[f] = conv(obj[f])
40             
41         print format % obj
42     else:
43         for f in fields:
44             if f in obj:
45                 obj[f] = conv(obj[f])
46                 print obj[f],
47         print ""
48
49 def list_fields(l):
50     if len(l) > 0:
51         o = l[0]
52         for k in o.keys():
53             print k
54         sys.exit(1)
55     else:
56         print "no objects returned to list fields"
57         sys.exit(1)
58
59 def main():
60
61     from monitor import parser as parsermodule
62     parser = parsermodule.getParser()
63
64     parser.set_defaults(get=True,
65                         type='node',
66                         filter=None,
67                         fields=None,
68                         format=None,
69                         listfields=False,
70                         withsitename=False,
71                         byloginbase=None,
72                         byrole=None,
73                         )
74
75     parser.add_option("", "--get", dest="get", action="store_true",
76                         help="just get values for object")
77
78     parser.add_option("", "--type", dest="type", metavar="[node|person|site]", 
79                         help="object type to query")
80
81     parser.add_option("", "--fields", dest="fields", metavar="key,list,...", 
82                         help="a list of keys to display for each object.")
83
84     parser.add_option("", "--filter", dest="filter", metavar="name=value", 
85                         help="Filter passed to Get* calls")
86
87     parser.add_option("", "--format", dest="format",
88                         help="Format string to use to print")
89
90     parser.add_option("", "--byloginbase", dest="byloginbase",
91                         help="")
92     parser.add_option("", "--byrole", dest="byrole",
93                         help="")
94     parser.add_option("", "--withsitename", dest="withsitename",
95                         action="store_true", help="")
96
97     parser.add_option("", "--nodelist", dest="nodelist", metavar="nodelist.txt", 
98                         help="A list of nodes to bring out of debug mode.")
99     parser.add_option("", "--listfields", dest="listfields", action="store_true",
100                         help="A list of nodes to bring out of debug mode.")
101
102     #parser = parsermodule.getParser(['defaults'], parser)
103     config = parsermodule.parse_args(parser)
104     
105     if config.nodelist:
106         nodelist = utilfile.getListFromFile(config.nodelist)
107
108     if config.get:
109         f = parse_filter(config.filter)
110         fields = parse_fields(config.fields)
111
112     if config.type == 'node': 
113         if config.fields is None: 
114             fields='node_id,hostname,last_contact',
115             fields = parse_fields(config.fields)
116
117         n = api.GetNodes(f, fields)
118         if config.listfields: list_fields(n)
119         for i in n:
120             print_fields(i, fields, config.format)
121
122     if config.type == 'person': 
123             
124         if config.byloginbase:
125             s = api.GetSites({'login_base' : config.byloginbase}, ['person_ids'])
126             f = s[0]['person_ids']
127         if config.byrole:
128             p = api.GetPersons(None, ['person_id', 'roles'])
129             p = filter(lambda x: config.byrole in x['roles'], p)
130             f = [ x['person_id'] for x in  p ]
131
132         if config.withsitename:
133             n = api.GetPersons(f, fields)
134             if config.listfields: list_fields(n)
135             for i in n:
136                 sitelist = api.GetSites(i['site_ids'], ['person_ids', 'name'])
137                 if len(sitelist) > 0:
138                     s = sitelist[0]
139                     if i['person_id'] in s['person_ids']:
140                         i['name'] = conv(s['name'])
141                         print_fields(i, fields, config.format)
142         else:
143             n = api.GetPersons(f, fields)
144             if config.listfields: list_fields(n)
145             for i in n:
146                 print_fields(i, fields, config.format)
147
148 if __name__ == "__main__":
149     main()