Since libvirt-guests init script and its configuration do not require libvirtd to be running/installed, it was a bad idea to put them into daemon directory. libvirt.spec even includes these files in libvirt-client subpackage, which may result in build failure for client-only builds when the whole daemon directory is just skipped. --- daemon/Makefile.am | 16 +-- daemon/libvirt-guests.init.in | 341 ----------------------------------------- daemon/libvirt-guests.sysconf | 24 --- tools/Makefile.am | 41 +++++- tools/libvirt-guests.init.in | 341 +++++++++++++++++++++++++++++++++++++++++ tools/libvirt-guests.sysconf | 24 +++ 6 files changed, 409 insertions(+), 378 deletions(-) delete mode 100644 daemon/libvirt-guests.init.in delete mode 100644 daemon/libvirt-guests.sysconf create mode 100644 tools/libvirt-guests.init.in create mode 100644 tools/libvirt-guests.sysconf diff --git a/daemon/Makefile.am b/daemon/Makefile.am index dbf0ac3..53133d2 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -35,8 +35,6 @@ EXTRA_DIST = \ libvirtd.uml.logrotate.in \ test_libvirtd.aug \ THREADING.txt \ - libvirt-guests.init.in \ - libvirt-guests.sysconf \ libvirtd.pod.in \ $(AVAHI_SOURCES) \ $(DAEMON_SOURCES) @@ -258,27 +256,21 @@ install-logrotate: $(LOGROTATE_CONFS) $(INSTALL_DATA) libvirtd.uml.logrotate $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml if LIBVIRT_INIT_SCRIPT_RED_HAT -install-init: libvirtd.init libvirt-guests.init +install-init: libvirtd.init mkdir -p $(DESTDIR)$(sysconfdir)/rc.d/init.d $(INSTALL_SCRIPT) libvirtd.init \ $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd - $(INSTALL_SCRIPT) libvirt-guests.init \ - $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirt-guests mkdir -p $(DESTDIR)$(sysconfdir)/sysconfig $(INSTALL_SCRIPT) $(srcdir)/libvirtd.sysconf \ $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd - $(INSTALL_SCRIPT) $(srcdir)/libvirt-guests.sysconf \ - $(DESTDIR)$(sysconfdir)/sysconfig/libvirt-guests uninstall-init: rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd \ - $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd \ - $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirt-guests \ - $(DESTDIR)$(sysconfdir)/sysconfig/libvirt-guests + $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd -BUILT_SOURCES += libvirtd.init libvirt-guests.init +BUILT_SOURCES += libvirtd.init -%.init: %.init.in $(top_builddir)/config.status +libvirtd.init: libvirtd.init.in $(top_builddir)/config.status $(AM_V_GEN)sed \ -e s!\@localstatedir\@!@localstatedir@!g \ -e s!\@sbindir\@!@sbindir@!g \ diff --git a/daemon/libvirt-guests.init.in b/daemon/libvirt-guests.init.in deleted file mode 100644 index 993c12d..0000000 --- a/daemon/libvirt-guests.init.in +++ /dev/null @@ -1,341 +0,0 @@ -#!/bin/sh - -# the following is the LSB init header -# -### BEGIN INIT INFO -# Provides: libvirt-guests -# Required-Start: libvirtd -# Required-Stop: libvirtd -# Default-Start: 3 4 5 -# Short-Description: suspend/resume libvirt guests on shutdown/boot -# Description: This is a script for suspending active libvirt guests -# on shutdown and resuming them on next boot -# See http://libvirt.org -### END INIT INFO - -# the following is chkconfig init header -# -# libvirt-guests: suspend/resume libvirt guests on shutdown/boot -# -# chkconfig: 345 98 02 -# description: This is a script for suspending active libvirt guests \ -# on shutdown and resuming them on next boot \ -# See http://libvirt.org -# - -sysconfdir=@sysconfdir@ -localstatedir=@localstatedir@ -libvirtd=@sbindir@/libvirtd - -# Source function library. -. "$sysconfdir"/rc.d/init.d/functions - -URIS=default -ON_BOOT=start -ON_SHUTDOWN=suspend -SHUTDOWN_TIMEOUT=0 - -test -f "$sysconfdir"/sysconfig/libvirt-guests && . "$sysconfdir"/sysconfig/libvirt-guests - -LISTFILE="$localstatedir"/lib/libvirt/libvirt-guests -VAR_SUBSYS_LIBVIRT_GUESTS="$localstatedir"/lock/subsys/libvirt-guests - -RETVAL=0 - -retval() { - "$@" - if [ $? -ne 0 ]; then - RETVAL=1 - return 1 - else - return 0 - fi -} - -run_virsh() { - uri=$1 - shift - - if [ "x$uri" = xdefault ]; then - conn= - else - conn="-c $uri" - fi - - virsh $conn "$@" </dev/null -} - -run_virsh_c() { - ( export LC_ALL=C; run_virsh "$@" ) -} - -list_guests() { - uri=$1 - - list=$(run_virsh_c $uri list) - if [ $? -ne 0 ]; then - RETVAL=1 - return 1 - fi - - uuids= - for id in $(echo "$list" | awk 'NR > 2 {print $1}'); do - uuid=$(run_virsh_c $uri dominfo $id | awk '/^UUID:/{print $2}') - if [ -z "$uuid" ]; then - RETVAL=1 - return 1 - fi - uuids="$uuids $uuid" - done - - echo $uuids -} - -guest_name() { - uri=$1 - uuid=$2 - - name=$(run_virsh_c $uri dominfo $uuid 2>/dev/null | \ - awk '/^Name:/{print $2}') - [ -n "$name" ] || name=$uuid - - echo "$name" -} - -guest_is_on() { - uri=$1 - uuid=$2 - - guest_running=false - info=$(run_virsh_c $uri dominfo $uuid) - if [ $? -ne 0 ]; then - RETVAL=1 - return 1 - fi - - id=$(echo "$info" | awk '/^Id:/{print $2}') - - [ -n "$id" ] && [ "x$id" != x- ] && guest_running=true - return 0 -} - -started() { - touch "$VAR_SUBSYS_LIBVIRT_GUESTS" -} - -start() { - [ -f "$LISTFILE" ] || { started; return 0; } - - if [ "x$ON_BOOT" != xstart ]; then - echo $"libvirt-guests is configured not to start any guests on boot" - rm -f "$LISTFILE" - started - return 0 - fi - - while read uri list; do - configured=false - for confuri in $URIS; do - if [ $confuri = $uri ]; then - configured=true - break - fi - done - if ! $configured; then - echo $"Ignoring guests on $uri URI" - continue - fi - - echo $"Resuming guests on $uri URI..." - for guest in $list; do - name=$(guest_name $uri $guest) - echo -n $"Resuming guest $name: " - if guest_is_on $uri $guest; then - if $guest_running; then - echo $"already active" - else - retval run_virsh $uri start "$name" >/dev/null && \ - echo $"done" - fi - fi - done - done <"$LISTFILE" - - rm -f "$LISTFILE" - started -} - -suspend_guest() -{ - uri=$1 - guest=$2 - - name=$(guest_name $uri $guest) - label=$"Suspending $name: " - echo -n "$label" - run_virsh $uri managedsave $guest >/dev/null & - virsh_pid=$! - while true; do - sleep 1 - kill -0 $virsh_pid >&/dev/null || break - progress=$(run_virsh_c $uri domjobinfo $guest 2>/dev/null | \ - awk '/^Data processed:/{print $3, $4}') - if [ -n "$progress" ]; then - printf '\r%s%12s ' "$label" "$progress" - else - printf '\r%s%-12s ' "$label" "..." - fi - done - retval wait $virsh_pid && printf '\r%s%-12s\n' "$label" $"done" -} - -shutdown_guest() -{ - uri=$1 - guest=$2 - - name=$(guest_name $uri $guest) - label=$"Shutting down $name: " - echo -n "$label" - retval run_virsh $uri shutdown $guest >/dev/null || return - timeout=$SHUTDOWN_TIMEOUT - while [ $timeout -gt 0 ]; do - sleep 1 - timeout=$[timeout - 1] - guest_is_on $uri $guest || return - $guest_running || break - printf '\r%s%-12d ' "$label" $timeout - done - - if guest_is_on $uri $guest; then - if $guest_running; then - printf '\r%s%-12s\n' "$label" $"failed to shutdown in time" - else - printf '\r%s%-12s\n' "$label" $"done" - fi - fi -} - -stop() { - # last stop was not followed by start - [ -f "$LISTFILE" ] && return 0 - - suspending=true - if [ "x$ON_SHUTDOWN" = xshutdown ]; then - suspending=false - if [ $SHUTDOWN_TIMEOUT -le 0 ]; then - echo $"Shutdown action requested but SHUTDOWN_TIMEOUT was not set" - RETVAL=6 - return - fi - fi - - : >"$LISTFILE" - for uri in $URIS; do - echo -n $"Running guests on $uri URI: " - - if [ "x$uri" = xdefault ] && [ ! -x "$libvirtd" ]; then - echo $"libvirtd not installed; skipping this URI." - continue - fi - - list=$(list_guests $uri) - if [ $? -eq 0 ]; then - empty=true - for uuid in $list; do - $empty || printf ", " - echo -n $(guest_name $uri $uuid) - empty=false - done - if $empty; then - echo $"no running guests." - else - echo - echo $uri $list >>"$LISTFILE" - fi - fi - done - - while read uri list; do - if $suspending; then - echo $"Suspending guests on $uri URI..." - else - echo $"Shutting down guests on $uri URI..." - fi - - for guest in $list; do - if $suspending; then - suspend_guest $uri $guest - else - shutdown_guest $uri $guest - fi - done - done <"$LISTFILE" - - rm -f "$VAR_SUBSYS_LIBVIRT_GUESTS" -} - -gueststatus() { - for uri in $URIS; do - echo "* $uri URI:" - retval run_virsh $uri list || echo - done -} - -# rh_status -# Display current status: whether saved state exists, and whether start -# has been executed. We cannot use status() from the functions library, -# since there is no external daemon process matching this init script. -rh_status() { - if [ -f "$LISTFILE" ]; then - echo $"stopped, with saved guests" - RETVAL=3 - else - if [ -f "$VAR_SUBSYS_LIBVIRT_GUESTS" ]; then - echo $"started" - else - echo $"stopped, with no saved guests" - fi - RETVAL=0 - fi -} - -# usage [val] -# Display usage string, then exit with VAL (defaults to 2). -usage() { - echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|gueststatus|shutdown}" - exit ${1-2} -} - -# See how we were called. -if test $# != 1; then - usage -fi -case "$1" in - --help) - usage 0 - ;; - start|stop|gueststatus) - $1 - ;; - restart) - stop && start - ;; - condrestart|try-restart) - [ -f "$VAR_SUBSYS_LIBVIRT_GUESTS" ] && stop && start - ;; - reload|force-reload) - # Nothing to do; we reread configuration on each invocation - ;; - status) - rh_status - ;; - shutdown) - ON_SHUTDOWN=shutdown - stop - ;; - *) - usage - ;; -esac -exit $RETVAL diff --git a/daemon/libvirt-guests.sysconf b/daemon/libvirt-guests.sysconf deleted file mode 100644 index cd58728..0000000 --- a/daemon/libvirt-guests.sysconf +++ /dev/null @@ -1,24 +0,0 @@ -# URIs to check for running guests -# example: URIS='default xen:/// vbox+tcp://host/system lxc:///' -#URIS=default - -# action taken on host boot -# - start all guests which were running on shutdown are started on boot -# regardless on their autostart settings -# - ignore libvirt-guests init script won't start any guest on boot, however, -# guests marked as autostart will still be automatically started by -# libvirtd -#ON_BOOT=start - -# action taken on host shutdown -# - suspend all running guests are suspended using virsh managedsave -# - shutdown all running guests are asked to shutdown. Please be careful with -# this settings since there is no way to distinguish between a -# guest which is stuck or ignores shutdown requests and a guest -# which just needs a long time to shutdown. When setting -# ON_SHUTDOWN=shutdown, you must also set SHUTDOWN_TIMEOUT to a -# value suitable for your guests. -#ON_SHUTDOWN=suspend - -# number of seconds we're willing to wait for a guest to shut down -#SHUTDOWN_TIMEOUT=0 diff --git a/tools/Makefile.am b/tools/Makefile.am index fd05e8b..ac26cae 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -8,7 +8,13 @@ ICON_FILES = \ libvirt_win_icon_64x64.ico \ virsh_win_icon.rc -EXTRA_DIST = $(ICON_FILES) virt-xml-validate.in virt-pki-validate.in virsh.pod +EXTRA_DIST = \ + $(ICON_FILES) \ + virt-xml-validate.in \ + virt-pki-validate.in \ + virsh.pod \ + libvirt-guests.init.in \ + libvirt-guests.sysconf bin_SCRIPTS = virt-xml-validate virt-pki-validate bin_PROGRAMS = virsh @@ -118,6 +124,39 @@ endif virsh.1: virsh.pod $(AM_V_GEN)$(POD2MAN) $< $@ +install-data-local: install-init + +uninstall-local: uninstall-init + +if LIBVIRT_INIT_SCRIPT_RED_HAT +install-init: libvirt-guests.init + mkdir -p $(DESTDIR)$(sysconfdir)/rc.d/init.d + $(INSTALL_SCRIPT) libvirt-guests.init \ + $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirt-guests + mkdir -p $(DESTDIR)$(sysconfdir)/sysconfig + $(INSTALL_SCRIPT) $(srcdir)/libvirt-guests.sysconf \ + $(DESTDIR)$(sysconfdir)/sysconfig/libvirt-guests + +uninstall-init: + rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirt-guests \ + $(DESTDIR)$(sysconfdir)/sysconfig/libvirt-guests + +BUILT_SOURCES += libvirt-guests.init + +libvirt-guests.init: libvirt-guests.init.in $(top_builddir)/config.status + $(AM_V_GEN)sed \ + -e s!\@localstatedir\@!@localstatedir@!g \ + -e s!\@sbindir\@!@sbindir@!g \ + -e s!\@sysconfdir\@!@sysconfdir@!g \ + < $< > $@-t && \ + chmod a+x $@-t && \ + mv $@-t $@ +else +install-init: +uninstall-init: +libvirt-guests.init: +endif # LIBVIRT_INIT_SCRIPT_RED_HAT + CLEANFILES = $(bin_SCRIPTS) $(man1_MANS) diff --git a/tools/libvirt-guests.init.in b/tools/libvirt-guests.init.in new file mode 100644 index 0000000..993c12d --- /dev/null +++ b/tools/libvirt-guests.init.in @@ -0,0 +1,341 @@ +#!/bin/sh + +# the following is the LSB init header +# +### BEGIN INIT INFO +# Provides: libvirt-guests +# Required-Start: libvirtd +# Required-Stop: libvirtd +# Default-Start: 3 4 5 +# Short-Description: suspend/resume libvirt guests on shutdown/boot +# Description: This is a script for suspending active libvirt guests +# on shutdown and resuming them on next boot +# See http://libvirt.org +### END INIT INFO + +# the following is chkconfig init header +# +# libvirt-guests: suspend/resume libvirt guests on shutdown/boot +# +# chkconfig: 345 98 02 +# description: This is a script for suspending active libvirt guests \ +# on shutdown and resuming them on next boot \ +# See http://libvirt.org +# + +sysconfdir=@sysconfdir@ +localstatedir=@localstatedir@ +libvirtd=@sbindir@/libvirtd + +# Source function library. +. "$sysconfdir"/rc.d/init.d/functions + +URIS=default +ON_BOOT=start +ON_SHUTDOWN=suspend +SHUTDOWN_TIMEOUT=0 + +test -f "$sysconfdir"/sysconfig/libvirt-guests && . "$sysconfdir"/sysconfig/libvirt-guests + +LISTFILE="$localstatedir"/lib/libvirt/libvirt-guests +VAR_SUBSYS_LIBVIRT_GUESTS="$localstatedir"/lock/subsys/libvirt-guests + +RETVAL=0 + +retval() { + "$@" + if [ $? -ne 0 ]; then + RETVAL=1 + return 1 + else + return 0 + fi +} + +run_virsh() { + uri=$1 + shift + + if [ "x$uri" = xdefault ]; then + conn= + else + conn="-c $uri" + fi + + virsh $conn "$@" </dev/null +} + +run_virsh_c() { + ( export LC_ALL=C; run_virsh "$@" ) +} + +list_guests() { + uri=$1 + + list=$(run_virsh_c $uri list) + if [ $? -ne 0 ]; then + RETVAL=1 + return 1 + fi + + uuids= + for id in $(echo "$list" | awk 'NR > 2 {print $1}'); do + uuid=$(run_virsh_c $uri dominfo $id | awk '/^UUID:/{print $2}') + if [ -z "$uuid" ]; then + RETVAL=1 + return 1 + fi + uuids="$uuids $uuid" + done + + echo $uuids +} + +guest_name() { + uri=$1 + uuid=$2 + + name=$(run_virsh_c $uri dominfo $uuid 2>/dev/null | \ + awk '/^Name:/{print $2}') + [ -n "$name" ] || name=$uuid + + echo "$name" +} + +guest_is_on() { + uri=$1 + uuid=$2 + + guest_running=false + info=$(run_virsh_c $uri dominfo $uuid) + if [ $? -ne 0 ]; then + RETVAL=1 + return 1 + fi + + id=$(echo "$info" | awk '/^Id:/{print $2}') + + [ -n "$id" ] && [ "x$id" != x- ] && guest_running=true + return 0 +} + +started() { + touch "$VAR_SUBSYS_LIBVIRT_GUESTS" +} + +start() { + [ -f "$LISTFILE" ] || { started; return 0; } + + if [ "x$ON_BOOT" != xstart ]; then + echo $"libvirt-guests is configured not to start any guests on boot" + rm -f "$LISTFILE" + started + return 0 + fi + + while read uri list; do + configured=false + for confuri in $URIS; do + if [ $confuri = $uri ]; then + configured=true + break + fi + done + if ! $configured; then + echo $"Ignoring guests on $uri URI" + continue + fi + + echo $"Resuming guests on $uri URI..." + for guest in $list; do + name=$(guest_name $uri $guest) + echo -n $"Resuming guest $name: " + if guest_is_on $uri $guest; then + if $guest_running; then + echo $"already active" + else + retval run_virsh $uri start "$name" >/dev/null && \ + echo $"done" + fi + fi + done + done <"$LISTFILE" + + rm -f "$LISTFILE" + started +} + +suspend_guest() +{ + uri=$1 + guest=$2 + + name=$(guest_name $uri $guest) + label=$"Suspending $name: " + echo -n "$label" + run_virsh $uri managedsave $guest >/dev/null & + virsh_pid=$! + while true; do + sleep 1 + kill -0 $virsh_pid >&/dev/null || break + progress=$(run_virsh_c $uri domjobinfo $guest 2>/dev/null | \ + awk '/^Data processed:/{print $3, $4}') + if [ -n "$progress" ]; then + printf '\r%s%12s ' "$label" "$progress" + else + printf '\r%s%-12s ' "$label" "..." + fi + done + retval wait $virsh_pid && printf '\r%s%-12s\n' "$label" $"done" +} + +shutdown_guest() +{ + uri=$1 + guest=$2 + + name=$(guest_name $uri $guest) + label=$"Shutting down $name: " + echo -n "$label" + retval run_virsh $uri shutdown $guest >/dev/null || return + timeout=$SHUTDOWN_TIMEOUT + while [ $timeout -gt 0 ]; do + sleep 1 + timeout=$[timeout - 1] + guest_is_on $uri $guest || return + $guest_running || break + printf '\r%s%-12d ' "$label" $timeout + done + + if guest_is_on $uri $guest; then + if $guest_running; then + printf '\r%s%-12s\n' "$label" $"failed to shutdown in time" + else + printf '\r%s%-12s\n' "$label" $"done" + fi + fi +} + +stop() { + # last stop was not followed by start + [ -f "$LISTFILE" ] && return 0 + + suspending=true + if [ "x$ON_SHUTDOWN" = xshutdown ]; then + suspending=false + if [ $SHUTDOWN_TIMEOUT -le 0 ]; then + echo $"Shutdown action requested but SHUTDOWN_TIMEOUT was not set" + RETVAL=6 + return + fi + fi + + : >"$LISTFILE" + for uri in $URIS; do + echo -n $"Running guests on $uri URI: " + + if [ "x$uri" = xdefault ] && [ ! -x "$libvirtd" ]; then + echo $"libvirtd not installed; skipping this URI." + continue + fi + + list=$(list_guests $uri) + if [ $? -eq 0 ]; then + empty=true + for uuid in $list; do + $empty || printf ", " + echo -n $(guest_name $uri $uuid) + empty=false + done + if $empty; then + echo $"no running guests." + else + echo + echo $uri $list >>"$LISTFILE" + fi + fi + done + + while read uri list; do + if $suspending; then + echo $"Suspending guests on $uri URI..." + else + echo $"Shutting down guests on $uri URI..." + fi + + for guest in $list; do + if $suspending; then + suspend_guest $uri $guest + else + shutdown_guest $uri $guest + fi + done + done <"$LISTFILE" + + rm -f "$VAR_SUBSYS_LIBVIRT_GUESTS" +} + +gueststatus() { + for uri in $URIS; do + echo "* $uri URI:" + retval run_virsh $uri list || echo + done +} + +# rh_status +# Display current status: whether saved state exists, and whether start +# has been executed. We cannot use status() from the functions library, +# since there is no external daemon process matching this init script. +rh_status() { + if [ -f "$LISTFILE" ]; then + echo $"stopped, with saved guests" + RETVAL=3 + else + if [ -f "$VAR_SUBSYS_LIBVIRT_GUESTS" ]; then + echo $"started" + else + echo $"stopped, with no saved guests" + fi + RETVAL=0 + fi +} + +# usage [val] +# Display usage string, then exit with VAL (defaults to 2). +usage() { + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|gueststatus|shutdown}" + exit ${1-2} +} + +# See how we were called. +if test $# != 1; then + usage +fi +case "$1" in + --help) + usage 0 + ;; + start|stop|gueststatus) + $1 + ;; + restart) + stop && start + ;; + condrestart|try-restart) + [ -f "$VAR_SUBSYS_LIBVIRT_GUESTS" ] && stop && start + ;; + reload|force-reload) + # Nothing to do; we reread configuration on each invocation + ;; + status) + rh_status + ;; + shutdown) + ON_SHUTDOWN=shutdown + stop + ;; + *) + usage + ;; +esac +exit $RETVAL diff --git a/tools/libvirt-guests.sysconf b/tools/libvirt-guests.sysconf new file mode 100644 index 0000000..cd58728 --- /dev/null +++ b/tools/libvirt-guests.sysconf @@ -0,0 +1,24 @@ +# URIs to check for running guests +# example: URIS='default xen:/// vbox+tcp://host/system lxc:///' +#URIS=default + +# action taken on host boot +# - start all guests which were running on shutdown are started on boot +# regardless on their autostart settings +# - ignore libvirt-guests init script won't start any guest on boot, however, +# guests marked as autostart will still be automatically started by +# libvirtd +#ON_BOOT=start + +# action taken on host shutdown +# - suspend all running guests are suspended using virsh managedsave +# - shutdown all running guests are asked to shutdown. Please be careful with +# this settings since there is no way to distinguish between a +# guest which is stuck or ignores shutdown requests and a guest +# which just needs a long time to shutdown. When setting +# ON_SHUTDOWN=shutdown, you must also set SHUTDOWN_TIMEOUT to a +# value suitable for your guests. +#ON_SHUTDOWN=suspend + +# number of seconds we're willing to wait for a guest to shut down +#SHUTDOWN_TIMEOUT=0 -- 1.7.2.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list