added sitelist option for find* scripts.
[monitor.git] / sitebad.py
1 #!/usr/bin/python
2
3 import os
4 import sys
5 import string
6 import time
7 from datetime import datetime,timedelta
8
9 from monitor import database
10 from pcucontrol  import reboot
11 from monitor import parser as parsermodule
12 from monitor import config
13 from monitor.database.info.model import HistorySiteRecord, FindbadNodeRecord, session
14 from monitor.wrapper import plc, plccache
15 from monitor.const import MINUP
16
17 from monitor.common import *
18 from nodequery import verify,query_to_dict,node_select
19 from monitor.model import *
20
21 api = plc.getAuthAPI()
22 def main():
23         main2(config)
24
25 def main2(config):
26
27         l_nodes = plccache.l_nodes
28         l_plcsites = plccache.l_sites
29
30         if config.site:
31                 l_sites = [config.site]
32         elif config.sitelist:
33                 site_list = config.sitelist.split(',')
34                 l_sites = site_list
35         else:
36                 l_sites = [site['login_base'] for site in l_plcsites]
37         
38         checkAndRecordState(l_sites, l_plcsites)
39
40 def getnewsite(nodelist):
41         new = True
42         for node in nodelist:
43                 try:
44                         noderec = FindbadNodeRecord.query.filter(FindbadNodeRecord.hostname==node['hostname']).order_by(FindbadNodeRecord.date_checked.desc()).first()
45                         if noderec is not None and \
46                                 noderec.plc_node_stats['last_contact'] != None:
47                                 new = False
48                 except:
49                         import traceback
50                         print traceback.print_exc()
51         return new
52
53 def getnodesup(nodelist):
54         up = 0
55         for node in nodelist:
56                 try:
57                         noderec = FindbadNodeRecord.query.filter(FindbadNodeRecord.hostname==node['hostname']).order_by(FindbadNodeRecord.date_checked.desc()).first()
58                         #noderec = FindbadNodeRecord.select(FindbadNodeRecord.q.hostname==node['hostname'], 
59                         #                                                                  orderBy='date_checked').reversed()[0]
60                         if noderec is not None and noderec.observed_status == "BOOT":
61                                 up = up + 1
62                 except:
63                         import traceback
64                         print traceback.print_exc()
65         return up
66
67 def checkAndRecordState(l_sites, l_plcsites):
68         count = 0
69         lb2hn = plccache.plcdb_lb2hn
70         for sitename in l_sites:
71                 d_site = None
72                 for site in l_plcsites:
73                         if site['login_base'] == sitename:
74                                 d_site = site
75                                 break
76                 if not d_site:
77                         continue
78
79                 if sitename in lb2hn:
80                         pf = HistorySiteRecord.findby_or_create(loginbase=sitename)
81
82                         pf.last_checked = datetime.now()
83                         pf.slices_total = d_site['max_slices']
84                         pf.slices_used = len(d_site['slice_ids'])
85                         pf.nodes_total = len(lb2hn[sitename])
86                         pf.nodes_up = getnodesup(lb2hn[sitename])
87                         pf.new = getnewsite(lb2hn[sitename])
88                         pf.enabled = d_site['enabled']
89
90                         if pf.nodes_up >= MINUP:
91                                 if pf.status != "good": pf.last_changed = datetime.now()
92                                 pf.status = "good"
93                         else:
94                                 if pf.status != "down": pf.last_changed = datetime.now()
95                                 pf.status = "down"
96
97                         count += 1
98                         print "%d %15s slices(%2s) nodes(%2s) up(%2s) %s" % (count, sitename, pf.slices_used, 
99                                                                                         pf.nodes_total, pf.nodes_up, pf.status)
100                         pf.flush()
101
102         print HistorySiteRecord.query.count()
103         session.flush()
104
105         return True
106
107 if __name__ == '__main__':
108         from monitor import parser as parsermodule
109
110         parser = parsermodule.getParser()
111         parser.set_defaults(filename=None, node=None, site=None, 
112                                                 nodeselect=False, nodegroup=None, cachenodes=False)
113
114         parser.add_option("", "--site", dest="site", metavar="login_base", 
115                                                 help="Provide a single site to operate on")
116         parser.add_option("", "--sitelist", dest="sitelist", 
117                                                 help="Provide a list of sites separated by ','")
118
119         config = parsermodule.parse_args(parser)
120
121         try:
122                 main2(config)
123         except Exception, err:
124                 import traceback
125                 print traceback.print_exc()
126                 print "Exception: %s" % err
127                 sys.exit(0)