Setting tag myplc-5.3-5
[myplc.git] / bin / spot-aliens.py
1 #!/usr/bin/plcsh
2
3 # running both RefreshPeer and Sfa requires to use some ugly hacks 
4 # over time we've faced quite a few situations where some 
5 # foreign entities somehow get wrongly attached to the local peer
6 #
7 # this script does damage assessment - no repairs yet - 
8 # in an attempt to monitor this sort of issues
9
10 from optparse import OptionParser
11
12 class SpotAliens:
13
14     def __init__(self,verbose):
15         print "==================== initializing ..",
16         self.verbose=verbose
17         self.all_sites=GetSites({},['peer_id','site_id','login_base','name'])
18         self.all_nodes=GetNodes({},['peer_id','node_id','site_id','hostname'])
19         self.all_persons=GetPersons({},['peer_id','person_id','site_ids','key_ids','email'])
20         self.all_keys=GetKeys({},['peer_id','key_id'])
21         self.all_slices=GetSlices({},['peer_id','slice_id','name','site_id'])
22
23         self.site_hash=dict ( [ (site['site_id'],site) for site in self.all_sites ] )
24         self.key_hash=dict ( [ (key['key_id'],key) for key in self.all_keys ] )
25         self.slice_hash=dict ( [ (slice['slice_id'],slice) for slice in self.all_slices ] )
26         print "done"
27
28     def spot_nodes (self):
29         "nodes are expected to be in the same peer as their owning site"
30         counter=0
31         for node in self.all_nodes:
32             site=self.site_hash[node['site_id']]
33             if node['peer_id'] != site['peer_id']: 
34                 counter+=1
35                 if self.verbose: print "NODE-SITE mismatch %r IN SITE %r"%(node,site)
36         print '==================== Found %d inconsistent nodes'%counter
37
38     def spot_slices (self):
39         "slices are expected to be in the same peer as their owning site"
40         counter=0
41         for slice in self.all_slices:
42             site=self.site_hash[slice['site_id']]
43             if slice['peer_id'] != site['peer_id']: 
44                 counter+=1
45                 if self.verbose: print "SLICE-SITE mismatch %r IN SITE %r"%(slice,site)
46         print '==================== Found %d inconsistent slices'%counter
47     
48     def spot_persons (self):
49         "persons are expected to be in the same peer as their owning site"
50         counter=0
51         for person in self.all_persons:
52             for site_id in person['site_ids']:
53                 site=self.site_hash[site_id]
54                 if person['peer_id'] != site['peer_id']:
55                     counter+=1
56                     if self.verbose: print "PERSON-SITE mismatch %r IN SITE %r"%(person,site)
57         print '==================== Found %d inconsistent persons'%counter
58
59     def spot_keys (self):
60         "persons are expected to be in the same peer as their attached keys"
61         counter=0
62         for person in self.all_persons:
63             for key_id in person['key_ids']:
64                 key=self.key_hash[key_id]
65                 if person['peer_id'] != key['peer_id']:
66                     counter+=1
67                     if self.verbose: print "PERSON-KEY mismatch %r & KEY %r"%(person,key)
68         print '==================== Found %d inconsistent keys'%counter
69     
70     def spot_foreign (self):
71         "foreign persons should not have a site"
72         counter=1
73         for person in self.all_persons:
74             if person['peer_id'] and person['site_ids']:
75                 if self.verbose: print "WARNING Foreign person %r attached on sites:"%person
76                 for site_id in person['site_ids']:
77                     counter+=1
78                     if self.verbose: print "    %r"%self.site_hash[site_id]
79         print '==================== Found %d foreign persons with a site'%counter
80
81 def main ():
82     usage="""Usage: %prog [-- options]
83 Checks for db inconsistencies wrt remote peers
84 Mostly does damage assessment of running RefreshPeer together with SFA
85 If no option is set, performs all checks, otherwise performs the specified steps
86 """
87     parser=OptionParser (usage=usage)
88     parser.add_option("-v","--verbose",action='store_true',dest='verbose',default=False)
89     parser.add_option("-n","--nodes",action='store_true',dest='nodes',default=None,
90                       help='check nodes')
91     parser.add_option("-s","--slices",action='store_true',dest='slices',default=None,
92                       help='check slices')
93     parser.add_option("-p","--persons",action='store_true',dest='persons',default=None,
94                       help='check persons')
95     parser.add_option("-k","--keys",action='store_true',dest='keys',default=None,
96                       help='check keys')
97     parser.add_option("-f","--foreign",action='store_true',dest='foreign',default=None,
98                       help='check foreign persons with a site')
99     (options,args) = parser.parse_args()
100     
101     # default is to run all cheks
102     # if at least one option was set, only enable the options that are set
103     flags=['nodes','slices','persons','keys','foreign']
104     nb_set = len ( [ getattr(options,flag) for flag in flags if getattr(options,flag) ] )
105     
106     if nb_set==0:
107         for flag in flags: setattr(options,flag,True)
108
109     spot = SpotAliens(verbose=options.verbose)
110     if options.nodes: spot.spot_nodes()
111     if options.slices: spot.spot_slices()
112     if options.persons: spot.spot_persons()
113     if options.keys: spot.spot_keys()
114     if options.foreign: spot.spot_foreign()
115
116 if __name__ == '__main__':
117     main()