#!/system/bin/sh

# Set the main directory for things to run (if changed, also change in cjdctl and 99cjdroute)
CJDPATH="/sdcard/cjdns"

# Function to output status messages and log if configured to do so
logmessage() {
    if [ -n "$CJDLOG" ]; then
        echo "$(date) - $1" >> "$CJDPATH"/cjdaemon.log
    fi
}

die() { logmessage "$1"; exit 1; }

# Create the daemon folder if it doesn't exist
if [ ! -e "$CJDPATH" ]; then
    install -d "$CJDPATH" || die "Cannot install $CJDPATH"
fi

# Fail if the daemon is already running
if [ -f "$CJDPATH"/.cjdaemon.pid ]; then
    if [ -d "/proc/$(cat "$CJDPATH"/.cjdaemon.pid)" ]; then
        die "Daemon already running!"
    fi
fi

# Set a pid file for the daemon so we know what to kill if it starts causing issues
echo "$$" > "$CJDPATH"/.cjdaemon.pid

# Create cjdaemon.conf if it's missing
if [ ! -f "$CJDPATH"/cjdaemon.conf ]; then
    touch "$CJDPATH"/cjdaemon.conf ||
        die "Cannot create file $CJDPATH/cjdaemon.conf"

    printf 'CJDCFG="cjdroute.conf"\nCJLOG=0' \
        > "$CJDPATH"/cjdaemon.conf
fi

# Source cjdaemon.conf to load user settings
. "$CJDPATH"/cjdaemon.conf

# Set $CJDCFG to the default if it wasn't set by cjdaemon.conf
if [ -z "$CJDCFG" ]; then
    CJDCFG="cjdroute.conf"
fi

# Create the log if it doesn't exist, and if it can't be created disable logging
if [ -n "$CJDLOG" ]; then
    if [ ! -f "$CJDPATH"/cjdaemon.log ]; then
        touch "$CJDPATH"/cjdaemon.log \
            || unset CJDLOG
    fi
fi

# Function used to start cjdroute
cjdstart() {
    # Exit if the lock file is missing
    if [ ! -f "$CJDPATH"/.lock ]; then
        exit 0
    fi

    # Start cjdroute and output/log results
    if [ -f "${CJDPATH}/${CJDCFG}" ]; then
        if [ "$(pgrep cjdroute | wc -l)" -eq 0 ]; then
            LOGMSG="Running: cjdroute < ${CJDPATH}/${CJDCFG}..."
            cjdroute < "${CJDPATH}/${CJDCFG}" >/dev/null 2>&1
            sleep 1

            if [ "$(pgrep cjdroute | wc -l)" -gt 0 ]; then
                LOGMSG="${LOGMSG} Success!"
            else
                LOGMSG="${LOGMSG} Error! Failed to start cjdroute"
            fi
        else
            LOGMSG="${LOGMSG} Error! Failed to start cjdroute, already running"
        fi
    else
        LOGMSG="${LOGMSG} Error! Failed to start cjdroute, config missing @ ${CJDPATH}/${CJDCFG}"
    fi

    logmessage "$LOGMSG"
    unset LOGMSG
}

# Function used to stop cjdroute
cjdstop() {
    # Exit if the lock file is missing
    if [ ! -f "$CJDPATH"/.lock ]; then
        exit 0
    fi

    # Kill cjdroute and output/log results
    if [ "$(pgrep cjdroute | wc -l)" -gt 0 ]; then
        LOGMSG="Running: killall cjdroute..."
        killall cjdroute
        sleep 1

        if [ "$(pgrep cjdroute | wc -l)" -eq 0 ]; then
            LOGMSG="${LOGMSG} Success!"
        else
            LOGMSG="${LOGMSG} Error! Failed to stop cjdroute"
        fi
    else
        LOGMSG="${LOGMSG} Error! Failed to stop cjdroute, already stopped"
    fi

    logmessage "$LOGMSG"
    unset LOGMSG
}

# Run cjdstart when the phone wakes and cjdstop when it sleeps until the phone powers down
while :; do
    # Wait until the phone is awake, then start cjdroute
    cat /sys/power/wait_for_fb_wake > /dev/null
    cjdstart
    sleep 1

    # Wait until the phone sleeps, then stop cjdns
    cat /sys/power/wait_for_fb_sleep > /dev/null
    cjdstop
done
