-#!/bin/sh
+#!/bin/bash
# postinst script for xvm-iscsi-config
#
# see: dh_installdeb(1)
#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.