X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-xen-config.git/blobdiff_plain/57a29a823f478cf8ad7d86d3749093d702c25224..a6fc4d186a63ed3c372d217a878f5e1d7aca8734:/debian/invirt-xen-config.init diff --git a/debian/invirt-xen-config.init b/debian/invirt-xen-config.init old mode 100644 new mode 100755 index 857497d..567d7d2 --- a/debian/invirt-xen-config.init +++ b/debian/invirt-xen-config.init @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash ### BEGIN INIT INFO # Provides: invirt-xen-config # Required-Start: $local_fs $remote_fs @@ -9,14 +9,89 @@ # Description: ### END INIT INFO -set -e +PACKAGE=invirt-xen-config +NAME="$PACKAGE" +DESC="Invirt Xen host" +PARENTPACKAGE=xend +SYSVM_TEMPLATES=(/etc/xen/sysvms/s_*.mako) +SYSVM_FILES=("${SYSVM_TEMPLATES[@]/.mako/}") +SYSVMS=("${SYSVM_FILES[@]/#\/etc\/xen\/sysvms\/}") +GEN_FILES=(/etc/xen/xend-config.sxp.invirt "${SYSVM_FILES[@]}") -case $1 in - start) +dpkg -s "$PACKAGE" >/dev/null 2>/dev/null || exit 0 + +. /lib/init/gen-files.sh +. /lib/init/std-init.sh + +start_sysvm() { + # Attempt to start a sysvm, but only if it's not running already + # somewhere on the cluster + + VM="$1" + LV="${VM}_hda" + DISK="/dev/xenvg/$LV" + + # Don't bother trying to start the VM if it's already running + if xm list "$VM" >/dev/null 2>&1; then + return 1 + fi + + RET=1 + # To keep multiple hosts from trying to start a VM at the same + # time, lock VM creation at startup-time with a lock LV, since LV + # creation is atomic + if lvcreate -L 1K -n "lock_${LV}" xenvg >/dev/null 2>&1; then + # If we can disable the LV, then the VM isn't already running + # somewhere else + if lvchange -a n "$DISK" >/dev/null 2>&1; then + lvchange -a y "$DISK" >/dev/null 2>&1 + + [ "$VERBOSE" != no ] && log_daemon_msg "Starting sysvm $VM" + xm create "sysvms/$VM" >/dev/null + [ "$VERBOSE" != no ] && log_end_msg $? + RET=0 + fi + + # Regardless of whether we could get the lock or not, the + # lvchange -a n probably disabled the LV somewhere; be sure we + # clean up + lvchange -a y "$DISK" >/dev/null 2>&1 + + # Cleanup the lock, regardless of whether we started the LV + lvchange -a n "/dev/xenvg/lock_${LV}" >/dev/null 2>&1 + lvchange -a ey "/dev/xenvg/lock_${LV}" >/dev/null 2>&1 + lvremove -f "/dev/xenvg/lock_${LV}" >/dev/null 2>&1 + fi + + return $RET +} + +do_startup() { + gen_files + + for vm in "${SYSVMS[@]}"; do + start_sysvm "$vm" + done + echo 1 >/proc/sys/net/ipv4/ip_forward - for foo in all default; do - echo 1 >/proc/sys/net/ipv4/conf/$foo/rp_filter - echo 1 >/proc/sys/net/ipv4/conf/$foo/proxy_arp + for i in all default; do + echo 1 >/proc/sys/net/ipv4/conf/$i/rp_filter + echo 1 >/proc/sys/net/ipv4/conf/$i/proxy_arp done - ;; - esac + + invoke-rc.d "$PARENTPACKAGE" "$1" +} + +do_start() { + do_startup "start" +} + +do_reload() { + do_startup "reload" +} + +do_stop() { + invoke-rc.d "$PARENTPACKAGE" stop +} + +std_init "$1"