clearer names for actions, and infer actions better
[monitor.git] / zabbix / zabbixsync.py
1 #!/usr/bin/python
2
3 import sys
4 import os
5 import site
6 from monitor.config import config
7 config.zabbix_enabled = True
8
9 from monitor.wrapper import plc, plccache
10 from monitor import database
11
12 import zabbixsite
13 from monitor.database.dborm import zab_session as session
14 from monitor.database.zabbixapi.model import confirm_ids, HostGroup
15
16
17 plcdb = plccache.l_sites # database.dbLoad("l_plcsites")
18 #netid2ip = plccache.plcdb_netid2ip # database.dbLoad("plcdb_netid2ip")
19 lb2hn = plccache.plcdb_lb2hn # database.dbLoad("plcdb_lb2hn")
20
21 def get_site_iplist(loginbase):
22         node_list = lb2hn[loginbase]
23
24         # TODO: ip_list string cannot be longer than 255 characters.
25         # TODO: if it is, then we need to break up the discovery rule.
26         ip_list = ""
27         for node in node_list:
28                 if len(node['interface_ids']) > 0:
29                         ifs = plc.api.GetInterfaces({'interface_id' : node['interface_ids'], 'is_primary' : True})
30                         print ifs
31                         #ip = netid2ip[node['interface_ids'][0]]
32                         ip = ifs[0]['ip']
33                         if len(ip_list) > 0: ip_list += ","
34                         ip_list += ip
35
36         return ip_list
37         
38 def add_loginbase(loginbase):
39         
40         techs = plc.getTechEmails(loginbase)
41         pis = plc.getPIEmails(loginbase)
42         iplist = get_site_iplist(loginbase)
43
44         os.system("""echo '%s' | tr ',' '\n' >> /usr/share/monitor/nodelist.txt""" % iplist )
45
46         print "zabbixsite.setup_site('%s', %s, %s, '%s')" % (loginbase,techs, pis, iplist)
47         zabbixsite.setup_site(loginbase, techs, pis, iplist)
48
49 if __name__=="__main__":
50
51         from monitor import parser as parsermodule
52         parser = parsermodule.getParser(['cacheset'])
53         parser.set_defaults( setupglobal=False, syncsite=True, site=None, sitelist=None, setupids=False)
54         parser.add_option("", "--setupids", action="store_true", dest="setupids",
55                                                 help="Setup global IDs.")
56         parser.add_option("", "--setupglobal", action="store_true", dest="setupglobal",
57                                                 help="Setup global settings.")
58         parser.add_option("", "--nosite", action="store_false", dest="syncsite",
59                                                 help="Do not sync sites.")
60         parser.add_option("", "--site", dest="site",
61                                                 help="Sync only given site name.")
62         parser.add_option("", "--sitelist", dest="sitelist",
63                                                 help="Sync only given site names in the list.")
64         opts = parsermodule.parse_args(parser)
65
66         os.system("""echo '' > /usr/share/monitor/nodelist.txt""")
67
68         if opts.setupids:
69                 # Not sure why, but this doesn't work if we continue.  so exit.
70                 # This step only needs to be called once, but there is no harm in
71                 # calling it multiple times.
72                 confirm_ids()
73                 session.flush()
74                 sys.exit(0)
75
76         if opts.setupglobal:
77                 zabbixsite.setup_global()
78                 session.flush()
79
80         if opts.syncsite:
81                 api = plc.getCachedAuthAPI()
82                 query = {'peer_id' : None}
83                 if opts.site:
84                         query.update({'login_base' : opts.site})
85                 elif opts.sitelist:
86                         l = opts.sitelist.split(",")
87                         query.update({'login_base' : l})
88
89                 # ADD SITES
90                 sites = api.GetSites(query, ['login_base'])
91                 site_api_list = [ site['login_base'] for site in sites ]
92                 for site in sites: # [:20]:
93                         add_loginbase(site['login_base'])
94                         session.flush()
95
96                 if not opts.site:
97                         # NOTE: for all sites in DB but not API, call zabbixsite.delete_site()
98                         hg_list = filter(lambda x: '_hostgroup' in x.name, HostGroup.query.all() )
99                         site_db_list = [ hg.name[:-len('_hostgroup')] for hg in hg_list ]
100                         in_db_not_plc = set(site_db_list) - set(site_api_list)
101                         for login_base in in_db_not_plc:
102                                 print "Deleting %s" % login_base
103                                 zabbixsite.delete_site(login_base)
104                                 session.flush()
105
106