#!/bin/bash

#
# Init file for Baidu cloud monitor agent
#
### BEGIN INIT INFO
# Provides:          bcm-agent
# Required-Start:    $local_fs $syslog
# Required-Stop:     $local_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Baidu cloud monitor agent
# Description:       Baidu cloud monitor(BCM) agent which collect system metrics.
### END INIT INFO

export PATH='/usr/sbin:/usr/bin:/sbin:/bin'

help() {
    echo "${0} <start|stop|restart|status>"
    exit 1
}

die() {
    echo "[FAILED] $@"
    exit 1
}

ok() {
    echo "[OK] $@"
}

run() {
  # 100M
  ulimit -m 100000
  ulimit -c 0

  nice_prefix=""
  type nice >/dev/null && nice_prefix="nice -n 19 "

  core_num="$(cat /proc/cpuinfo | grep processor | wc -l)"
  last_core="$((${core_num} - 1))"
  taskset_prefix=""
  type taskset >/dev/null
  [ $? -eq 0 -a $core_num -gt 1 ] && taskset_prefix="taskset -c 1-$last_core "

  (eval "$nice_prefix $taskset_prefix $@" >/dev/null </dev/null 2>&1 &)
}

signal() {
    pgrep -u 0 '^bcm-agent.upgra$' | xargs kill -9
    pgrep -u 0 '^bcm-.i$' | xargs kill -9 1>/dev/null 2>&1
    return $?
}

check() {
    pgrep -u 0 '^bcm-agent.upgra$' >/dev/null
    return $?
}

start() {
    [ -x '/opt/avalokita/bin/avalokita' ] || {
        die 'Please install avalokita first.'
    }

    [ -d '/opt/bcm-agent/var/lib/bcm-agent' ] || {
        die 'Please reinstall bcm-agent.'
    }

    [ -x '/opt/bcm-agent/var/lib/bcm-agent/bcm-agent.upgrader' ] || {
        ln -sf /opt/avalokita/bin/avalokita /opt/bcm-agent/var/lib/bcm-agent/bcm-agent.upgrader
    }

    check
    if [ $? -eq 0 ]; then
        ok 'Running'
        return 0
    fi

    cd /opt/bcm-agent/var/lib/bcm-agent/
    run "/opt/bcm-agent/var/lib/bcm-agent/bcm-agent.upgrader \
        --update-url=http://download.bcm.baidubce.com/packages/collectd-bcm-v2-$(uname -m).sh \
        --signature-url=http://download.bcm.baidubce.com/packages/collectd-bcm-v2-$(uname -m).sh.sig \
        --certificate='/opt/bcm-agent/var/lib/bcm-agent/cert.pem' \
        --max-executable-size=31457280 \
        /opt/bcm-agent/var/lib/bcm-agent/collectd-bcm-v2-$(uname -m).sh"

    sleep 1
    check || die 'start'
    ok 'start'
    return 0
}

stop() {
    check
    if [ $? -ne 0 ]; then
        ok 'Not running'
        return 0
    fi

    for i in 1 2 3 4 5 6 7 8; do
        signal
        sleep $i
        check
        if [ $? -ne 0 ]; then
            ok 'stop'
            return 0
        fi
    done
    die 'stop'
}

restart() {
    stop
    start
    return 0
}

status() {
    check
    if [ $? -eq 0 ]; then
        echo 'Running'
        return 0
    else
        echo 'Not running'
        return 1
    fi
}

[ "$(id -u)" = 0 ] || {
    die Please run with root.
}

case "${1}" in
start)
    start
    ;;
stop)
    stop
    ;;
restart)
    restart
    ;;
status)
    status
    ;;
*)
    help
    ;;
esac
