--- /dev/null
+
+import re
+
+umidmap = {
+ 'lp1vaQ': 'download-not-enough-shares',
+ '3uuBUQ': 'download-connection-lost-in-get-buckets',
+ 'LkD9Pw': 'user-incident-button',
+}
+
+def classify_incident(trigger):
+ m = trigger.get('message', '')
+ f = trigger.get('format', '')
+
+ umid_value = umidmap.get(trigger.get('umid',''), None)
+ if umid_value:
+ return umid_value
+
+ if re.search(r"^they had shares .* that we didn't know about$", m):
+ # Publish._got_write_answer
+ return "mutable-publish-surprise-shares"
+
+ if m.startswith("error during query"):
+ # there are a couple of different places that can generate this
+ # message (the result of cut-and-paste error-handling), so it isn't
+ # clear which is which
+
+ if re.search(r'mutable/servermap\.py.*_do_query', m):
+ # servermap.ServermapUpdater._query_failed()
+ where = "mapupdate"
+ elif re.search(r'mutable/retrieve\.py.*_got_results_one_share', m):
+ where = "retrieve"
+ else:
+ where = "unknown"
+
+ if ("Calling Stale Broker" in m and "DeadReferenceError" in m):
+ # a storage server went offline while we were talking to it (or
+ # because the client was shut off in the middle of an operation)
+ what = "lost-server"
+ elif "IOError" in m:
+ what = "ioerror"
+ elif ("UncoordinatedWriteError" in m and
+ "someone wrote to the data since we read the servermap" in m):
+ what = "uncoordinated-write-error"
+ elif "ConnectionLost" in m:
+ what = "lost-server"
+ else:
+ what = "unknown"
+
+ return "mutable-" + where + "-query-" + what
+
+ if (f.startswith("ran out of peers:") and
+ "have" in trigger and "need" in trigger):
+ return "mutable-retrieve-failure"
+ if m.startswith("invalid privkey from "):
+ # TODO: a UCW causes this, after the prefix has changed. Compare the
+ # prefix before trying to validate the privkey, to avoid the
+ # duplicate error.
+ return "mutable-mapupdate-bad-privkey"
+
+ if trigger.get('facility', '') == "tahoe.introducer":
+ if (trigger.get('isError', False)
+ and "ConnectionDone" in str(trigger.get('failure',''))):
+ return "introducer-lost-connection"
+ if "Initial Introducer connection failed" in m:
+ return "introducer-connection-failed"
+
+ return None