VMware ESXi 5.0 update 1 AutoStartManager代替スクリプト 0.2a

エントリ「VMware ESXi 5.0 update 1 AutoStartManager代替スクリプトを書いてみた」に”bigginer”様から頂きましたコメントで、

  • 起動時に遅延時間を個別の設定に従うようにした
  • vSphere Clientで立ち上げたVMも同時に落とせるようにした

というスクリプトをご投稿いただきました。
すでに「VMware ESXi 5.0 update 1のAutoStartManagerがBugFixされていた」でAutoStartManagerのバグは修正されていたことを書いていますが、運用上の問題でパッチが当てることが出来ないという話は十分あり得ますし、せっかくのソースをコメント欄に埋もれさせておくのはもったいないですし、何より自分のためにもなりますので、投稿していただいたソースをそのまま掲載させていただきます。

#!/bin/sh
#——————————————-
# Copyright (C) 2012 Lunatilia.net
#
# ShellID : vmware-autostart.sh
# Date : 2012/04/30
# Version : 0.2a
# Author : Mitsuki Shirase, modified by bignumorg / Iwamoto
#——————————————-

#—————————————
# Define Environment Variable
#—————————————
export PATH=/bin:/sbin
SCRIPT_DIR=$( cd $(dirname $0); pwd )
VIMSH=/bin/vim-cmd
ROOT_USER=”root”

#—————————————
# Define AutoStartManager commands
#—————————————
GET_AUTOSTARTSEQ=”hostsvc/autostartmanager/get_autostartseq”
GET_DEFAULT=”hostsvc/autostartmanager/get_default”
GET_STATE=”vmsvc/power.getstate”
CMD_POWERON=”vmsvc/power.on”
CMD_SHUTDOWN=”vmsvc/power.shutdown”
CMD_POWEROFF=”vmsvc/power.off”
CMD_SUSPEND=”vmsvc/power.suspend”
CMD_MESSAGE=”vmsvc/message”

#—————————————
# Define Work Files
#—————————————
AUTORUN_DEF=${SCRIPT_DIR}”/Auto_”$1″_Default.dat”
AUTORUN_TEMP=${SCRIPT_DIR}”/Auto_”$1″_Temp.dat”
AUTORUN_SEQ=${SCRIPT_DIR}”/Auto_”$1″_Seq.dat”
AUTORUN_WORK=${SCRIPT_DIR}”/Auto_”$1″_Work.dat”

rm #{AUTORUN_DEF}
rm ${AUTORUN_TEMP}
rm ${AUTORUN_SEQ}
rm ${AUTORUN_WORK}

#——————————————-
# Make VM List
#——————————————-
make_vm_list() {
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Starting [make_vm_list]”

_status=255
INC=0
RETRY_MAX=15
DELAY_TIME=2

while [ ${_status} -ne 0 ]
do
${VIMSH} -U ${ROOT_USER} ${GET_AUTOSTARTSEQ} > ${AUTORUN_TEMP}
_status=$?
if [ ${_status} -ne 0 ]
then
INC=`expr ${INC} + 1`
if [ ${INC} -gt ${RETRY_MAX} ]
then
logger -t “VMware[Auto Start/Stop ]” ” get_autostartseq Command Failed ; Retry over ${RETRY_MAX} times”
break
fi
##logger -t “VMware[Auto Start/Stop ]” ” Debug : get_autostartseq Command Failed RC=${_status} ; Retry after ${DELAY_TIME} second”
sleep ${DELAY_TIME}
fi
done

if [ ${_status} -ne 0 ]
then
logger -t “VMware[Auto Start/Stop ]” ” Command Failed RC=${_status} ; ${GET_AUTOSTARTSEQ}”
return ${_status}
fi
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Command Normal End ; ${GET_AUTOSTARTSEQ}”

egrep ‘key|startOrder|Action|Delay’ ${AUTORUN_TEMP} | sed ‘NNNNNs/\n//g ; s/ //g ; s/Guest//g’ > ${AUTORUN_SEQ}

NUMBER_OF_VMS=$( wc -l ${AUTORUN_SEQ} | grep -o “[0-9]\{1,\}” )
if [ ${NUMBER_OF_VMS} -lt 1 ]
then
logger -t “VMware[Auto Start/Stop ]” ” no VM defined.”
return 1
fi
##logger -t “VMware[Auto Start/Stop ]” ” Debug : GET_AUTOSTARTSEQ into ${AUTORUN_SEQ}”
}

#——————————————-
# get Default Values
#——————————————-
get_default_values() {
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Starting [get_default_values]”

_status=255
INC=0
RETRY_MAX=5
DELAY_TIME=1

while [ ${_status} -ne 0 ]
do
${VIMSH} -U ${ROOT_USER} ${GET_DEFAULT} > ${AUTORUN_DEF}
_status=$?
if [ ${_status} -ne 0 ]
then
INC=`expr ${INC} + 1`
if [ ${INC} -gt ${RETRY_MAX} ]
then
logger -t “VMware[Auto Start/Stop ]” ” get_default Command Failed ; Retry over ${RETRY_MAX} times”
break
fi
##logger -t “VMware[Auto Start/Stop ]” ” Debug : get_default Command Failed RC=${_status} ; Retry after ${DELAY_TIME} second”
sleep ${DELAY_TIME}
fi
done

if [ ${_status} -ne 0 ]
then
logger -t “VMware[Auto Start/Stop ]” ” Command Failed RC=${_status} ; ${GET_DEFAULT}”
DEF_START_DELAY_TIME=120
DEF_STOP_DELAY_TIME=120
DEF_STOP_ACTION=”PowerOff”
else
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Command Normal End ; ${GET_DEFAULT}”
DEF_START_DELAY_TIME=$( grep startDelay ${AUTORUN_DEF} | grep -o “[0-9]\{1,\}” )
DEF_STOP_DELAY_TIME=$( grep stopDelay ${AUTORUN_DEF} | grep -o “[0-9]\{1,\}” )
DEF_STOP_ACTION=$( grep stopAction ${AUTORUN_DEF} | grep -o \”.*\” | grep -o “[^\"]\{1,\}” )
fi

##AUTO_MESSAGE=”StartDelay=${DEF_START_DELAY_TIME} StopAction=${DEF_STOP_ACTION} StopDelay=${DEF_STOP_DELAY_TIME}”
##logger -t “VMware[Auto shutdown ]” ” ${AUTO_MESSAGE}”
}

#——————————————-
# Edit Auto Start/Stop VMs Parameter
#——————————————-
edit_paramerter() {
##logger -t “VMware[Auto Start/Stop ]” ” Debug : Starting [edit_paramerter]”

VMID=$( echo ${BUF_key} | grep -o “[0-9]\{1,\}” )
START_DELAY_TIME=$( echo ${BUF_startDelay} | grep -o “[0-9-]\{1,\}” )
START_ORDER=$( echo ${BUF_startOrder} | grep -o “[0-9-]\{1,\}” )
START_ACTION=$( echo ${BUF_startAction} | grep -o \”.*\” | grep -o “[^\"]\{1,\}” )
STOP_DELAY_TIME=$( echo ${BUF_stopDelay} | grep -o “[-0-9]\{1,\}” )
STOP_ACTION=$( echo ${BUF_stopAction} | grep -o \”.*\” | grep -o “[^\"]\{1,\}” )

if [ ${VMID} -gt 0 ]
then
VM_STATE=$( ${VIMSH} ${GET_STATE} ${VMID} | tail -1 )
## ++++ ##
if [ ${START_DELAY_TIME} -lt 0 ]; then
START_DELAY_TIME=${DEF_START_DELAY_TIME}
fi
## ++++ ##
if [ ${STOP_DELAY_TIME} -lt 0 ]; then
STOP_DELAY_TIME=${DEF_STOP_DELAY_TIME}
fi
## ++++ ##
if [ ${STOP_ACTION} = "SystemDefault" ]
then
STOP_ACTION=${DEF_STOP_ACTION}
fi
else
VM_STATE=”UnDefine”
fi
}

#——————————————-
# AutoStart VMs
#——————————————-
vmware_autostart_vms() {
##logger -t “VMware[Auto Startup ]” ” Debug : Starting : [vmware_autostart_vms]”

grep PowerOn ${AUTORUN_SEQ} > ${AUTORUN_WORK}
NUMBER_OF_VMS=$( wc -l ${AUTORUN_WORK} | grep -o “[0-9]\{1,\}” )

if [ ${NUMBER_OF_VMS} -lt 1 ]
then
logger -t “VMware[Auto Startup ]” ” Start VM not defined.”
return
fi
logger -t “VMware[Auto Startup ]” ” AutoStart VM Number=${NUMBER_OF_VMS} ”

INC=0
while read BUF_key BUF_startOrder BUF_startDelay BUF_startAction BUF_stopDelay BUF_stopAction
do
edit_paramerter

AUTO_MESSAGE=”VMID=${VMID} Order=${START_ORDER} Action=${START_ACTION} Delay=${START_DELAY_TIME}.”
##logger -t “VMware[Auto Startup ]” ” Debug : Buffer Values : ${AUTO_MESSAGE}”

if [ ${VMID} -gt 0 ]
then
if [ ${VM_STATE} = "Powered on" ]
then
##AUTO_MESSAGE=” VMID = ${VMID} Delay=${START_DELAY_TIME} State=${VM_STATE}.”
##logger -t “VMware[Auto Startup ]” ” Debug : VM Start Skip ; ${AUTO_MESSAGE}”
continue
fi
AUTO_MESSAGE=”VMID=${VMID} Order=${START_ORDER} Delay=${START_DELAY_TIME} State=${VM_STATE}.”
logger -t “VMware[Auto Startup ]” ” PowerOn VM now ; ${AUTO_MESSAGE}”

${VIMSH} ${CMD_POWERON} ${VMID}
_status=$?
if [ ${_status} -eq 0 ]
then
INC=`expr ${INC} + 1`
## ++++ ##
if [ ${START_ORDER} -gt 0 ]
then
sleep ${START_DELAY_TIME}
fi
else
logger -t “VMware[Auto Startup ]” ” PowerOn VM Failed RC=${_status} – Skip ; VMID=${VMID}”
fi
fi

done ${AUTORUN_WORK}
_status=$?
if [ ${_status} -ne 0 ]
then
logger -t “VMware[Auto shutdown ]” ” Reverce Work File Failed RC=${_status}”
return ${_status}
fi

NUMBER_OF_VMS=$( wc -l ${AUTORUN_WORK} | grep -o “[0-9]\{1,\}” )
if [ ${NUMBER_OF_VMS} -lt 1 ]
then
logger -t “Vmware[Auto shutdown ]” ” Stop VM not defined.”
return
fi
logger -t “VMware[Auto shutdown ]” ” Check AutoStop VM Number=${NUMBER_OF_VMS}”

INC=0
while read BUF_key BUF_startOrder BUF_startDelay BUF_startAction BUF_stopDelay BUF_stopAction
do
edit_paramerter

##logger -t “VMware[Auto shutdown ]” ” Debug : Buffer Values : VMID=${VMID} Action=${STOP_ACTION} Delay=${STOP_DELAY_TIME}.”

if [ ${VMID} -gt 0 ]
then
if [ "${VM_STATE}" != "Powered on" ]
then
##AUTO_MESSAGE=”VMID=${VMID} Action=${STOP_ACTION} Delay=${STOP_DELAY_TIME} State=${VM_STATE}.”
##logger -t “VMware[Auto shutdown ]” ” Debug : VM Stop Skip ; ${AUTO_MESSAGE}”
continue
fi

AUTO_MESSAGE=”VMID=${VMID} Order=${START_ORDER} Action=${STOP_ACTION} Delay=${STOP_DELAY_TIME} State=${VM_STATE}.”
case ${STOP_ACTION} in
“Suspend”)
logger -t “VMware[Auto shutdown ]” ” Suspend VM now ; ${AUTO_MESSAGE}”
${VIMSH} ${CMD_SUSPEND} ${VMID}
_status=$?
;;
“PowerOff”)
logger -t “VMware[Auto shutdown ]” ” PowerOff VM now ; ${AUTO_MESSAGE}”
${VIMSH} ${CMD_POWEROFF} ${VMID}
_status=$?
;;
*)
logger -t “VMware[Auto shutdown ]” ” Shutdown VM now ; ${AUTO_MESSAGE}”
${VIMSH} ${CMD_SHUTDOWN} ${VMID}
_status=$?
esac

if [ ${_status} -eq 0 ]
then
INC=`expr ${INC} + 1`
## ++++ ##
if [ ${START_ORDER} -gt 0 ]
then
sleep ${STOP_DELAY_TIME}
fi
else
logger -t “VMware[Auto shutdown ]” ” VM Stop Failed RC=${_status} – Skip ; VMID=${VMID}”
fi
fi

done < ${AUTORUN_WORK}
logger -t "VMware[Auto shutdown ]" " Stoped VM Number=${INC}"
}

#——————————————-
# Usage
#——————————————-
usage() {
echo "Usage: `basename "$0"` {start|stop|restart}"
}

#——————————————-
# Call function
#——————————————-

logger -t "VMware[Auto Start/Stop ]" " Start of $1 Process ; [$0]"
_status=0

make_vm_list
if [ ${_status} -eq 0 ]
then
get_default_values

IFS_SAVE=$IFS
IFS=,

case $1 in
"start")
vmware_autostart_vms
;;
"stop")
vmware_autostop_vms
;;
"restart")
vmware_autostop_vms
vmware_autostart_vms
;;
*)
logger -t "VMware[Auto Start/Stop ]" " Invalid Parameter ( $1 ) for $0"
usage
_status=1
esac

IFS=$IFS_SAVE
fi

logger -t "VMware[Auto Start/Stop ]" " End of $1 Process RC=${_status} ; [$0]"
exit ${_status}

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中