2to3 on accessory scripts
[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 ..", end=' ')
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()