+ self.logger.info("PlImporter: Imported authority (vini site) %s"%auth_record)
+ self.remember_record ( site_record )
+
+ def run (self, options):
+ config = Config ()
+ interface_hrn = config.SFA_INTERFACE_HRN
+ root_auth = config.SFA_REGISTRY_ROOT_AUTH
+ shell = PlShell (config)
+
+ ######## retrieve all existing SFA objects
+ all_records = dbsession.query(RegRecord).all()
+
+ # create hash by (type,hrn)
+ # we essentially use this to know if a given record is already known to SFA
+ self.records_by_type_hrn = \
+ dict ( [ ( (record.type, record.hrn) , record ) for record in all_records ] )
+ # create hash by (type,pointer)
+ self.records_by_type_pointer = \
+ dict ( [ ( (record.type, record.pointer) , record ) for record in all_records
+ if record.pointer != -1] )
+
+ # initialize record.stale to True by default, then mark stale=False on the ones that are in use
+ for record in all_records: record.stale=True
+
+ ######## retrieve PLC data
+ # Get all plc sites
+ # retrieve only required stuf
+ sites = shell.GetSites({'peer_id': None, 'enabled' : True},
+ ['site_id','login_base','node_ids','slice_ids','person_ids',])
+ # create a hash of sites by login_base
+# sites_by_login_base = dict ( [ ( site['login_base'], site ) for site in sites ] )
+ # Get all plc users
+ persons = shell.GetPersons({'peer_id': None, 'enabled': True},
+ ['person_id', 'email', 'key_ids', 'site_ids', 'role_ids'])
+ # create a hash of persons by person_id
+ persons_by_id = dict ( [ ( person['person_id'], person) for person in persons ] )
+ # Get all plc public keys
+ # accumulate key ids for keys retrieval
+ key_ids = []
+ for person in persons:
+ key_ids.extend(person['key_ids'])
+ keys = shell.GetKeys( {'peer_id': None, 'key_id': key_ids,
+ 'key_type': 'ssh'} )
+ # create a hash of keys by key_id
+ keys_by_id = dict ( [ ( key['key_id'], key ) for key in keys ] )
+ # create a dict person_id -> [ (plc)keys ]
+ keys_by_person_id = {}
+ for person in persons:
+ pubkeys = []
+ for key_id in person['key_ids']:
+ # by construction all the keys we fetched are ssh keys
+ # so gpg keys won't be in there
+ try:
+ key = keys_by_id[key_id]
+ pubkeys.append(key)
+ except:
+ self.logger.warning("Could not spot key %d - probably non-ssh"%key_id)
+ keys_by_person_id[person['person_id']] = pubkeys
+ # Get all plc nodes
+ nodes = shell.GetNodes( {'peer_id': None}, ['node_id', 'hostname', 'site_id'])
+ # create hash by node_id
+ nodes_by_id = dict ( [ ( node['node_id'], node, ) for node in nodes ] )
+ # Get all plc slices
+ slices = shell.GetSlices( {'peer_id': None}, ['slice_id', 'name', 'person_ids'])
+ # create hash by slice_id
+ slices_by_id = dict ( [ (slice['slice_id'], slice ) for slice in slices ] )
+
+ # isolate special vini case in separate method
+ self.create_special_vini_record (interface_hrn)