Handle keaboard interrupts and TERM signals.
authorNikos Skalkotos <skalkoto@grnet.gr>
Thu, 18 Oct 2012 14:24:57 +0000 (17:24 +0300)
committerNikos Skalkotos <skalkoto@grnet.gr>
Thu, 18 Oct 2012 14:24:57 +0000 (17:24 +0300)
image_creator/dialog_main.py
image_creator/disk.py
image_creator/main.py

index d9cea55..f9dd260 100644 (file)
@@ -67,6 +67,7 @@ def image_creator(d, media, out):
         disk.cleanup()
 
     signal.signal(signal.SIGINT, signal_handler)
         disk.cleanup()
 
     signal.signal(signal.SIGINT, signal_handler)
+    signal.signal(signal.SIGTERM, signal_handler)
     try:
         snapshot = disk.snapshot()
         dev = disk.get_device(snapshot)
     try:
         snapshot = disk.snapshot()
         dev = disk.get_device(snapshot)
index 70c7f87..aaee6ef 100644 (file)
@@ -84,13 +84,16 @@ class Disk(object):
         """Cleanup internal data. This needs to be called before the
         program ends.
         """
         """Cleanup internal data. This needs to be called before the
         program ends.
         """
-        while len(self._devices):
-            device = self._devices.pop()
-            device.destroy()
-
-        while len(self._cleanup_jobs):
-            job, args = self._cleanup_jobs.pop()
-            job(*args)
+        try:
+            while len(self._devices):
+                device = self._devices.pop()
+                device.destroy()
+        finally:
+            # Make sure those are executed even if one of the device.destroy
+            # methods throws exeptions.
+            while len(self._cleanup_jobs):
+                job, args = self._cleanup_jobs.pop()
+                job(*args)
 
     def snapshot(self):
         """Creates a snapshot of the original source media of the Disk
 
     def snapshot(self):
         """Creates a snapshot of the original source media of the Disk
@@ -225,12 +228,14 @@ class DiskDevice(object):
     def destroy(self):
         """Destroy this DiskDevice instance."""
 
     def destroy(self):
         """Destroy this DiskDevice instance."""
 
-        if self.guestfs_enabled:
-            self.g.umount_all()
-            self.g.sync()
-
-        # Close the guestfs handler if open
-        self.g.close()
+        # In new guestfs versions, there is a handy shutdown method for this
+        try:
+            if self.guestfs_enabled:
+                self.g.umount_all()
+                self.g.sync()
+        finally:
+            # Close the guestfs handler if open
+            self.g.close()
 
     def progress_callback(self, ev, eh, buf, array):
         position = array[2]
 
     def progress_callback(self, ev, eh, buf, array):
         position = array[2]
index f5dc5fe..9996dd6 100644 (file)
@@ -45,6 +45,7 @@ import sys
 import os
 import optparse
 import StringIO
 import os
 import optparse
 import StringIO
+import signal
 
 
 def check_writable_dir(option, opt_str, value, parser):
 
 
 def check_writable_dir(option, opt_str, value, parser):
@@ -187,6 +188,12 @@ def image_creator():
                                  "(use --force to overwrite it)." % filename)
 
     disk = Disk(options.source, out)
                                  "(use --force to overwrite it)." % filename)
 
     disk = Disk(options.source, out)
+
+    def signal_handler(signum, frame):
+        disk.cleanup()
+
+    signal.signal(signal.SIGINT, signal_handler)
+    signal.signal(signal.SIGTERM, signal_handler)
     try:
         snapshot = disk.snapshot()
 
     try:
         snapshot = disk.snapshot()