Fix bitrot
[invirt/packages/invirt-images.git] / invirt-images
index 1566cc6..ec79d52 100755 (executable)
@@ -2,6 +2,7 @@
 
 from invirt import database
 import os
+import sys
 import subprocess
 import random
 import string
@@ -40,19 +41,42 @@ def lvcreate(name, size):
         return 6
 
 def lvrename(dest, src):
-    lvr = subprocess.Popen(['lvrename', 'xenvg', src, dest],
+    lvr = subprocess.Popen(['lvchange', '-an', "xenvg/%s" % (src,)],
                            stderr=subprocess.PIPE,
                            stdout=getOutput()['stdout'])
     ret = lvr.wait()
-    if not ret:
-        return 0
-    stderr = lvr.stderr.read()
-    if 'not found in volume group' in stderr:
-        return 0
-    else:
+
+    if ret:
+       stderr = lvr.stderr.read()
+       if 'not found' in stderr:
+           return 0
+       if verbosity > 0:
+           print stderr
+       return ret
+
+    lvr = subprocess.Popen(['lvrename', "xenvg/%s" % (src,), "xenvg/%s" % (dest,)],
+                           stderr=subprocess.PIPE,
+                           stdout=getOutput()['stdout'])
+    ret = lvr.wait()
+
+    if ret:
+        stderr = lvr.stderr.read()
+        if not ('not found in volume group' in stderr):
+            if verbosity > 0:
+                print stderr
+            return ret
+
+    subprocess.Popen(['lvchange', '-ay', "xenvg/%s" % (dest,)],
+                     stderr=subprocess.PIPE,
+                     stdout=getOutput()['stdout'])
+    ret = lvr.wait()
+
+    if ret:
         if verbosity > 0:
-            print stderr
-        return ret
+           print lvr.stderr.read()
+
+    return ret
+
 
 def lv_random(func, pattern, *args):
     """
@@ -109,6 +133,8 @@ def fetch_image(cdrom):
     """
     full_uri = os.path.join(cdrom.mirror.uri_prefix, cdrom.uri_suffix)
     temp_file = tempfile.mkstemp()[1]
+    if verbosity > 0:
+        print >>sys.stderr, "Fetching image %s from %s to %s" % (cdrom.cdrom_id, full_uri, temp_file)
     try:
         if full_uri.startswith('rsync://'):
             if subprocess.call(['rsync', '--no-motd', '-tLP', full_uri, temp_file],
@@ -139,9 +165,18 @@ def load_image(cdrom):
     """
     if cdrom.mirror_id is None:
         return
-    temp_file = fetch_image(cdrom)
     try:
-        cdrom_size = '%sM' % math.ceil((float(os.stat(temp_file).st_size) / (1024 * 1024)))
+        temp_file = fetch_image(cdrom)
+    except InvirtImageException, e:
+        print >>sys.stderr, 'ERROR: %s.  Skipping.' % e
+        return
+
+    try:
+        st_size = os.stat(temp_file).st_size
+        if not st_size:
+            print >>sys.stderr, "Failed to fetch %s" % cdrom.cdrom_id
+            return
+        cdrom_size = '%sM' % math.ceil((float(st_size) / (1024 * 1024)))
         new_lv = lvcreate_random('image-new_%s_%%s' % cdrom.cdrom_id, cdrom_size)
         copy_file(temp_file, '/dev/xenvg/%s' % new_lv)
         lvrename_random('image_%s' % cdrom.cdrom_id, 'image-old_%s_%%s' % cdrom.cdrom_id)
@@ -179,7 +214,8 @@ def main():
     global verbosity
     
     database.connect()
-    
+    database.session.begin()
+
     usage = """%prog [options] --add [--cdrom] cdrom_id description mirror_id uri_suffix
        %prog [options] --add --mirror mirror_id uri_prefix
 
@@ -231,8 +267,8 @@ def main():
             attrs = dict(zip(('cdrom_id', 'description', 'mirror_id', 'uri_suffix'),
                              args))
             cdrom = database.CDROM(**attrs)
-            database.session.save(cdrom)
-            database.session.flush()
+            database.session.add(cdrom)
+            database.session.commit()
             
             load_image(cdrom)
         
@@ -240,13 +276,13 @@ def main():
             attrs = dict(zip(('mirror_id', 'uri_prefix'),
                              args))
             mirror = database.Mirror(**attrs)
-            database.session.save(mirror)
-            database.session.flush()
+            database.session.add(mirror)
+            database.session.commit()
     elif options.action == 'update':
         if len(args) > 0:
-            images = [database.CDROM.query().get(arg) for arg in args]
+            images = [database.CDROM.query.get(arg) for arg in args]
         else:
-            images = database.CDROM.query().all()
+            images = database.CDROM.query.all()
         for cdrom in images:
             if cdrom is not None:
                 load_image(cdrom)