[project @ make copier a bot with logging abilities]
authorDiane Trout <diane@caltech.edu>
Fri, 10 Aug 2007 00:15:18 +0000 (00:15 +0000)
committerDiane Trout <diane@caltech.edu>
Fri, 10 Aug 2007 00:15:18 +0000 (00:15 +0000)
this now imports benderjab and uses pythons logging module to keep
track of what rsync commands have been executed.

uashelper/copier.py

index 3bc76483efa73c1f90ba339e205b6d1de4088e07..2655320638d2558f33b19e7cca55c04610dda376 100644 (file)
@@ -1,14 +1,20 @@
 import copy
+import logging
+import logging.handlers
 import os
 import re
 import subprocess
+import sys
 import time
+import traceback
+
+from benderjab.bot import BenderFactory
 
 class rsync(object):
  
   def __init__(self, pwfile):
     self.pwfile = pwfile
-    self.cmd = ['/usr/bin/rsync', '--dry-run', '-a', ]
+    self.cmd = ['/usr/bin/rsync', ]
     self.cmd.append('--password-file=%s' % (pwfile))
     self.source_base = 'rsync://sequencer@jumpgate.caltech.edu:8730/sequencer/'
     self.dest_base = '/home/diane/gec/'
@@ -21,10 +27,10 @@ class rsync(object):
     args = copy.copy(self.cmd)
     args.append(self.source_base)
 
+    logging.debug("Rsync cmd:" + " ".join(args))
     short_process = subprocess.Popen(args, stdout=subprocess.PIPE)
     direntries = [ x.split() for x in short_process.stdout ]
     for permissions, size, filedate, filetime, filename in direntries:
-      #print permissions, filename
       if permissions[0] == 'd':
         # hey its a directory, the first step to being something we want to 
         # copy
@@ -36,8 +42,13 @@ class rsync(object):
 
   def create_copy_process(self, dirname):
     args = copy.copy(self.cmd)
+    # we want to copy everything
+    args.append('-rlt') 
+    # from here
     args.append(os.path.join(self.source_base, dirname))
+    # to here
     args.append(self.dest_base)
+    logging.debug("Rsync cmd:" + " ".join(args))
     return subprocess.Popen(args)
  
   def copy(self):
@@ -48,19 +59,48 @@ class rsync(object):
       process = self.processes.get(d, None)
       if process is None:
         # we don't have a process, so make one
-        print "starting rsync", d
+        logging.info("rsyncing %s" % (d))
         self.processes[d] = self.create_copy_process(d)
       else:
         retcode = process.poll()
         if retcode is not None:
            # we finished
-           print "rsync",d,"exited with state", retcode
+           logging.info("finished rsyncing %s, exitcode %d" % (d, retcode))
            del self.processes[d]
 
+class copier_bot_parser(object):
+  def __init__(self, ):
+    self.rsync = rsync('/home/diane/.sequencer')
+  
+  def __call__(self, msg, who):
+    try:
+      if re.match("start copy", msg):
+        logging.info("starting copy for %s" % (who.getStripped()))
+        self.rsync.copy()
+    except Exception, e:
+      errmsg = "Exception: " + str(e)
+      logging.error(errmsg)
+      logging.error(traceback.format_exc())
+      return errmsg
+
+def main(args=None):
+  if len(args) != 1:
+    print "need .benderjab config name"
+  configname = args[0]
+
+  logging.basicConfig(level=logging.INFO, 
+                      format='%(asctime)s %(levelname)s %(message)s')
+  log = logging.getLogger()
+  log.addHandler(logging.handlers.RotatingFileHandler(
+                   '/tmp/copier_bot.log', maxBytes=1000000, backupCount = 3)
+                )
+  bot = BenderFactory(configname)
+  bot.parser = copier_bot_parser()
+  bot.logon()
+  bot.eventLoop()
+  logging.shutdown()
+  return 0
+
 if __name__ == "__main__":
-  r = rsync('/home/diane/.sequencer')
-  r.copy()
-  while len(r.processes) > 0:
-    print "call..."
-    r.copy()
-    #time.sleep(0.1)
+  sys.exit(main(sys.argv[1:]))
+