#!/bin/bash

#
# Version:  2.0.7
#

# Global vars / etc
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
LOGFILE="/var/log/seedbox-cp.log"
SPOOL_DIR="/var/www/spool/seedbox-cp-qmgr"
IN_DIR="${SPOOL_DIR}/IN"
OUT_DIR="${SPOOL_DIR}/OUT"
LOCKFILE="${SPOOL_DIR}/.lock"
CMD_FILE="cmd"
OUT_FILE="${OUT_DIR}/out"

SC_NAME="$( basename "${0}" )"
_VER="$( grep -m 1 -E '^#\s*Version:\s+' "${0}" | awk '{print $NF}' )"

systemd-notify --ready --status="${SC_NAME} ${_VER}: Watching: [${IN_DIR}/]"

for _f in "${OUT_FILE}" ; do
    if [ ! -f "${_f}" ] ; then
        _u="$( stat -c '%U' "${SPOOL_DIR}" )"
        touch "${_f}"
        chown "${_u}" "${_f}"
        chmod 600 "${_f}"
    fi
done

while read _dir _action _file ; do
    systemd-notify --status="${_dir}${_file} arrived (${_action})"
    if [ "${_file}" != "${CMD_FILE}" ] ; then
        systemd-notify --status="[${_file}]: not valid: $( rm -vf "${_dir}${_file}" )"
        continue
    fi
    CMD="$( head -1 "${IN_DIR}/${CMD_FILE}" )"
    if [ -z "${CMD}" ] ; then
        systemd-notify --status="[${_file}]: empty command"
        continue
    fi
    echo "$( date ): DBG: [${CMD}]" >> "${LOGFILE}"
    (
    if ! flock -n 9 ; then
        systemd-notify --status="[${CMD}]: another operation is in progress"
        exit 1
    fi
    echo -n "" > "${OUT_FILE}"

    _app="$( echo "${CMD}"  | awk -F'|' '{print $1}' | tr '[:upper:]' '[:lower:]' )"
    _svc="$( echo "${CMD}"  | awk -F'|' '{print $2}' | tr '[:upper:]' '[:lower:]' )"
    _cmd="$( echo "${CMD}"  | awk -F'|' '{print $3}' | tr '[:upper:]' '[:lower:]' )"
    _args="$( echo "${CMD}" | awk -F'|' '{print $4}' )"

    case "${_app}" in
      "seedbox-cp")
          cat <<-EOF >> "${LOGFILE}"
		$( date ):
		_app:    [${_app}]
		_svc:    [${_svc}]
		_cmd:    [${_cmd}]
		_args:   [${_args}]
		EOF
          _rc=0
          case "${_cmd}" in
             "status"|"restart"|"start"|"stop"|"enable"|"disable"|"monitor"|"unmonitor"|"list"\
            |"reset"|"claim"\
            |"root-enable"|"root-disable"|"root-key-add"|"root-key-del"\
             )
                ;;
            *)
                _rc="$(( _rc + 1 ))"
                ;;
          esac
          case "${_svc}" in
             "all"\
            |"apache"|"autodl"|"btsync"|"cherrymusic"|"cloudcmd"|"couchpotato"|"deluged"|"delugeweb"\
            |"docker"|"emby"|"filecommander"|"flood"|"ftpd"|"jackett"|"jellyfin"|"madsonic"|"mysql"\
            |"nomachine"|"nzbget"|"openvpn"|"plex"|"plexpy"|"pyload"|"qbittorrent"|"resiliosync"\
            |"rtorrent"|"sabnzbd"|"sickbeard"|"sickrage"|"softethervpn"|"ssh"|"subsonic"\
            |"syncthing"|"tautulli"|"thinlincweb"|"transmission"|"utorrent"|"vnc"|"xrdp"\
             )
                ;;
            *)
                _rc="$(( _rc + 1 ))"
                ;;
          esac
          case "${_cmd}" in
            "root-enable"|"root-disable"|"root-key-add"|"root-key-del")
                if [ "${_svc}" != "ssh" ] ; then
                    _rc="$(( _rc + 1 ))"
                fi
                ;;
            "reset"|"claim")
                if [ "${_svc}" != "plex" ] ; then
                    _rc="$(( _rc + 1 ))"
                fi
                ;;
          esac
          if [ "${_rc}" = "0" ] ; then
              if [ -z "${_args}" ] ; then
                  seedbox-cp -s "${_svc}" -a "${_cmd}" > "${OUT_FILE}"
              else
                  seedbox-cp -s "${_svc}" -a "${_cmd}" -e "${_args}" > "${OUT_FILE}"
              fi
          else
              echo "$( date ): (EE): Invalid data: [${CMD}]" >> "${LOGFILE}"
              cat <<-EOF > "${OUT_FILE}"
		{
		  "result": "error (${_rc})",
		  "message": "Invalid data: [${CMD}]"
		}
		EOF
          fi
          ;;
      *)
          echo "$( date ): (EE): Invalid data: [${CMD}]" >> "${LOGFILE}"
          cat <<-EOF > "${OUT_ERR_FILE}"
		{
		  "result": "error",
		  "message": "Invalid application: [${_app}]"
		}
		EOF
          ;;
    esac
    # Cleanup
    rm -vf "${IN_DIR}/${CMD_FILE}" >> "${LOGFILE}" 2>&1
    ) 9> "${LOCKFILE}"
    flock -w 1 "${LOCKFILE}" rm -vf "${LOCKFILE}" >> "${LOGFILE}" 2>&1
done < <( inotifywait -m -e close_write "${IN_DIR}/" )

exit 0
