Refactor postinstall script so it has a separate script for connecting to the RAID
[invirt/packages/xvm-iscsi-config.git] / debian / xvm-iscsi-config.postinst
index 12226e3..a58dc00 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/sh
+#!/bin/bash
 # postinst script for xvm-iscsi-config
 #
 # see: dh_installdeb(1)
 # postinst script for xvm-iscsi-config
 #
 # see: dh_installdeb(1)
@@ -25,25 +25,69 @@ set -e
 
 #DEBHELPER#
 
 
 #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
+       for j in $(invirt-getconf --ls iscsi.targets.$i.ifaces); do
+            echo $(invirt-getconf iscsi.targets.$i.ip) $(invirt-getconf iscsi.targets.$i.ifaces.$j)
+       done
+    done | sort
+}
+
 case "$1" in
     configure)
 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
         
         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:
         cat >/etc/invirt/conf.d/iscsi <<EOF
 iscsi:
- address: $ADDRESS
  username: $USERNAME
  password: $PASSWORD
 EOF
  username: $USERNAME
  password: $PASSWORD
 EOF
-        invoke-rc.d xvm-iscsi-config restart
-        invoke-rc.d open-iscsi restart
-        iscsiadm -m discovery -t st -p $(invirt-getconf iscsi.address):3260
+
+        # 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
+        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
+EOF
+            safe=no
+        fi
+        if ! diff <(get_current_sessions) <(get_new_sessions) >/dev/null; then
+            if [ -z "$safe" ]; then
+               /usr/lib/xvm-iscsi-connect
+            else
+               echo "  /usr/lib/xvm-iscsi-connect"
+            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.
+
+EOF
+        fi
     ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)
     ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)