telegram-bot-bash/modules/background.sh

170 lines
4.5 KiB
Bash
Raw Normal View History

2019-04-24 08:07:46 +00:00
#!/bin/bash
# file: modules/background.sh
# do not edit, this file will be overwritten on update
# This file is public domain in the USA and all free countries.
# Elsewhere, consider it to be WTFPLv2. (wtfpl.net/txt/copying)
#
2020-11-29 14:34:00 +00:00
# shellcheck disable=SC1117
2020-11-30 17:38:19 +00:00
#### $$VERSION$$ v1.2-0-gc50499c
2019-04-24 08:07:46 +00:00
2020-06-14 18:56:46 +00:00
# will be automatically sourced from bashbot
2019-04-24 08:07:46 +00:00
2020-05-14 17:47:37 +00:00
# source once magic, function named like file
eval "$(basename "${BASH_SOURCE[0]}")(){ :; }"
2019-04-24 08:07:46 +00:00
######
# interactive and background functions
2019-05-18 18:25:18 +00:00
# old syntax as aliases
2019-04-24 08:07:46 +00:00
background() {
2019-05-18 18:25:18 +00:00
start_back "${CHAT[ID]}" "$1" "$2"
2019-04-24 08:07:46 +00:00
}
startproc() {
2019-05-18 18:25:18 +00:00
start_proc "${CHAT[ID]}" "$1" "$2"
}
checkback() {
check_back "${CHAT[ID]}" "$1"
}
checkproc() {
check_proc "${CHAT[ID]}" "$1"
}
killback() {
kill_back "${CHAT[ID]}" "$1"
}
killproc() {
kill_proc "${CHAT[ID]}" "$1"
}
2020-06-23 14:35:50 +00:00
# inline and background functions
2019-05-18 18:25:18 +00:00
# $1 chatid
# $2 program
# $3 jobname
2020-06-06 21:01:11 +00:00
# $4 $5 parameters
2019-05-18 18:25:18 +00:00
start_back() {
2020-06-18 10:39:07 +00:00
local cmdfile; cmdfile="${DATADIR:-.}/$(procname "$1")$3-back.cmd"
printf '%s\n' "$1:$3:$2" >"${cmdfile}"
2020-06-06 21:01:11 +00:00
restart_back "$@"
}
restart_back() {
2020-06-07 07:10:02 +00:00
local fifo; fifo="${DATADIR:-.}/$(procname "$1" "back-$3-")"
2020-07-04 06:56:58 +00:00
printf "%s: Start background job CHAT=%s JOB=%s CMD=%s\n" "$(date)" "${1}" "${fifo##*/}" "${2##*/} ${4} ${5}" >>"${UPDATELOG}"
2020-06-20 08:16:12 +00:00
check_back "$1" "$3" && kill_proc "$1" "back-$3-"
2020-06-07 07:10:02 +00:00
nohup bash -c "{ $2 \"$4\" \"$5\" \"${fifo}\" | \"${SCRIPT}\" outproc \"${1}\" \"${fifo}\"; }" &>>"${fifo}.log" &
2020-06-22 12:10:36 +00:00
sleep 0.5 # give bg job some time to init
2019-05-18 18:25:18 +00:00
}
# $1 chatid
# $2 program
# $3 $4 parameters
2019-05-18 18:25:18 +00:00
start_proc() {
[ -z "$2" ] && return
[ -x "${2%% *}" ] || return 1
local fifo; fifo="${DATADIR:-.}/$(procname "$1")"
2020-06-20 08:16:12 +00:00
printf "%s: Start interacitve script CHAT=%s JOB=%s CMD=%s\n" "$(date)" "${1}" "${fifo##*/}" "${2} ${3} ${4}" >>"${UPDATELOG}"
check_proc "$1" && kill_proc "$1"
2019-05-18 19:06:29 +00:00
mkfifo "${fifo}"
nohup bash -c "{ $2 \"$4\" \"$5\" \"$fifo\" | \"${SCRIPT}\" outproc \"${1}\" \"${fifo}\"
rm \"${fifo}\"; [ -s \"${fifo}.log\" ] || rm -f \"${fifo}.log\"; }" &>>"${fifo}.log" &
2019-04-24 08:07:46 +00:00
}
2019-05-18 18:25:18 +00:00
# $1 chatid
# $2 jobname
check_back() {
check_proc "$1" "back-$2-"
2019-04-24 08:07:46 +00:00
}
2019-05-18 18:25:18 +00:00
# $1 chatid
# $2 prefix
check_proc() {
[ -n "$(proclist "$(procname "$1" "$2")")" ]
# shellcheck disable=SC2034
res=$?; return $?
2019-04-24 08:07:46 +00:00
}
2019-05-18 18:25:18 +00:00
# $1 chatid
# $2 jobname
kill_back() {
kill_proc "$1" "back-$2-"
2019-05-28 18:44:40 +00:00
rm -f "${DATADIR:-.}/$(procname "$1")$2-back.cmd"
2019-04-24 08:07:46 +00:00
}
2019-05-18 18:25:18 +00:00
# $1 chatid
# $2 prefix
kill_proc() {
2019-05-19 10:54:59 +00:00
local fifo prid
fifo="$(procname "$1" "$2")"
prid="$(proclist "${fifo}")"
2019-05-28 18:44:40 +00:00
fifo="${DATADIR:-.}/${fifo}"
2020-06-20 08:16:12 +00:00
printf "%s: Stop interacitve / background CHAT=%s JOB=%s\n" "$(date)" "${1}" "${fifo##*/}" >>"${UPDATELOG}"
2019-05-19 10:54:59 +00:00
# shellcheck disable=SC2086
[ -n "${prid}" ] && kill ${prid}
2019-05-18 19:06:29 +00:00
[ -s "${fifo}.log" ] || rm -f "${fifo}.log"
[ -p "${fifo}" ] && rm -f "${fifo}";
2019-04-24 08:07:46 +00:00
}
# $1 chatid
2019-05-18 18:25:18 +00:00
# $2 message
send_interactive() {
2019-05-28 18:44:40 +00:00
local fifo; fifo="${DATADIR:-.}/$(procname "$1")"
[ -p "${fifo}" ] && printf '%s\n' "$2" >"${fifo}" & # not blocking!
}
# old style but may not work because of local checks
inproc() {
send_interactive "${CHAT[ID]}" "${MESSAGE[0]}"
2019-04-24 08:07:46 +00:00
}
2020-06-23 14:35:50 +00:00
# start stop all jobs
# $1 command
# killb*
# suspendb*
# resumeb*
job_control() {
local BOT ADM content proc CHAT job fifo killall=""
BOT="$(getConfigKey "botname")"
ADM="$(getConfigKey "botadmin")"
2020-07-04 07:18:28 +00:00
debug_checks "Enter job_control" "${1}"
2019-05-28 18:44:40 +00:00
for FILE in "${DATADIR:-.}/"*-back.cmd; do
[ "${FILE}" = "${DATADIR:-.}/*-back.cmd" ] && echo -e "${RED}No background processes.${NC}" && break
content="$(< "${FILE}")"
CHAT="${content%%:*}"
job="${content#*:}"
proc="${job#*:}"
2020-06-06 21:01:11 +00:00
job="${job%:*}"
fifo="$(procname "${CHAT}" "${job}")"
2020-07-04 07:18:28 +00:00
debug_checks "Execute job_control" "${1}" "${FILE##*/}"
case "$1" in
"resumeb"*|"backgr"*)
printf "Restart Job: %s %s\n" "${proc}" " ${fifo##*/}"
2020-06-06 21:01:11 +00:00
restart_back "${CHAT}" "${proc}" "${job}"
# inform botadmin about stop
[ -n "${ADM}" ] && send_normal_message "${ADM}" "Bot ${BOT} restart background jobs ..." &
;;
"suspendb"*)
printf "Suspend Job: %s %s\n" "${proc}" " ${fifo##*/}"
kill_proc "${CHAT}" "${job}"
# inform botadmin about stop
[ -n "${ADM}" ] && send_normal_message "${ADM}" "Bot ${BOT} suspend background jobs ..." &
killall="y"
;;
"killb"*)
printf "Kill Job: %s %s\n" "${proc}" " ${fifo##*/}"
kill_proc "${CHAT}" "${job}"
rm -f "${FILE}" # remove job
# inform botadmin about stop
[ -n "${ADM}" ] && send_normal_message "${ADM}" "Bot ${BOT} kill background jobs ..." &
killall="y"
;;
esac
# send message only onnfirst job
ADM=""
done
2020-06-28 06:52:02 +00:00
debug_checks "end job_control" "${1}"
# kill all requestet. kill ALL background jobs, even not listed in data-bot-bash
[ "${killall}" = "y" ] && killallproc "back-"
}