Support multiple iSCSI targets and read their addresses from invirt.config
[invirt/packages/xvm-iscsi-config.git] / debian / xvm-iscsi-config.postinst
index 0b7a06e..6182942 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 # postinst script for xvm-iscsi-config
 #
 # see: dh_installdeb(1)
@@ -25,36 +25,68 @@ set -e
 
 #DEBHELPER#
 
+get_current_sessions() {
+    for i in $(cd /sys/class/iscsi_session/ && ls); do
+        echo $(cat /sys/class/iscsi_connection/connection${i#session}:0/persistent_address) \
+$(cat /sys/class/iscsi_host/$(readlink /sys/class/iscsi_session/$i/device | perl -ne '/host\d+/ && print $&')/netdev)
+    done | sort
+}
+
+get_new_sessions() {
+    for i in $(invirt-getconf --ls iscsi.targets); do
+        echo $(invirt-getconf iscsi.targets.$i.ip) $(invirt-getconf iscsi.targets.$i.iface)
+    done | sort
+}
+
 case "$1" in
     configure)
-        db_get xvm-iscsi-config/address
-        ADDRESS="$RET"
         db_get xvm-iscsi-config/username
         USERNAME="$RET"
         db_get xvm-iscsi-config/password
         PASSWORD="$RET"
         db_stop
         
+        OLD_USERNAME=$(invirt-getconf iscsi.username 2>/dev/null)
+        OLD_PASSWORD=$(invirt-getconf iscsi.password 2>/dev/null)
+
         if [ -e /etc/invirt/conf.d/iscsi ]; then
           # invirt.config.run_parts_list excludes backup filenames.
           mv -f /etc/invirt/conf.d/iscsi /etc/invirt/conf.d/iscsi~
         fi
         cat >/etc/invirt/conf.d/iscsi <<EOF
 iscsi:
- address: $ADDRESS
  username: $USERNAME
  password: $PASSWORD
 EOF
+
+        # Attempt to determine whether the iSCSI configuration has changed at all
+        safe=""
+
         if [ -z "$2" ]; then
             invoke-rc.d xvm-iscsi-config restart
             invoke-rc.d open-iscsi restart
-            iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.address):3260 -I eth0 -I eth1
-        elif ! diff /etc/invirt/conf.d/iscsi~ /etc/invirt/conf.d/iscsi >/dev/null; then
-              cat <<EOF
-xvm-iscsi-config: The configuration has changed.  Restart iscsi:
+        elif [[ "$USERNAME" -ne "$OLD_USERNAME" || "$PASSWORD" -ne "$OLD_PASSWORD" ]]; then
+            cat <<EOF
+xvm-iscsi-config: The login credentials have changed.  Restart iscsi:
   /etc/init.d/xvm-iscsi-config restart
   /etc/init.d/open-iscsi restart
-  iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.address):3260 -I eth0 -I eth1
+EOF
+            safe=no
+        fi
+        if ! diff <(get_current_sessions) <(get_new_sessions) >/dev/null; then
+            if [ -z "$safe" ]; then
+                for i in $(invirt-getconf --ls iscsi.targets); do
+                    iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.targets.$i.ip):3260 -I $(invirt-getconf iscsi.targets.$i.iface)
+                    iscsiadm -m node -p $(invirt-getconf iscsi.targets.$i.ip):3260 -I $(invirt-getconf iscsi.targets.$i.iface) -l
+                done
+            else
+              for i in $(invirt-getconf --ls iscsi.targets); do
+                  echo "  "iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.targets.$i.ip):3260 -I $(invirt-getconf iscsi.targets.$i.iface)
+                  echo "  "iscsiadm -m node -p $(invirt-getconf iscsi.targets.$i.ip):3260 -I $(invirt-getconf iscsi.targets.$i.iface) -l
+              done
+            fi
+            cat <<EOF
+You may want to recreate the LVM nodes:
   lvchange -a ln /dev/xenvg && lvchange -a y /dev/xenvg
 This will leave VMs unable to access their disks, so migrate them first.