#!/bin/bash
### BEGIN INIT INFO
# Provides:          invirt-xen-config
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Startup script for the Invirt Xen host
# Description:       
### END INIT INFO

PACKAGE=invirt-xen-config
NAME="$PACKAGE"
DESC="Invirt Xen host"
PARENTPACKAGE=xend
SYSVMS=(s_master s_remote s_console)
GEN_FILES=(/etc/xen/xend-config.sxp.invirt "${SYSVMS[@]/#//etc/xen/sysvms/}")

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"
    DISK="/dev/xenvg/${VM}_hda"
    
    # Don't bother trying to start the VM if it's already running
    if xm list "$1" >/dev/null 2>&1; then
        return 1
    fi
    
    if lvchange -a n "$DISK" >/dev/null 2>&1 && lvchange -a ey "$DISK" >/dev/null 2>&1; then
        # If we can disable and then re-enable the VMs disk, then the
        # VM can't be running. If the lvchange -a ey succeeds, then we
        # have an exclusive lock across the cluster on enabling the
        # disk, which avoids the potential race condition of two hosts
        # starting a VM at the same time
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting sysvm $VM"
        xm create "sysvms/$VM" >/dev/null
        [ "$VERBOSE" != no ] && log_end_msg $?
        RET=0
    else
        RET=1
    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
    
    return $RET
}

do_startup() {
    gen_files
    
    for vm in "${SYSVMS[@]}"; do
        start_sysvm "$vm"
    done
    
    echo 1 >/proc/sys/net/ipv4/ip_forward
    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
    
    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"
