浏览代码

hooks update

bigeagle 11 年之前
父节点
当前提交
3629448b3b
共有 4 个文件被更改,包括 24 次插入7 次删除
  1. 2 2
      tunasync/btrfs_snapshot.py
  2. 2 2
      tunasync/hook.py
  3. 13 2
      tunasync/jobs.py
  4. 7 1
      tunasync/tunasync.py

+ 2 - 2
tunasync/btrfs_snapshot.py

@@ -17,10 +17,10 @@ class BtrfsHook(JobHook):
         self.working_dir = working_dir
         self.gc_dir = gc_dir
 
-    def before_job(self):
+    def before_job(self, *args, **kwargs):
         self._create_working_snapshot()
 
-    def after_job(self):
+    def after_job(self, *args, **kwargs):
         self._commit_changes()
 
     def _ensure_subvolume(self):

+ 2 - 2
tunasync/hook.py

@@ -4,10 +4,10 @@
 
 class JobHook(object):
 
-    def before_job(self):
+    def before_job(self, *args, **kwargs):
         raise NotImplementedError("")
 
-    def after_job(self):
+    def after_job(self, *args, **kwargs):
         raise NotImplementedError("")
 
 # vim: ts=4 sw=4 sts=4 expandtab

+ 13 - 2
tunasync/jobs.py

@@ -1,5 +1,6 @@
 #!/usr/bin/env python2
 # -*- coding:utf-8 -*-
+import sh
 import sys
 import signal
 
@@ -28,10 +29,20 @@ def run_job(sema, child_q, manager_q, provider):
             hook.before_job()
 
         provider.run()
-        provider.wait()
+
+        try:
+            provider.wait()
+        except sh.ErrorReturnCode:
+            status = "fail"
+        else:
+            status = "success"
 
         for hook in provider.hooks[::-1]:
-            hook.after_job()
+            try:
+                hook.after_job(status=status)
+            except Exception:
+                import traceback
+                traceback.print_exc()
 
         sema.release()
         aquired = False

+ 7 - 1
tunasync/tunasync.py

@@ -9,6 +9,7 @@ from multiprocessing import Process, Semaphore, Queue
 from . import jobs
 from .mirror_provider import RsyncProvider, ShellProvider
 from .btrfs_snapshot import BtrfsHook
+from .hook import JobHook
 
 
 class MirrorConfig(object):
@@ -145,6 +146,7 @@ class TUNASync(object):
         self.processes = {}
         self.semaphore = Semaphore(self._settings.getint("global", "concurrent"))
         self.channel = Queue()
+        self._hooks = []
 
         self.mirror_root = self._settings.get("global", "mirror_root")
         self.use_btrfs = self._settings.getboolean("global", "use_btrfs")
@@ -155,8 +157,12 @@ class TUNASync(object):
         self.btrfs_gc_dir_tmpl = self._settings.get(
             "btrfs", "gc_dir")
 
+    def add_hook(self, h):
+        assert isinstance(h, JobHook)
+        self._hooks.append(h)
+
     def hooks(self):
-        return []
+        return self._hooks
 
     @property
     def mirrors(self):