File obsworker.sysvinit of Package obs-worker

#! /bin/sh
# Copyright (c) 2007-2011, SUSE Inc.
#
# Author: adrian@suse.de
#
# /etc/init.d/obsworker
#   and its symbolic  link
# /usr/sbin/rcobsworker
#
### BEGIN INIT INFO
# Provides:          obsworker
# Required-Start:    $time $network $syslog
# Required-Stop:     $time $network $syslog
# Should-Start:      $remote_fs obsstoragesetup obssrcserver obsrepserver xendomains
# Should-Stop:       $none
# Default-Start:     3 5
# Default-Stop:      0 1 2 4 6
# Description:       Open Build Service worker
### END INIT INFO

. /etc/rc.d/init.d/functions
function rc_reset ()
{
        _rc_status=0
        _rc_status_all=0
        rc_check
        return 0
}

function rc_check ()
{
        _rc_status_ret=$?
        test $_rc_status_ret -eq 0 || _rc_status=$_rc_status_ret
        test $_rc_status -eq 0 || _rc_status_all=$_rc_status
        return $_rc_check_ret
}

function rc_exit ()
{
        exit $_rc_status_all
}

if test -e /etc/sysconfig/proxy; then
  . /etc/sysconfig/proxy
fi
if test -e /etc/sysconfig/obs-server; then
  # optional on workers
  . /etc/sysconfig/obs-server
fi
# This file may still exist from OBS 2.1 and before.
if test -e /etc/sysconfig/obs-worker; then
. /etc/sysconfig/obs-worker
fi

# Determine the base and follow a runlevel link name.
base=${0##*/}
link=${base#*[SK][0-9][0-9]}

# Preconfigured by obsstoragesetup runlevel setup script
if [ -f /etc/buildhost.config ];then
    . /etc/buildhost.config
fi

if [ -z "$OBS_WORKER_DIRECTORY" ]; then
    OBS_WORKER_DIRECTORY="/var/cache/obs/worker"
fi
mkdir -p "$OBS_WORKER_DIRECTORY"

if [ -z "$OBS_RUN_DIR" ]; then
    OBS_RUN_DIR="/var/run/obs"
fi
if [ -z "$OBS_LOG_DIR" ]; then
    OBS_LOG_DIR="/var/log/obs"
fi
if [ -z "$OBS_REPO_SERVERS" ]; then
    OBS_REPO_SERVERS="localhost:5252"
fi

if [ -n "$OBS_WORKER_TEST_MODE" ]; then
    OBS_TEST="--test"
fi
if [ -n "$OBS_WORKER_JOBS" ]; then
    OBS_JOBS="--jobs $OBS_WORKER_JOBS"
fi
if [ -n "$OBS_WORKER_NICE_LEVEL" ]; then
    OBS_NICE=$OBS_WORKER_NICE_LEVEL
else
    OBS_NICE=18
fi

REPO_PARAM=
for i in $OBS_REPO_SERVERS; do
    REPO_PARAM="$REPO_PARAM --reposerver http://$i"
    WORKER_CODE="http://$i"
done

obsrundir="$OBS_RUN_DIR"
workerdir="$obsrundir"/worker
workerbootdir="$workerdir"/boot
screenrc="$workerdir"/boot/screenrc
OBS_WORKER_OPT=""

if [ -n "$OBS_CACHE_SIZE" -a -n "$OBS_CACHE_DIR" ]; then
    OBS_WORKER_OPT="--cachedir $OBS_CACHE_DIR"
    mkdir -p $OBS_CACHE_DIR
    OBS_WORKER_OPT="$OBS_WORKER_OPT --cachesize $OBS_CACHE_SIZE"
fi

if [ -n "$OBS_VM_KERNEL" -a "$OBS_VM_KERNEL" != "none" ] ; then
    if [ -n "$OBS_VM_INITRD" -a "$OBS_VM_INITRD" != "none" ] ; then
        OBS_WORKER_OPT="$OBS_WORKER_OPT --vm-kernel $OBS_VM_KERNEL  --vm-initrd $OBS_VM_INITRD"
    fi
fi

if [ -n "$OBS_WORKER_LOCALKIWI_DIRECTORY" ]; then
    OBS_WORKER_OPT="$OBS_WORKER_OPT --localkiwi $OBS_WORKER_LOCALKIWI_DIRECTORY --arch local"
fi

[ -z "$OBS_INSTANCE_MEMORY" ] && OBS_INSTANCE_MEMORY=256

vmopt=

if [ -n "$OBS_VM_TYPE" -a "$OBS_VM_TYPE" != "auto" ] ; then
    if [ "$OBS_VM_TYPE" != "none" ] ; then
        vmopt="--$OBS_VM_TYPE"
    fi
# At least on our ppc64le system we don't want this even though /dev/kvm exists
# elif [ -e /dev/kvm ] ; then
#     vmopt=--kvm
#     OBS_VM_TYPE="kvm"
elif [ -e /sys/hypervisor/type ] && grep -q xen /sys/hypervisor/type; then
    vmopt=--xen
    OBS_VM_TYPE="xen"
fi

if [ "$OBS_VM_TYPE" = "xen" -o "$OBS_VM_TYPE" = "kvm" ]; then
    # we start up in VM mode, check for the worker disk options
    if [ -n "$OBS_VM_DISK_AUTOSETUP_ROOT_FILESIZE" -a -n "$OBS_VM_DISK_AUTOSETUP_SWAP_FILESIZE" ]; then
        VMDISK_ROOT_FILESIZE="--vmdisk-rootsize ${OBS_VM_DISK_AUTOSETUP_ROOT_FILESIZE}"
        VMDISK_SWAP_FILESIZE="--vmdisk-swapsize ${OBS_VM_DISK_AUTOSETUP_SWAP_FILESIZE}"
        if [ -n "$OBS_VM_DISK_AUTOSETUP_FILESYSTEM" ]; then
            VMDISK_FILESYSTEM="--vmdisk-filesystem ${OBS_VM_DISK_AUTOSETUP_FILESYSTEM}"
        fi
        if [ -n "$OBS_VM_DISK_AUTOSETUP_MOUNT_OPTIONS" ]; then
            VMDISK_MOUNT_OPTIONS="--vmdisk-mount-options ${OBS_VM_DISK_AUTOSETUP_MOUNT_OPTIONS}"
        fi
    fi
fi

rc_reset
case "$1" in
    start)
        # reset screenrc
        mkdir -p "$obsrundir"
        chown obsrun:obsrun "$obsrundir"
        rm -rf "$workerdir"
        mkdir -p "$workerbootdir"
#        echo "zombie on"       > $screenrc
        echo "caption always" >> $screenrc

        if [ 0"$OBS_WORKER_INSTANCES" -gt 0 ]; then
            NUM="$OBS_WORKER_INSTANCES"
        else
            # start one build backend per CPU
            NUM=`ls -d /sys/devices/system/cpu/cpu[0-9]* | wc -l`
        fi

	# print some config data
        echo "Run $NUM obsworker using $OBS_WORKER_DIRECTORY"
        echo -n "Type of obsworker is "
	if [ "--kvm" == "$vmopt" ]; then echo "KVM virtual machine"
	elif [ "--xen" == "$vmopt" ]; then echo "XEN virtual machine"
	else  echo "chroot"
	fi

        # find SLP announced OBS servers
        if [ "$OBS_USE_SLP" == "yes" ]; then
            for i in `slptool findsrvs service:obs.repo_server | sed -n 's/service:obs.repo_server:\([^,]*\),.*/\1/p'`; do
                [ "${i#http://localhost}" != "$i" ] && continue
                [ "${i#http://127.}" != "$i" ] && continue
                REPO_PARAM="$REPO_PARAM --reposerver $i"
                # any of them should be okay
                WORKER_CODE="$i"
            done
        fi

        # fetch worker sources from server
        echo "Fetching initial worker code from $WORKER_CODE"
        mkdir -p "$workerbootdir"
        pushd "$workerbootdir" > /dev/null
        curl -s "$WORKER_CODE"/getworkercode | cpio --quiet --extract 
        ln -s . XML 
        chmod 755 bs_worker
        popd > /dev/null

        OBS_WORKER_OPT1="$OBS_WORKER_OPT"
        I=0
        while test "$NUM" -gt "$I"; do
            if [ 0"$OBS_WORKER_PORTBASE" -gt 0 ]; then
                port="--port $((OBS_WORKER_PORTBASE + I))"
            else
                port=""
            fi
            I=$(( $I + 1 ))
            title="$HOSTNAME/$I"
            R=$OBS_WORKER_DIRECTORY/root_$I
            # prepare obsworker startup in screen...
            TMPFS=
            if [ -n "$vmopt" -a "$OBS_VM_TYPE" = "xen" -o "$OBS_VM_TYPE" = "kvm" ]; then
                mkdir -p $R
                DEVICE="$OBS_WORKER_DIRECTORY/root_$I/root"
                SWAP="$OBS_WORKER_DIRECTORY/root_$I/swap"
                if [ -n "$OBS_VM_DISK_AUTOSETUP_ROOT_FILESIZE" -a -n "$OBS_VM_DISK_AUTOSETUP_SWAP_FILESIZE" ]; then
                    OBS_WORKER_OPT="$OBS_WORKER_OPT1 $VMDISK_AUTOSETUP $VMDISK_ROOT_FILESIZE $VMDISK_SWAP_FILESIZE $VMDISK_FILESYSTEM $VMDISK_MOUNT_OPTIONS"
                elif [ ! -e "$DEVICE" -o ! -e "$SWAP" ]; then
                        echo "ERROR: worker is configured to use a VM, but one or all of the following devices/files do not exist: $DEVICE, $SWAP"
                        exit 1
                fi
                if [ -n "$OBS_VM_USE_TMPFS" ]; then
                    TMPFS="--tmpfs"
                fi
                DEVICE="--device $DEVICE"
                SWAP="--swap $SWAP"
                MEMORY="--vm-memory $OBS_INSTANCE_MEMORY"
            else
                mkdir -p $R
                DEVICE=
                SWAP=
                MEMORY=
            fi
	    echo "screen -t $title nice -n $OBS_NICE ./bs_worker $vmopt $port --root $R" \
                "--statedir $workerdir/$I --id $HOSTNAME/$I $REPO_PARAM" \
                "$OBS_JOBS $OBS_TEST $OBS_WORKER_OPT $TMPFS $DEVICE $SWAP $MEMORY" \
                >> $screenrc
	    mkdir -p $workerdir/$I
        done
        pushd "$workerbootdir" > /dev/null
        screen -m -d -c $screenrc
        popd > /dev/null
    ;;
    stop)
        echo "Shutting down obsworker"
        for I in "$workerdir"/*; do
	    test -d "$I" || continue
	    test -e "$I/state" || continue
	    pushd "$workerbootdir" > /dev/null
	    ./bs_worker --statedir "$I" --exit &
	    popd > /dev/null
        done
	wait
        killall bs_worker 2>/dev/null
        sleep 2
        killall -s 9 bs_worker 2>/dev/null
        status bs_worker
    ;;
    restart)
        ## If first returns OK call the second, if first or
        ## second command fails, set echo return value.
        $0 stop
        $0 start
        status bs_worker
    ;;
    try-restart)
        $0 status
        if test $? = 0; then
            $0 restart
        else
            rc_reset        # Not running is not a failure.
        fi
        # Remember status and be quiet
        status bs_worker
    ;;
    reload)
    ;;
    status)
        echo "Checking for obsworker: "
        status bs_worker
    ;;
    *)
        echo "Usage: $0 {start|stop|status|try-restart|restart|reload}"
        exit 1
    ;;
esac
rc_exit