summaryrefslogtreecommitdiffstats
path: root/network/dnscrypt-proxy/rc.dnscrypt-proxy
blob: fd747759d1371733d487c45132c5f05da1364c07 (plain)
#!/bin/bash

CONFIGFILE="/etc/default/dnscrypt-proxy"
DAEMON="/usr/sbin/dnscrypt-proxy"

. $CONFIGFILE

start_instance() {
    if [ ! -r ${DNSCRYPTCONFIG[$1]} ]; then
        echo "No configuration for instance $1 found!"
        return
    fi
    PIDFILE=$(grep -i "^[[:space:]]*PidFile[[:space:]]\+." ${DNSCRYPTCONFIG[$1]} | awk '{print $2}')
    if [ -z ${PIDFILE} ]; then
        echo "No PID configuration for instance $1 found!"
        return
    fi
    if [ -r ${PIDFILE} ]; then
        echo "dnscrypt-proxy (instance $1) already running!"
        return
    fi

    # dnscrypt-proxy will work without this, but it drops privileges before
    # seeding the PRNG. libevent tries to work around a missing /dev/urandom
    # but it's safer just to make sure it is available in the chroot.
    if [ -n "${CHROOTDIR[$1]}" ]; then
        if [ "$(readlink -f ${CHROOTDIR[$1]})" != "/" ]; then
            if [ ! -d ${CHROOTDIR[$1]} ]; then
                mkdir -p ${CHROOTDIR[$1]}
                chmod 755 ${CHROOTDIR[$1]}
            fi
            if [ ! -d ${CHROOTDIR[$1]}/dev ]; then
                mkdir -p ${CHROOTDIR[$1]}/dev
                chmod 755 ${CHROOTDIR[$1]}/dev
            fi
            if [ ! -c ${CHROOTDIR[$1]}/dev/urandom ]; then
                mknod -m 666 ${CHROOTDIR[$1]}/dev/urandom c 1 9
            fi
            if [ ! -c ${CHROOTDIR[$1]}/dev/random ]; then
                mknod -m 666 ${CHROOTDIR[$1]}/dev/random c 1 8
            fi
        fi
    fi

    $DAEMON ${DNSCRYPTCONFIG[$1]}
}

stop_instance() {
    if [ ! -r ${DNSCRYPTCONFIG[$1]} ]; then
        echo "No configuration for instance $1 found!"
        return
    fi
    PIDFILE=$(grep -i "^[[:space:]]*PidFile[[:space:]]\+." ${DNSCRYPTCONFIG[$1]} | awk '{print $2}')
    if [ -z ${PIDFILE} ]; then
        echo "No PID configuration for instance $1 found!"
        return
    fi
    if [ ! -r ${PIDFILE} ]; then
        echo "dnscrypt-proxy (instance $1) is not running!"
        return
    fi
    echo "Stopping dnscrypt-proxy (instance $1)..."
    kill $(cat ${PIDFILE})
}

status_instance() {
    if [ ! -r ${DNSCRYPTCONFIG[$1]} ]; then
        echo "No configuration for instance $1 found!"
        return
    fi
    PIDFILE=$(grep -i "^[[:space:]]*PidFile[[:space:]]\+." ${DNSCRYPTCONFIG[$1]} | awk '{print $2}')
    if [ -z ${PIDFILE} ]; then
        echo "No PID configuration for instance $1 found!"
        return
    fi
    if [ ! -r ${PIDFILE} ]; then
        echo "dnscrypt-proxy (instance $1) is not running."
        return
    fi
    PID=$(cat ${PIDFILE})
    if [ -z "$PID" ]; then
        echo "PID file is empty! dnscrypt-proxy (instance $1) does not appear to be running, but there is a stale PID file."
    elif kill -0 $PID ; then
        echo "dnscrypt-proxy (instance $1) is running."
    else
        echo "dnscrypt-proxy (instance $1) is not running, but there is a stale PID file."
    fi
}

start() {
    for i in `/usr/bin/seq 0 $((${#DNSCRYPTCONFIG[@]}-1))`
    do
        start_instance $i
    done
}

stop() {
    for i in `/usr/bin/seq 0 $((${#DNSCRYPTCONFIG[@]}-1))`
    do
        stop_instance $i
    done
}

status() {
    for i in `/usr/bin/seq 0 $((${#DNSCRYPTCONFIG[@]}-1))`
    do
        status_instance $i
    done
}

case "$1" in
    'start')
        start
        ;;
    'stop')
        stop
        ;;
    'restart')
        stop
        start
        ;;
    'status')
        status
        ;;
    *_start)
        INSTANCE=`echo $1 | /bin/cut -d '_' -f 1`
        start_instance $INSTANCE
        ;;
    *_stop)
        INSTANCE=`echo $1 | /bin/cut -d '_' -f 1`
        stop_instance $INSTANCE
        ;;
    *_restart)
        INSTANCE=`echo $1 | /bin/cut -d '_' -f 1`
        stop_instance $INSTANCE
        sleep 1
        start_instance $INSTANCE
        ;;
    *_status)
        INSTANCE=`echo $1 | /bin/cut -d '_' -f 1`
        status_instance $INSTANCE
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status|#_start|#_stop|#_restart}"
        exit 1
        ;;
esac