chiark / gitweb /
chpwd, operation.py: Logging for operations.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 4 Feb 2014 14:33:41 +0000 (14:33 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 4 Feb 2014 14:33:41 +0000 (14:33 +0000)
Probably about time we did this, really.

chpwd
operation.py

diff --git a/chpwd b/chpwd
index 65ae873..2671906 100755 (executable)
--- a/chpwd
+++ b/chpwd
@@ -30,6 +30,7 @@ import optparse as OP
 import os as OS; ENV = OS.environ
 import shlex as SL
 import sys as SYS
+import syslog as L
 
 from auto import HOME, VERSION
 import cgi as CGI
@@ -200,6 +201,8 @@ def cli_errors():
 
 if __name__ == '__main__':
 
+  L.openlog(OS.path.basename(SYS.argv[0]), 0, L.LOG_AUTH)
+
   if 'REQUEST_METHOD' in ENV:
     ## This looks like a CGI request.  The heavy lifting for authentication
     ## over HTTP is done in `dispatch_cgi'.
index f02b462..50d7952 100644 (file)
@@ -24,6 +24,7 @@
 ### <http://www.gnu.org/licenses/>.
 
 import os as OS
+import syslog as L
 
 import config as CONF; CFG = CONF.CFG
 import util as U
@@ -201,6 +202,9 @@ class BaseRequest (object):
     """
     return optype(svc, user, **kw)
 
+  def describe(me):
+    return me.OP
+
   def perform(me):
     """
     Perform the queued-up operations.
@@ -338,7 +342,15 @@ def operate(op, accts, *args, **kw):
     * a list of the individual operation objects.
   """
   rq = getattr(CFG.RQCLASS, op)(accts, *args, **kw)
-  rq.check()
+  desc = rq.describe()
+  try:
+    rq.check()
+  except U.ExpectedError, e:
+    L.syslog('REFUSE %s %s: %s' %
+             (desc,
+              ', '.join(['%s@%s' % (o.user, o.svc.name) for o in rq.ops]),
+              e))
+    raise
   ops = rq.perform()
   nwin = nlose = 0
   for o in ops:
@@ -350,6 +362,12 @@ def operate(op, accts, *args, **kw):
   else:
     if nlose: rc = outcome.FAIL
     else: rc = outcome.NOTHING
+  L.syslog('%s %s: %s' % (['OK', 'PARTIAL', 'FAIL', 'NOTHING'][rc],
+                            desc,
+                            '; '.join(['%s@%s %s' % (o.user, o.svc.name,
+                                                     not o.error and 'OK' or
+                                                     'ERR %s' % o.error)
+                                       for o in ops])))
   ii = [info(v, getattr(rq, k)) for k, v in rq.INFO.iteritems()]
   return outcome(rc, nwin, nlose), ii, rq, ops