]> git.ipfire.org Git - thirdparty/dracut.git/commitdiff
net-lib.sh:parse_iscsi_root() fix target parsing
authorHarald Hoyer <harald@redhat.com>
Mon, 12 Jan 2015 13:06:10 +0000 (14:06 +0100)
committerHarald Hoyer <harald@redhat.com>
Mon, 12 Jan 2015 13:06:10 +0000 (14:06 +0100)
For targets with colons in the iSCSI target name:
  "iqn.2000-09.com.foo:storage-system.e2000:00000001cm1p1"

the parser was confused with the optional iscsi_iface_name and
iscsi_netdev_name.

This patch reintroduces the old IQN, EUI and NAA parsing and enhances
the fallback parser by checking the LUN for a numerical value.

modules.d/40network/net-lib.sh

index d9c5a1db9deabaf8e2700a859449c2819ac0cc41..c94090542e603b7bb7118563a43280ad4eb361e3 100755 (executable)
@@ -308,6 +308,23 @@ parse_iscsi_root()
             ;;
     esac
 
+    unset iscsi_target_name
+    # extract target name
+    case "$v" in
+        *:iqn.*)
+            iscsi_target_name=iqn.${v##*:iqn.}
+            v=${v%:iqn.*}:
+            ;;
+        *:eui.*)
+            iscsi_target_name=iqn.${v##*:eui.}
+            v=${v%:iqn.*}:
+            ;;
+        *:naa.*)
+            iscsi_target_name=iqn.${v##*:naa.}
+            v=${v%:iqn.*}:
+            ;;
+    esac
+
     # parse the rest
     OLDIFS="$IFS"
     IFS=:
@@ -317,24 +334,33 @@ parse_iscsi_root()
     iscsi_protocol=$1; shift # ignored
     iscsi_target_port=$1; shift
 
-    if [ $# -gt 3 ] && [ -n "$1$2" ]; then
-        iscsi_iface_name=$1; shift
-        iscsi_netdev_name=$1; shift
+    if [ -n "$iscsi_target_name" ]; then
+        if [ $# -eq 3 ]; then
+            iscsi_iface_name=$1; shift
+        fi
+        if [ $# -eq 2 ]; then
+            iscsi_netdev_name=$1; shift
+        fi
+        iscsi_lun=$1; shift
+        if [ $# -ne 0 ]; then
+            warn "Invalid parameter in iscsi: parameter!"
+            return 1
+        fi
+        return 0
     fi
 
-    iscsi_lun=$1; shift
 
-    if [ $# -gt 2 ]; then
-        warn "Invalid parameter in iscsi: parameter!"
-        return 1
+    if [ $# -gt 3 ] && [ -n "$1$2" ]; then
+        if [ -z "$3" ] || [ "$3" -ge 0 ]  2>/dev/null ; then
+            iscsi_iface_name=$1; shift
+            iscsi_netdev_name=$1; shift
+        fi
     fi
 
-    if [ $# -eq 2 ]; then
-        iscsi_target_name="$1:$2"
-    else
-        iscsi_target_name="$1"
-    fi
+    iscsi_lun=$1; shift
 
+    iscsi_target_name=$(printf "%s:" "$@")
+    iscsi_target_name=${iscsi_target_name%:}
 }
 
 ip_to_var() {