provide sitename to person query
[monitor.git] / 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 print_fields(obj, fields, format):
31     if format:
32         print format % obj
33     else:
34         for f in fields:
35             if f in obj:
36                 print obj[f],
37         print ""
38
39 def list_fields(l):
40     if len(l) > 0:
41         o = l[0]
42         for k in o.keys():
43             print k
44         sys.exit(1)
45     else:
46         print "no objects returned to list fields"
47         sys.exit(1)
48
49 def main():
50
51     from monitor import parser as parsermodule
52     parser = parsermodule.getParser()
53
54     parser.set_defaults(get=True,
55                         type='node',
56                         filter=None,
57                         fields=None,
58                         format=None,
59                         listfields=False,
60                         withsitename=False,
61                         byloginbase=None,
62                         byrole=None,
63                         )
64
65     parser.add_option("", "--get", dest="get", action="store_true",
66                         help="just get values for object")
67
68     parser.add_option("", "--type", dest="type", metavar="[node|person|site]", 
69                         help="object type to query")
70
71     parser.add_option("", "--fields", dest="fields", metavar="key,list,...", 
72                         help="a list of keys to display for each object.")
73
74     parser.add_option("", "--filter", dest="filter", metavar="name=value", 
75                         help="Filter passed to Get* calls")
76
77     parser.add_option("", "--format", dest="format",
78                         help="Format string to use to print")
79
80     parser.add_option("", "--byloginbase", dest="byloginbase",
81                         help="")
82     parser.add_option("", "--byrole", dest="byrole",
83                         help="")
84     parser.add_option("", "--withsitename", dest="withsitename",
85                         action="store_true", help="")
86
87     parser.add_option("", "--nodelist", dest="nodelist", metavar="nodelist.txt", 
88                         help="A list of nodes to bring out of debug mode.")
89     parser.add_option("", "--listfields", dest="listfields", action="store_true",
90                         help="A list of nodes to bring out of debug mode.")
91
92     #parser = parsermodule.getParser(['defaults'], parser)
93     config = parsermodule.parse_args(parser)
94     
95     if config.nodelist:
96         nodelist = utilfile.getListFromFile(config.nodelist)
97
98     if config.get:
99         f = parse_filter(config.filter)
100         fields = parse_fields(config.fields)
101
102     if config.type == 'node': 
103         if config.fields is None: 
104             fields='node_id,hostname,last_contact',
105             fields = parse_fields(config.fields)
106
107         n = api.GetNodes(f, fields)
108         if config.listfields: list_fields(n)
109         for i in n:
110             print_fields(i, fields, config.format)
111
112     if config.type == 'person': 
113             
114         if config.byloginbase:
115             s = api.GetSites({'login_base' : config.byloginbase}, ['person_ids'])
116             f = s[0]['person_ids']
117         if config.byrole:
118             p = api.GetPersons(None, ['person_id', 'roles'])
119             p = filter(lambda x: config.byrole in x['roles'], p)
120             f = [ x['person_id'] for x in  p ]
121
122         if config.withsitename:
123             n = api.GetPersons(f, fields)
124             if config.listfields: list_fields(n)
125             for i in n:
126                 sitelist = api.GetSites(i['site_ids'], ['person_ids', 'name'])
127                 if len(sitelist) > 0:
128                     s = sitelist[0]
129                     if i['person_id'] in s['person_ids']:
130                         i['name'] = s['name']
131                         print_fields(i, fields, config.format)
132         else:
133             n = api.GetPersons(f, fields)
134             if config.listfields: list_fields(n)
135             for i in n:
136                 print_fields(i, fields, config.format)
137
138 if __name__ == "__main__":
139     main()