mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
237 lines
4.3 KiB
Bash
Executable File
237 lines
4.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# $Id: stopvm.sh 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xen/stopvm.sh $
|
|
# stopvm.sh -- stop one or all vm (iscsi version -- does not unmount)
|
|
#
|
|
#
|
|
#set -x
|
|
|
|
usage() {
|
|
printf "Usage: %s: [-f] [-u] <-a|-l <vm label>> \n" $(basename $0) >&2
|
|
}
|
|
|
|
_vifname() {
|
|
local vmname=$1
|
|
local domid=$(xm domid $vmname)
|
|
echo vif${domid}
|
|
}
|
|
|
|
remove_acct_rule() {
|
|
local vifname=$1
|
|
local intf=$2
|
|
|
|
iptables -L FORWARD | grep $vifname &> /dev/null
|
|
if [ $? -eq 0 ]
|
|
then
|
|
iptables-save | grep $vifname\\. | sed s/-A/-D/ | while read line
|
|
do
|
|
iptables $line
|
|
done
|
|
fi
|
|
|
|
return $?
|
|
}
|
|
|
|
remove_rate_limit_rules() {
|
|
local domid=$1
|
|
local vifname=$2
|
|
vifname=${vifname}.0
|
|
local mark=$(echo "obase=16; $domid" | bc) ##convert to hex
|
|
|
|
/usr/local/sbin/ebtables-save | grep FORWARD | grep -iw 0x${mark} | sed s/-A/-D/ | while read line
|
|
do
|
|
ebtables $line
|
|
done
|
|
}
|
|
|
|
unmount_local() {
|
|
local localdir=$1
|
|
if [ "$localdir" != "" ]
|
|
then
|
|
umount $localdir
|
|
fi
|
|
printf "Unmounting $localdir result=$?\n"
|
|
}
|
|
|
|
unmount_disks() {
|
|
local vmname=$1
|
|
local disks=$(ls -l $DISKDIR | grep $vmname | awk '{print $NF}')
|
|
for d in $disks ;
|
|
do
|
|
disknum=$(echo $d | awk -F"/" '{print $NF}')
|
|
tgt=$(ls -l /dev/disk/by-path | grep $disknum | awk '{print $(NF-2)}' | grep -v part | cut -d: -f2- | cut -d- -f3-)
|
|
softlink=$(ls -l $DISKDIR | grep $d | awk '{print $(NF-2)}')
|
|
rm $DISKDIR/$softlink #delete soft link
|
|
iscsiadm -m node -T $tgt -u #logout
|
|
sleep 3 #wait for logout to complete?
|
|
iscsiadm -m node -T $tgt -o delete #delete record
|
|
done
|
|
|
|
#unmount the image filesystem from nfs
|
|
unmount_local $2
|
|
}
|
|
|
|
stop_one_vm() {
|
|
local vmname=$1
|
|
local force=$2
|
|
local unmount=$3
|
|
local localdir=
|
|
local kernelpath=$(xm list -l $1 | grep vmlinuz)
|
|
local vifname=$(_vifname $vmname)
|
|
|
|
if [ "$kernelpath" != "" ]
|
|
then
|
|
local tmp=($kernelpath)
|
|
if [ ${#tmp[*]} -gt 1 ]
|
|
then
|
|
kernelpath=${tmp[1]}
|
|
fi
|
|
localdir=$(dirname $kernelpath)
|
|
fi
|
|
|
|
xm list $1 &>/dev/null
|
|
local result=$?
|
|
if [ $result -eq 3 ]
|
|
then
|
|
printf "Error: vm $1 does not exist\n" >&2
|
|
return 0
|
|
fi
|
|
|
|
if [ $result -ne 0 ]
|
|
then
|
|
printf "Error: xm returned $result\n" >&2
|
|
return 2
|
|
fi
|
|
|
|
|
|
local domId=0;
|
|
if xm list $1 -l | grep domid
|
|
then
|
|
status=($(xm list $1 | grep $1))
|
|
domId=${status[1]};
|
|
fi
|
|
|
|
if [ $domId -gt 0 ]
|
|
then
|
|
if [ $force -eq 0 ]
|
|
then
|
|
#Try a graceful shutdown
|
|
xm shutdown $1 -w
|
|
if [ $? -ne 0 ]
|
|
then
|
|
sleep 5
|
|
xm destroy $1
|
|
fi
|
|
fi
|
|
else
|
|
#printf "Domain $1 is already shutdown\n"
|
|
xm delete $1
|
|
remove_acct_rule $vifname 2
|
|
remove_rate_limit_rules $domId $vifname
|
|
return 0
|
|
fi
|
|
|
|
if [ $? -gt 0 ] || [ $force -eq 1 ]
|
|
then
|
|
#Try an undignified shutdown
|
|
xm destroy $1
|
|
fi
|
|
|
|
if [ $? -gt 0 ]; then
|
|
printf "Failed to terminate instance $1\n">&2
|
|
return 20
|
|
else
|
|
xm delete $1 >/dev/null 2>&1
|
|
if [ $? -gt 0 ]
|
|
then
|
|
printf "xm shutdown reported success but vm is still around?$1\n">&2
|
|
#Try an undignified shutdown
|
|
sleep 5
|
|
xm destroy $1
|
|
xm delete $1
|
|
if [ $? -gt 0 ]
|
|
then
|
|
printf "xm delete did not work a second time\n" >&2
|
|
fi
|
|
fi
|
|
remove_acct_rule $vifname 2
|
|
remove_rate_limit_rules $domId $vifname
|
|
fi
|
|
|
|
if [ "$unmount" == "1" ]
|
|
then
|
|
unmount_disks $1 $localdir
|
|
if [ $force -eq 1 ]
|
|
then
|
|
for i in $(mount -t nfs | grep $1 | awk '{print $3}')
|
|
do
|
|
umount $i
|
|
done
|
|
fi
|
|
fi
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
stop_all_vms() {
|
|
for i in `xm list | grep -v Domain-0| grep -v Name| awk -F" " '{print $1}'`
|
|
do
|
|
xm list -l $i | grep vmops-has > /dev/null
|
|
if [ $? -ne 0 ]
|
|
then
|
|
stop_one_vm $i $1 $2
|
|
fi
|
|
done
|
|
if [ $1 -eq 1 ]
|
|
then
|
|
for i in $(mount -t nfs | awk '{print $3}')
|
|
do
|
|
umount $i
|
|
done
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
DISKDIR="/dev/disk/by-vm/"
|
|
lflag=
|
|
aflag=
|
|
fflag=0
|
|
|
|
while getopts 'fual:' OPTION
|
|
do
|
|
case $OPTION in
|
|
l) lflag=1
|
|
vmname="$OPTARG"
|
|
;;
|
|
a) aflag=1
|
|
;;
|
|
f) fflag=1
|
|
;;
|
|
u) uflag=1
|
|
;;
|
|
?) usage
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [ "$aflag$lflag" != "1" ]
|
|
then
|
|
usage
|
|
exit 2
|
|
fi
|
|
|
|
if [ "$aflag" == "1" ]
|
|
then
|
|
stop_all_vms $fflag $uflag
|
|
exit 0
|
|
fi
|
|
|
|
stop_one_vm $vmname $fflag $uflag
|
|
|
|
exit $?
|
|
|
|
|