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
7 # this script does damage assessment - no repairs yet -
8 # in an attempt to monitor this sort of issues
10 from optparse import OptionParser
14 def __init__(self,verbose):
15 print "==================== initializing ..",
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'])
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 ] )
28 def spot_nodes (self):
29 "nodes are expected to be in the same peer as their owning site"
31 for node in self.all_nodes:
32 site=self.site_hash[node['site_id']]
33 if node['peer_id'] != site['peer_id']:
35 if self.verbose: print "NODE-SITE mismatch %r IN SITE %r"%(node,site)
36 print '==================== Found %d inconsistent nodes'%counter
38 def spot_slices (self):
39 "slices are expected to be in the same peer as their owning site"
41 for slice in self.all_slices:
42 site=self.site_hash[slice['site_id']]
43 if slice['peer_id'] != site['peer_id']:
45 if self.verbose: print "SLICE-SITE mismatch %r IN SITE %r"%(slice,site)
46 print '==================== Found %d inconsistent slices'%counter
48 def spot_persons (self):
49 "persons are expected to be in the same peer as their owning site"
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']:
56 if self.verbose: print "PERSON-SITE mismatch %r IN SITE %r"%(person,site)
57 print '==================== Found %d inconsistent persons'%counter
60 "persons are expected to be in the same peer as their attached keys"
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']:
67 if self.verbose: print "PERSON-KEY mismatch %r & KEY %r"%(person,key)
68 print '==================== Found %d inconsistent keys'%counter
70 def spot_foreign (self):
71 "foreign persons should not have a site"
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']:
78 if self.verbose: print " %r"%self.site_hash[site_id]
79 print '==================== Found %d foreign persons with a site'%counter
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
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,
91 parser.add_option("-s","--slices",action='store_true',dest='slices',default=None,
93 parser.add_option("-p","--persons",action='store_true',dest='persons',default=None,
95 parser.add_option("-k","--keys",action='store_true',dest='keys',default=None,
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()
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) ] )
107 for flag in flags: setattr(options,flag,True)
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()
116 if __name__ == '__main__':