f5750a99ec
present (consistency with the xend script).
134 lines
3.5 KiB
Bash
134 lines
3.5 KiB
Bash
#!@RCD_SCRIPTS_SHELL@
|
|
#
|
|
# $NetBSD: xendomains.sh,v 1.2 2006/01/15 01:56:48 xtraeme Exp $
|
|
#
|
|
# PROVIDE: xendomains
|
|
# REQUIRE: xend
|
|
# KEYWORD: shutdown
|
|
#
|
|
# xendomains This required variable is a whitespace-separated
|
|
# list of domains, e.g., xendomains="dom1 dom2 dom3".
|
|
#
|
|
# xendomains_config This optional variable is a format string that
|
|
# represents the path to the configuration file for
|
|
# each domain. "%s" is substituted with the name of
|
|
# the domain. The default is "@PKG_SYSCONFDIR@/%s".
|
|
#
|
|
# xendomains_prehook This optional variable is a format string that
|
|
# represents the command to run, if it exists, before
|
|
# starting each domain. "%s" is substituted with the
|
|
# name of the domain. The default is
|
|
# "@PKG_SYSCONFDIR@/%s-pre".
|
|
#
|
|
# xendomains_posthook This optional variable is a format string that
|
|
# represents the command to run, if it exists, after
|
|
# stopping each domain. "%s" is substituted with the
|
|
# name of the domain. The default is
|
|
# "@PKG_SYSCONFDIR@/%s-post".
|
|
#
|
|
|
|
. /etc/rc.subr
|
|
|
|
name="xendomains"
|
|
ctl_command="@PREFIX@/sbin/xm"
|
|
start_cmd="xendomains_start"
|
|
stop_cmd="xendomains_stop"
|
|
list_cmd="xendomains_list"
|
|
extra_commands="list"
|
|
privcmd_path="@PROCPATH@/xen/privcmd"
|
|
|
|
xendomains_start()
|
|
{
|
|
[ -n "$xendomains" ] || return
|
|
|
|
if [ ! -f ${privcmd_path} ]; then
|
|
echo "${name}: Cannot find ${privcmd_path}!"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Starting xen domains."
|
|
for domain in $xendomains; do
|
|
case "$domain" in
|
|
"") continue ;;
|
|
esac
|
|
|
|
# Start off by running the pre-hook script if it's present.
|
|
if [ -n "${xendomains_prehook}" ]; then
|
|
cmdline=`printf "${xendomains_prehook}" $domain`
|
|
cmd="${cmdline%% *}"
|
|
if [ -x "$cmd" ]; then
|
|
$cmdline || echo "Pre-hook \`\`$cmdline'' failed... skipping $domain."
|
|
continue
|
|
fi
|
|
fi
|
|
|
|
# Ask xend to create the domain.
|
|
if [ -n "${xendomains_config}" ]; then
|
|
file=`printf "${xendomains_config}" $domain`
|
|
if [ -f "$file" ]; then
|
|
${ctl_command} create "$file"
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
xendomains_list() {
|
|
# Output a whitespace-separated list of live guest domains.
|
|
${ctl_command} list | awk '
|
|
(FNR <= 2) { next }
|
|
($5 !~ /s/) { s = s " " $1 }
|
|
END { sub(" *", "", s); print s }'
|
|
}
|
|
|
|
xendomains_stop()
|
|
{
|
|
# Determine an appropriate timeout waiting for all domains to
|
|
# stop -- always wait at least 60s, and add 5s per active domain.
|
|
#
|
|
numdomains=$(xendomains_list | awk '{ print NF }')
|
|
[ $numdomains -gt 0 ] || return
|
|
timeout=$((60 + numdomains * 5))
|
|
|
|
# Ask xend to stop every domain, and poll xend every 10s up to the
|
|
# timeout period to check if all the domains are stopped. We
|
|
# consider a domain in the "s" (shutdown) state to be stopped.
|
|
#
|
|
echo "Stopping xen domains."
|
|
for domain in $(xendomains_list); do
|
|
${ctl_command} shutdown --halt $domain
|
|
done
|
|
while [ $timeout -gt 0 ]; do
|
|
livedomains=$(xendomains_list)
|
|
[ -n "$livedomains" ] || break
|
|
timeout=$((timeout - 10))
|
|
sleep 10
|
|
done
|
|
livedomains=$(xendomains_list)
|
|
if [ -n "$livedomains" ]; then
|
|
echo "Failed to stop: $livedomains"
|
|
else
|
|
echo "All domains stopped."
|
|
fi
|
|
|
|
# Finish off by running the post-hook script if it's present.
|
|
for domain in $xendomains; do
|
|
case "$domain" in
|
|
"") continue ;;
|
|
esac
|
|
if [ -n "${xendomains_posthook}" ]; then
|
|
cmdline=`printf "${xendomains_posthook}" $domain`
|
|
cmd="${cmdline%% *}"
|
|
if [ -x "$cmd" ]; then
|
|
$cmdline || echo "Post-hook \`\`$cmdline'' failed."
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
load_rc_config $name
|
|
|
|
: ${xendomains_config="@PKG_SYSCONFDIR@/%s"}
|
|
: ${xendomains_prehook="@PKG_SYSCONFDIR@/%s-pre"}
|
|
: ${xendomains_posthook="@PKG_SYSCONFDIR@/%s-post"}
|
|
|
|
run_rc_command "$1"
|