File xm-save-check-file.patch of Package xen

Index: xen-4.0.2-testing/tools/python/xen/xend/XendAPI.py
===================================================================
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendAPI.py
+++ xen-4.0.2-testing/tools/python/xen/xend/XendAPI.py
@@ -1923,10 +1923,10 @@ class XendAPI(object):
                               bool(live), port, node, ssl, bool(chs))
         return xen_api_success_void()
 
-    def VM_save(self, _, vm_ref, dest, checkpoint):
+    def VM_save(self, _, vm_ref, dest, checkpoint, force):
         xendom = XendDomain.instance()
         xeninfo = xendom.get_vm_by_uuid(vm_ref)
-        xendom.domain_save(xeninfo.getDomid(), dest, checkpoint)
+        xendom.domain_save(xeninfo.getDomid(), dest, checkpoint, force)
         return xen_api_success_void()
 
     def VM_restore(self, _, src, paused):
Index: xen-4.0.2-testing/tools/python/xen/xend/XendDomain.py
===================================================================
--- xen-4.0.2-testing.orig/tools/python/xen/xend/XendDomain.py
+++ xen-4.0.2-testing/tools/python/xen/xend/XendDomain.py
@@ -1496,7 +1496,7 @@ class XendDomain:
                 pass
             sock.close()
 
-    def domain_save(self, domid, dst, checkpoint=False):
+    def domain_save(self, domid, dst, checkpoint=False, force=False):
         """Start saving a domain to file.
 
         @param domid: Domain ID or Name
@@ -1512,6 +1512,9 @@ class XendDomain:
             if not dominfo:
                 raise XendInvalidDomain(str(domid))
 
+            if os.access(dst, os.F_OK) and not force:
+                raise XendError("Save file:%s exist!\n" % dst)
+
             if dominfo.getDomid() == DOM0_ID:
                 raise XendError("Cannot save privileged domain %s" % str(domid))
             if dominfo._stateGet() != DOM_STATE_RUNNING:
Index: xen-4.0.2-testing/tools/python/xen/xm/main.py
===================================================================
--- xen-4.0.2-testing.orig/tools/python/xen/xm/main.py
+++ xen-4.0.2-testing/tools/python/xen/xm/main.py
@@ -120,7 +120,7 @@ SUBCOMMAND_HELP = {
     'reset'       : ('<Domain>', 'Reset a domain.'),
     'restore'     : ('<CheckpointFile> [-p]',
                      'Restore a domain from a saved state.'),
-    'save'        : ('[-c] <Domain> <CheckpointFile>',
+    'save'        : ('[-c|-f] <Domain> <CheckpointFile>',
                      'Save a domain state to restore later.'),
     'shutdown'    : ('<Domain> [-waRH]', 'Shutdown a domain.'),
     'top'         : ('', 'Monitor a host and the domains in real time.'),
@@ -316,6 +316,7 @@ SUBCOMMAND_OPTIONS = {
     ),
     'save': (
        ('-c', '--checkpoint', 'Leave domain running after creating snapshot'),
+       ('-f', '--force', 'Force to overwrite exist file'),
     ),
     'restore': (
        ('-p', '--paused', 'Do not unpause domain after restoring it'),
@@ -820,18 +821,21 @@ def xm_event_monitor(args):
 
 def xm_save(args):
 
-    arg_check(args, "save", 2, 3)
+    arg_check(args, "save", 2, 4)
     
     try:
-        (options, params) = getopt.gnu_getopt(args, 'c', ['checkpoint'])
+        (options, params) = getopt.gnu_getopt(args, 'cf', ['checkpoint', 'force'])
     except getopt.GetoptError, opterr:
         err(opterr)
         usage('save')
 
     checkpoint = False
+    force = False
     for (k, v) in options:
         if k in ['-c', '--checkpoint']:
             checkpoint = True
+        if k in ['-f', '--force']:
+            force = True
 
     if len(params) != 2:
         err("Wrong number of parameters")
@@ -845,9 +849,9 @@ def xm_save(args):
         sys.exit(1)
         
     if serverType == SERVER_XEN_API:       
-        server.xenapi.VM.save(get_single_vm(dom), savefile, checkpoint)
+        server.xenapi.VM.save(get_single_vm(dom), savefile, checkpoint, force)
     else:
-        server.xend.domain.save(dom, savefile, checkpoint)
+        server.xend.domain.save(dom, savefile, checkpoint, force)
     
 def xm_restore(args):
     arg_check(args, "restore", 1, 2)
openSUSE Build Service is sponsored by