infocalypse

(djk)
2009-05-01: Better -v messages for fn-fmsread.

Better -v messages for fn-fmsread.

diff --git a/infocalypse/fms.py b/infocalypse/fms.py
--- a/infocalypse/fms.py
+++ b/infocalypse/fms.py
@@ -205,10 +205,13 @@ def strip_names(trust_map):
 class USKIndexUpdateParser(IFmsMessageSink):
     """ Class which accumulates USK index update notifications
         from fms messages. """
-    def __init__(self, trust_map):
+    def __init__(self, trust_map, keep_untrusted=False):
         IFmsMessageSink.__init__(self)
         self.trust_map = strip_names(trust_map)
         self.updates = {}
+        self.untrusted = None
+        if keep_untrusted:
+            self.untrusted = {}
 
     def wants_msg(self, dummy, items):
         """ IFmsMessageSink implementation. """
@@ -216,6 +219,9 @@ class USKIndexUpdateParser(IFmsMessageSi
             # Skip replies
             return False
 
+        if not self.untrusted is None:
+            return True
+
         if clean_nym(items[2]) not in self.trust_map:
             #print "Not trusted: ", items[2]
             # Sender not authoritative on any USK.
@@ -225,7 +231,7 @@ class USKIndexUpdateParser(IFmsMessageSi
 
     def recv_fms_msg(self, dummy, items, lines):
         """ IFmsMessageSink implementation. """
-        allowed_hashes = self.trust_map[clean_nym(items[2])]
+        allowed_hashes = self.trust_map.get(clean_nym(items[2]), ())
 
         #print "---\nSender: %s\nSubject: %s\n" % (items[2], items[1])
         for update in parse(lines, True)[0]:
@@ -233,15 +239,24 @@ class USKIndexUpdateParser(IFmsMessageSi
                 # Only update if the nym is trusted *for the specific USK*.
                 #print "UPDATING ---\nSender: %s\nSubject:
                 # %s\n" % (items[2], items[1])
-                self.handle_update(update)
+                self.handle_trusted_update(update)
+            else:
+                self.handle_untrusted_update(items[2], update)
 
-    def handle_update(self, update):
+    def handle_trusted_update(self, update):
         """ INTERNAL: Handle a single update. """
         index = update[1]
         value = self.updates.get(update[0], index)
         if index >= value:
             self.updates[update[0]] = index
 
+    def handle_untrusted_update(self, sender, update):
+        """ INTERNAL: Handle a single untrusted update. """
+        entry = self.untrusted.get(update[0], [])
+        if not sender in entry:
+            entry.append(sender)
+        self.untrusted[update[0]] = entry
+
     def updated(self, previous=None):
         """ Returns a USK hash -> index map for USKs which
             have been updated. """
diff --git a/infocalypse/infcmds.py b/infocalypse/infcmds.py
--- a/infocalypse/infcmds.py
+++ b/infocalypse/infcmds.py
@@ -714,7 +714,7 @@ def execute_info(ui_, params, stored_cfg
     ui_.status(INFO_FMT %
                (usk_hash, max_index or -1, request_uri, insert_uri))
 
-def handled_listall(ui_, params, stored_cfg):
+def handled_list(ui_, params, stored_cfg):
     """ INTERNAL: Helper function to simplify execute_fmsread. """
     if params['FMSREAD'] != 'list' and params['FMSREAD'] != 'listall':
         return False
@@ -760,7 +760,7 @@ def execute_fmsread(ui_, params, stored_
                     ' '.join(stored_cfg.fmsread_groups)))
 
     # Listing announced Repo USKs
-    if handled_listall(ui_, params, stored_cfg):
+    if handled_list(ui_, params, stored_cfg):
         return
 
     # Updating Repo USK indices for repos which are
@@ -768,6 +768,8 @@ def execute_fmsread(ui_, params, stored_
     # config file.
     trust_map = stored_cfg.fmsread_trust_map.copy() # paranoid copy
     if params['VERBOSITY'] >= 2:
+        if not params['REQUEST_URI'] is None:
+            ui_.status("USK Hash: %s\n" % get_usk_hash(params['REQUEST_URI']))
         fms_ids = trust_map.keys()
         fms_ids.sort()
         ui_.status("Update Trust Map:\n")
@@ -775,19 +777,39 @@ def execute_fmsread(ui_, params, stored_
             ui_.status("   %s: %s\n" % (fms_id,
                                         ' '.join(trust_map[fms_id])))
         ui_.status("\n")
-    parser = USKIndexUpdateParser(trust_map)
+    ui_.status("Raking through fms messages. This make take a while...\n")
+    parser = USKIndexUpdateParser(trust_map, True)
     recv_msgs(stored_cfg.defaults['FMS_HOST'],
               stored_cfg.defaults['FMS_PORT'],
               parser,
               stored_cfg.fmsread_groups)
     changed = parser.updated(stored_cfg.version_table)
+
+    if params['VERBOSITY'] >= 2:
+        if parser.untrusted and len(parser.untrusted) > 0:
+            text = 'Skipped Untrusted Updates:\n'
+            for usk_hash in parser.untrusted:
+                text += usk_hash + ':\n'
+                fms_ids = parser.untrusted[usk_hash]
+                for fms_id in fms_ids:
+                    text += '   ' + fms_id + '\n'
+            text += '\n'
+            ui_.status(text)
+
     if len(changed) == 0:
         ui_.status('No updates found.\n')
         return
 
-    # Back map to uris ?
-    for usk_hash in changed:
-        ui_.status('%s:%i\n' % (usk_hash, changed[usk_hash]))
+    # Back map to uris ? Can't always do it.
+    if len(changed) > 0:
+        text = 'Updates:\n'
+        for usk_hash in changed:
+            text += '%s:%i\n' % (usk_hash, changed[usk_hash])
+        ui_.status(text)
+        if ((not params['REQUEST_URI'] is None) and
+            get_usk_hash(params['REQUEST_URI']) in changed):
+            ui_.status("Current repo has update to index %s.\n" %
+                       changed[get_usk_hash(params['REQUEST_URI'])])
 
     if params['DRYRUN']:
         ui_.status('Exiting without saving because --dryrun was set.\n')
@@ -796,6 +818,7 @@ def execute_fmsread(ui_, params, stored_
     for usk_hash in changed:
         stored_cfg.update_index(usk_hash, changed[usk_hash])
 
+
     Config.to_file(stored_cfg)
     ui_.status('Saved updated indices.\n')