sfaprotocol is renamed into sfaserverproxy, with class SfaServerProxy
[sfa.git] / sfa / server / sfa-clean-peer-records.py
index 8701f04..bcb917b 100644 (file)
@@ -2,15 +2,22 @@
 
 import sys
 import os
-from sfa.util.misc import *
-from sfa.util.genitable import GeniTable
-from sfa.util.geniclient import GeniClient
-from sfa.plc.api import GeniAPI
+import traceback
+import socket
+
+from sfa.util.prefixTree import prefixTree
 from sfa.util.config import Config
+
+from sfa.trust.certificate import Keypair
 from sfa.trust.hierarchy import Hierarchy
-from sfa.util.report import trace, error
 from sfa.server.registry import Registries
 
+from sfa.storage.table import SfaTable
+
+from sfa.client.sfaserverproxy import SfaServerProxy 
+
+from sfa.generic import Generic
+
 def main():
     config = Config()
     if not config.SFA_REGISTRY_ENABLED:
@@ -22,30 +29,54 @@ def main():
     sfa_key_path = sfa_hierarchy.basedir
     key_file = os.path.join(sfa_key_path, "server.key")
     cert_file = os.path.join(sfa_key_path, "server.cert")
+    key = Keypair(filename=key_file) 
 
     # get a connection to our local sfa registry
     # and a valid credential
     authority = config.SFA_INTERFACE_HRN
     url = 'http://%s:%s/' %(config.SFA_REGISTRY_HOST, config.SFA_REGISTRY_PORT)
-    registry = GeniClient(url, key_file, cert_file)
-    sfa_api = GeniAPI(key_file = key_file, cert_file = cert_file, interface='registry')
+    registry = SfaServerProxy(url, key_file, cert_file)
+    sfa_api = Generic.the_flavour()
     credential = sfa_api.getCredential()
 
     # get peer registries
     registries = Registries(sfa_api)
-
-
+    tree = prefixTree()
+    tree.load(registries.keys())
+    
     # get local peer records
-    table = GeniTable()
+    table = SfaTable()
     peer_records = table.find({'~peer_authority': None})
+    found_records = []
+    hrn_dict = {}
+    for record in peer_records:
+        registry_hrn = tree.best_match(record['hrn'])
+        if registry_hrn not in hrn_dict:
+            hrn_dict[registry_hrn] = []
+        hrn_dict[registry_hrn].append(record['hrn'])
 
-    # get a list of authorities contained in the peer record list
-    for peer_record in peer_records:
-        peer_auth = peer_record['peer_authority']
-        if peer_auth in registries:
-            records = registries[peer_auth].resolve(credential, peer_record['hrn'])
-            if not records:
-                table.remove(peer_record) 
+    # attempt to resolve the record at the authoritative interface 
+    for registry_hrn in hrn_dict:
+        if registry_hrn in registries:
+            records = []
+            target_hrns = hrn_dict[registry_hrn]    
+            try:
+                records = registries[registry_hrn].Resolve(target_hrns, credential)
+                found_records.extend([record['hrn'] for record in records])
+            except ServerException:
+                # an exception will be thrown if the record doenst exist
+                # if so remove the record from the local registry
+                continue
+            except:
+                # this deosnt necessarily mean the records dont exist
+                # lets give them the benefit of the doubt here (for now)
+                found_records.extend(target_hrns)
+                traceback.print_exc()
 
+    # remove what wasnt found 
+    for peer_record in peer_records:
+        if peer_record['hrn'] not in found_records:
+            registries[sfa_api.hrn].Remove(peer_record['hrn'], credential, peer_record['type'])
+                
 if __name__ == '__main__':
     main()