From a3990d9700303ffd832efffd193b5418b08dbd2a Mon Sep 17 00:00:00 2001
From: Nikos Skalkotos <skalkoto@grnet.gr>
Date: Fri, 12 Sep 2014 12:55:06 +0300
Subject: [PATCH] Always use get_command() to import commands

If you are a regular user, some root commands like modprobe may not be
in your path.
---
 image_creator/util.py | 44 ++++++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 21 deletions(-)

diff --git a/image_creator/util.py b/image_creator/util.py
index dfae024..c38e5a4 100644
--- a/image_creator/util.py
+++ b/image_creator/util.py
@@ -25,9 +25,6 @@ import os
 import re
 import json
 import tempfile
-from sh import qemu_img
-from sh import qemu_nbd
-from sh import modprobe
 
 
 class FatalError(Exception):
@@ -35,8 +32,25 @@ class FatalError(Exception):
     pass
 
 
+def get_command(command):
+    """Return a file system binary command"""
+    def find_sbin_command(command, exception):
+        search_paths = ['/usr/local/sbin', '/usr/sbin', '/sbin']
+        for fullpath in map(lambda x: "%s/%s" % (x, command), search_paths):
+            if os.path.exists(fullpath) and os.access(fullpath, os.X_OK):
+                return sh.Command(fullpath)
+        raise exception
+
+    try:
+        return sh.__getattr__(command)
+    except sh.CommandNotFound as e:
+        return find_sbin_command(command, e)
+
+
 def image_info(image):
     """Returns information about an image file"""
+
+    qemu_img = get_command('qemu-img')
     info = qemu_img('info', '--output', 'json', image)
     return json.loads(str(info))
 
@@ -44,6 +58,7 @@ def image_info(image):
 def create_snapshot(source, target_dir):
     """Returns a qcow2 snapshot of an image file"""
 
+    qemu_img = get_command('qemu-img')
     snapfd, snap = tempfile.mkstemp(prefix='snapshot-', dir=target_dir)
     os.close(snapfd)
     qemu_img('create', '-f', 'qcow2', '-o',
@@ -51,21 +66,6 @@ def create_snapshot(source, target_dir):
     return snap
 
 
-def get_command(command):
-    """Return a file system binary command"""
-    def find_sbin_command(command, exception):
-        search_paths = ['/usr/local/sbin', '/usr/sbin', '/sbin']
-        for fullpath in map(lambda x: "%s/%s" % (x, command), search_paths):
-            if os.path.exists(fullpath) and os.access(fullpath, os.X_OK):
-                return sh.Command(fullpath)
-        raise exception
-
-    try:
-        return sh.__getattr__(command)
-    except sh.CommandNotFound as e:
-        return find_sbin_command(command, e)
-
-
 def get_kvm_binary():
     """Returns the path to the kvm binary and some extra arguments if needed"""
 
@@ -131,6 +131,8 @@ class QemuNBD(object):
         self.image = image
         self.device = None
         self.pattern = re.compile('^nbd\d+$')
+        self.modprobe = get_command('modprobe')
+        self.qemu_nbd = get_command('qemu-nbd')
 
     def _list_devices(self):
         """Returns all the NBD block devices"""
@@ -141,7 +143,7 @@ class QemuNBD(object):
         devs = self._list_devices()
 
         if len(devs) == 0:  # Is nbd module loaded?
-            modprobe('nbd', 'max_part=16')
+            self.modprobe('nbd', 'max_part=16')
             # Wait a second for /dev to be populated
             time.sleep(1)
             devs = self._list_devices()
@@ -166,7 +168,7 @@ class QemuNBD(object):
             args.append('-r')
         args.append(self.image)
 
-        qemu_nbd(*args)
+        self.qemu_nbd(*args)
         self.device = device
         return device
 
@@ -174,7 +176,7 @@ class QemuNBD(object):
         """Disconnect the image from the connected device"""
         assert self.device is not None, "No device connected"
 
-        qemu_nbd('-d', self.device)
+        self.qemu_nbd('-d', self.device)
         self.device = None
 
 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :
-- 
GitLab