From: Daniel P. Berrangé <berra...@redhat.com>

Allow virCommand to find 'dmidecode' in $PATH. This command is only
usable when running privileged since it relies on reading from a
privileged kernel file. Thus we can assume both 'bin' and 'sbin' dirs
will be in $PATH and virFindFileInPath will do the right thing to
find it when called by virCommand.

Gating the iscsi driver backend on a isciadm probe is likely to do
more harm than good as it needlessly disables the code if the dev
forgot to install iscsiadm at build time. As a Linux only command
it is simpler to gate the feature based on the platform choice and
allow missing binaries to be diagnose at runtime.

Signed-off-by: Daniel P. Berrangé <berra...@redhat.com>
---
 meson.build          |  5 ++--
 src/util/viriscsi.c  | 55 ++++++++++++++++++++++----------------------
 tests/viriscsitest.c | 16 ++++++-------
 3 files changed, 37 insertions(+), 39 deletions(-)

diff --git a/meson.build b/meson.build
index d355767a53..9759a3322b 100644
--- a/meson.build
+++ b/meson.build
@@ -854,7 +854,6 @@ optional_test_programs = [
 ]
 
 optional_programs = [
-  'iscsiadm',
   'mdevctl',
   'mm-ctl',
   'modprobe',
@@ -1825,11 +1824,11 @@ if conf.has('WITH_LIBVIRTD')
     error('Need glusterfs (libgfapi) for gluster storage driver')
   endif
 
-  if not get_option('storage_iscsi').disabled() and iscsiadm_prog.found()
+  if not get_option('storage_iscsi').disabled() and host_machine.system() == 
'linux'
     use_storage = true
     conf.set('WITH_STORAGE_ISCSI', 1)
   elif get_option('storage_iscsi').enabled()
-    error('We need iscsiadm for iSCSI storage driver')
+    error('Linux host needed for iSCSI storage driver using iscsiadm')
   endif
 
   if not get_option('storage_iscsi_direct').disabled() and libiscsi_dep.found()
diff --git a/src/util/viriscsi.c b/src/util/viriscsi.c
index a70c87cbdb..f6b2cdba0c 100644
--- a/src/util/viriscsi.c
+++ b/src/util/viriscsi.c
@@ -88,8 +88,8 @@ virISCSIGetSession(const char *devpath,
     int exitstatus = 0;
     g_autofree char *error = NULL;
 
-    g_autoptr(virCommand) cmd = virCommandNewArgList(ISCSIADM, "--mode",
-                                                       "session", NULL);
+    g_autoptr(virCommand) cmd = virCommandNewArgList("iscsiadm", "--mode",
+                                                     "session", NULL);
     virCommandSetErrorBuffer(cmd, &error);
 
     if (virCommandRunRegex(cmd,
@@ -123,8 +123,8 @@ virStorageBackendIQNFound(const char *initiatoriqn,
     g_autofree char *outbuf = NULL;
     g_autofree char *iface = NULL;
     g_autofree char *iqn = NULL;
-    g_autoptr(virCommand) cmd = virCommandNewArgList(ISCSIADM,
-                                                       "--mode", "iface", 
NULL);
+    g_autoptr(virCommand) cmd = virCommandNewArgList("iscsiadm",
+                                                     "--mode", "iface", NULL);
 
     *ifacename = NULL;
 
@@ -193,8 +193,8 @@ virStorageBackendIQNFound(const char *initiatoriqn,
 
  error:
     virReportError(VIR_ERR_INTERNAL_ERROR,
-                   _("malformed output of %1$s: %2$s"),
-                   ISCSIADM, line);
+                   _("malformed output of 'iscsiadm': %1$s"),
+                   line);
     goto cleanup;
 }
 
@@ -215,7 +215,7 @@ virStorageBackendCreateIfaceIQN(const char *initiatoriqn,
     VIR_DEBUG("Attempting to create interface '%s' with IQN '%s'",
               temp_ifacename, initiatoriqn);
 
-    newcmd = virCommandNewArgList(ISCSIADM,
+    newcmd = virCommandNewArgList("iscsiadm",
                                   "--mode", "iface",
                                   "--interface", temp_ifacename,
                                   "--op", "new",
@@ -225,13 +225,12 @@ virStorageBackendCreateIfaceIQN(const char *initiatoriqn,
      * We will just rely on whether the interface got created
      * properly. */
     if (virCommandRun(newcmd, &exitstatus) < 0) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Failed to run command '%1$s' to create new iscsi 
interface"),
-                       ISCSIADM);
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Failed to run command 'iscsiadm' to create new iscsi 
interface"));
         return -1;
     }
 
-    updatecmd = virCommandNewArgList(ISCSIADM,
+    updatecmd = virCommandNewArgList("iscsiadm",
                                      "--mode", "iface",
                                      "--interface", temp_ifacename,
                                      "--op", "update",
@@ -244,8 +243,8 @@ virStorageBackendCreateIfaceIQN(const char *initiatoriqn,
      * rely on whether iface file got updated properly. */
     if (virCommandRun(updatecmd, &exitstatus) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Failed to run command '%1$s' to update iscsi 
interface with IQN '%2$s'"),
-                       ISCSIADM, initiatoriqn);
+                       _("Failed to run command 'iscsiadm' to update iscsi 
interface with IQN '%1$s'"),
+                       initiatoriqn);
         return -1;
     }
 
@@ -273,7 +272,7 @@ virISCSIConnection(const char *portal,
                    const char **extraargv)
 {
     const char *const baseargv[] = {
-        ISCSIADM,
+        "iscsiadm",
         "--mode", "node",
         "--portal", portal,
         "--targetname", target,
@@ -343,11 +342,11 @@ virISCSIConnectionLogout(const char *portal,
 int
 virISCSIRescanLUNs(const char *session)
 {
-    g_autoptr(virCommand) cmd = virCommandNewArgList(ISCSIADM,
-                                                       "--mode", "session",
-                                                       "-r", session,
-                                                       "-R",
-                                                       NULL);
+    g_autoptr(virCommand) cmd = virCommandNewArgList("iscsiadm",
+                                                     "--mode", "session",
+                                                     "-r", session,
+                                                     "-R",
+                                                     NULL);
     return virCommandRun(cmd, NULL);
 }
 
@@ -396,11 +395,11 @@ virISCSIScanTargetsInternal(const char *portal,
     int vars[] = { 2 };
     struct virISCSITargetList list = { 0 };
     size_t i;
-    g_autoptr(virCommand) cmd = virCommandNewArgList(ISCSIADM,
-                                                       "--mode", "discovery",
-                                                       "--type", "sendtargets",
-                                                       "--portal", portal,
-                                                       NULL);
+    g_autoptr(virCommand) cmd = virCommandNewArgList("iscsiadm",
+                                                     "--mode", "discovery",
+                                                     "--type", "sendtargets",
+                                                     "--portal", portal,
+                                                     NULL);
 
     if (!persist) {
         virCommandAddArgList(cmd,
@@ -512,7 +511,7 @@ virISCSINodeNew(const char *portal,
     g_autoptr(virCommand) cmd = NULL;
     int status;
 
-    cmd = virCommandNewArgList(ISCSIADM,
+    cmd = virCommandNewArgList("iscsiadm",
                                "--mode", "node",
                                "--portal", portal,
                                "--targetname", target,
@@ -528,8 +527,8 @@ virISCSINodeNew(const char *portal,
 
     if (status != 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("%1$s failed new mode for target '%2$s' with status 
'%3$d'"),
-                       ISCSIADM, target, status);
+                       _("'iscsiadm': failed new mode for target '%1$s' with 
status '%2$d'"),
+                       target, status);
         return -1;
     }
 
@@ -546,7 +545,7 @@ virISCSINodeUpdate(const char *portal,
     g_autoptr(virCommand) cmd = NULL;
     int status;
 
-    cmd = virCommandNewArgList(ISCSIADM,
+    cmd = virCommandNewArgList("iscsiadm",
                                "--mode", "node",
                                "--portal", portal,
                                "--target", target,
diff --git a/tests/viriscsitest.c b/tests/viriscsitest.c
index f2539e47b0..ee29b6f259 100644
--- a/tests/viriscsitest.c
+++ b/tests/viriscsitest.c
@@ -82,7 +82,7 @@ static void testIscsiadmCb(const char *const*args,
 {
     struct testIscsiadmCbData *data = opaque;
 
-    if (args[0] && STREQ(args[0], ISCSIADM) &&
+    if (args[0] && STREQ(args[0], "iscsiadm") &&
         args[1] && STREQ(args[1], "--mode") &&
         args[2] && STREQ(args[2], "session") &&
         args[3] == NULL) {
@@ -90,7 +90,7 @@ static void testIscsiadmCb(const char *const*args,
             *output = g_strdup(iscsiadmSessionOutputNonFlash);
         else
             *output = g_strdup(iscsiadmSessionOutput);
-    } else if (args[0] && STREQ(args[0], ISCSIADM) &&
+    } else if (args[0] && STREQ(args[0], "iscsiadm") &&
                args[1] && STREQ(args[1], "--mode") &&
                args[2] && STREQ(args[2], "discovery") &&
                args[3] && STREQ(args[3], "--type") &&
@@ -101,7 +101,7 @@ static void testIscsiadmCb(const char *const*args,
                args[8] && STREQ(args[8], "nonpersistent") &&
                args[9] == NULL) {
         *output = g_strdup(iscsiadmSendtargetsOutput);
-    } else if (args[0] && STREQ(args[0], ISCSIADM) &&
+    } else if (args[0] && STREQ(args[0], "iscsiadm") &&
                args[1] && STREQ(args[1], "--mode") &&
                args[2] && STREQ(args[2], "node") &&
                args[3] && STREQ(args[3], "--portal") &&
@@ -120,7 +120,7 @@ static void testIscsiadmCb(const char *const*args,
          *           target: iqn.2004-06.example:example1:iscsi.test, \
          *           portal: 10.20.30.40:3260,1] successful.
          */
-    } else if (args[0] && STREQ(args[0], ISCSIADM) &&
+    } else if (args[0] && STREQ(args[0], "iscsiadm") &&
                args[1] && STREQ(args[1], "--mode") &&
                args[2] && STREQ(args[2], "iface") &&
                args[3] == NULL) {
@@ -128,7 +128,7 @@ static void testIscsiadmCb(const char *const*args,
             *output = g_strdup(iscsiadmIfaceIfaceOutput);
         else
             *output = g_strdup(iscsiadmIfaceDefaultOutput);
-    } else if (args[0] && STREQ(args[0], ISCSIADM) &&
+    } else if (args[0] && STREQ(args[0], "iscsiadm") &&
                args[1] && STREQ(args[1], "--mode") &&
                args[2] && STREQ(args[2], "iface") &&
                args[3] && STREQ(args[3], "--interface") &&
@@ -142,7 +142,7 @@ static void testIscsiadmCb(const char *const*args,
          * New interface libvirt-iface-03020100 added
          */
         data->iface_created = true;
-    } else if (args[0] && STREQ(args[0], ISCSIADM) &&
+    } else if (args[0] && STREQ(args[0], "iscsiadm") &&
                args[1] && STREQ(args[1], "--mode") &&
                args[2] && STREQ(args[2], "iface") &&
                args[3] && STREQ(args[3], "--interface") &&
@@ -160,7 +160,7 @@ static void testIscsiadmCb(const char *const*args,
          *
          * libvirt-iface-03020100 updated.
          */
-    } else if (args[0] && STREQ(args[0], ISCSIADM) &&
+    } else if (args[0] && STREQ(args[0], "iscsiadm") &&
                args[1] && STREQ(args[1], "--mode") &&
                args[2] && STREQ(args[2], "discovery") &&
                args[3] && STREQ(args[3], "--type") &&
@@ -172,7 +172,7 @@ static void testIscsiadmCb(const char *const*args,
                args[9] == NULL &&
                data->iface_created) {
         *output = g_strdup(iscsiadmSendtargetsOutput);
-    } else if (args[0] && STREQ(args[0], ISCSIADM) &&
+    } else if (args[0] && STREQ(args[0], "iscsiadm") &&
                args[1] && STREQ(args[1], "--mode") &&
                args[2] && STREQ(args[2], "node") &&
                args[3] && STREQ(args[3], "--portal") &&
-- 
2.49.0

Reply via email to