From 12579c87126f80869c5ca247ac79cd7614f5935f Mon Sep 17 00:00:00 2001 From: dcoomber <47242934+dcoomber@users.noreply.github.com> Date: Sat, 26 Sep 2020 19:52:06 +0200 Subject: [PATCH 01/17] Cosmetic updates to spelling and indentation --- bashbot.sh | 142 ++++++++++++++++++++++++++--------------------------- db.json | 2 +- 2 files changed, 72 insertions(+), 72 deletions(-) diff --git a/bashbot.sh b/bashbot.sh index b7d3c35..825dd7e 100755 --- a/bashbot.sh +++ b/bashbot.sh @@ -21,7 +21,7 @@ # - 4 unknown command # - 5 cannot connect to telegram bot # - 6 mandatory module not found -# - 6 can't get bottoken +# - 7 can't get bottoken # shellcheck disable=SC2140,SC2031,SC2120,SC1091 # are we running in a terminal? @@ -130,7 +130,7 @@ fi ADDONDIR="${BASHBOT_ETC:-.}/addons" RUNUSER="${USER}" # USER is overwritten by bashbot array :-(, save original -# OK everything setup, lest start +# OK everything setup, lets start if [[ -z "${SOURCE}" && -z "$BASHBOT_HOME" ]] && ! cd "${RUNDIR}" ; then echo -e "${RED}ERROR: Can't change to ${RUNDIR} ...${NC}" exit 1 @@ -177,7 +177,7 @@ if [ -z "${BOTTOKEN}" ]; then [ -n "${token}" ] && printf '["bottoken"]\t"%s"\n' "${token}" >> "${BOTCONFIG}.jssh" fi - # no boteadmin, setup botadmin + # no botadmin, setup botadmin if [ -z "$(getConfigKey "botadmin")" ]; then # convert old admin if [ -r "${BOTADMIN}" ]; then @@ -237,16 +237,16 @@ debug_checks "start SOURCE=${SOURCE:-no}" "$@" if [ -z "${BOTTOKEN}" ]; then BOTTOKEN="$(getConfigKey "bottoken")" if [ -z "${BOTTOKEN}" ]; then - BOTERROR="Warning: can't get bot token, try to recover working config" - echo -e "${ORANGE}${BOTERROR}${NC}" - if [ -r "${BOTCONFIG}.jssh.ok" ]; then - log_error "${BOTERROR}" - cp "${BOTCONFIG}.jssh.ok" "${BOTCONFIG}.jssh" - BOTTOKEN="$(getConfigKey "bottoken")" - else - echo -e "${RED}Error: Missing bot token! remove ${BOTCONFIG}.jssh and run \"bashbot.sh init\" may fix it.${NC}" - exit 7 - fi + BOTERROR="Warning: can't get bot token, try to recover working config" + echo -e "${ORANGE}${BOTERROR}${NC}" + if [ -r "${BOTCONFIG}.jssh.ok" ]; then + log_error "${BOTERROR}" + cp "${BOTCONFIG}.jssh.ok" "${BOTCONFIG}.jssh" + BOTTOKEN="$(getConfigKey "bottoken")" + else + echo -e "${RED}Error: Missing bot token! remove ${BOTCONFIG}.jssh and run \"bashbot.sh init\" may fix it.${NC}" + exit 7 + fi fi fi @@ -255,12 +255,12 @@ fi if ! check_token "${BOTTOKEN}"; then echo -e "${ORANGE}Warning: your bottoken may incorrect. it should have the following format:${NC}" echo -e "${GREY}123456789${RED}:${GREY}Aa-Zz_0Aa-Zz_1Aa-Zz_2Aa-Zz_3Aa-Zz_4${ORANGE} => ${NC}\c" - echo -e "${GREY}8-10 digits${RED}:${GREY}35 alnum characters + '_-'${NC}" + echo -e "${GREY}8-10 digits${RED}:${GREY}35 alphanumeric characters + '_-'${NC}" echo -e "${ORANGE}Your current token is: '${GREY}^$(cat -ve <<<"${BOTTOKEN//:/${RED}:${GREY}}")${ORANGE}'${NC}" [[ ! "${BOTTOKEN}" =~ ^[0-9]{8,10}: ]] &&\ echo -e "${ORANGE}Possible problem in the digits part, len is $(($(wc -c <<<"${BOTTOKEN%:*}")-1))${NC}" [[ ! "${BOTTOKEN}" =~ :[a-zA-Z0-9_-]{35}$ ]] &&\ - echo -e "${ORANGE}Posilbe problem in the charatcers part, len is $(($(wc -c <<<"${BOTTOKEN#*:}")-1))${NC}" + echo -e "${ORANGE}Possible problem in the characters part, len is $(($(wc -c <<<"${BOTTOKEN#*:}")-1))${NC}" fi @@ -287,7 +287,7 @@ export res CAPTION ################## -# read commamds file if we are not sourced +# read commands file if we are not sourced COMMANDS="${BASHBOT_ETC:-.}/commands.sh" if [ -z "${SOURCE}" ]; then if [ ! -f "${COMMANDS}" ] || [ ! -r "${COMMANDS}" ]; then @@ -337,14 +337,14 @@ procname(){ printf '%s\n' "$2${ME}_$1" } -# $1 string to search for proramm incl. parameters -# returns a list of PIDs of all current bot proceeses matching $1 +# $1 string to search for programme incl. parameters +# returns a list of PIDs of all current bot processes matching $1 proclist() { # shellcheck disable=SC2009 ps -fu "${UID}" | grep -F "$1" | grep -v ' grep'| grep -F "${ME}" | sed 's/\s\+/\t/g' | cut -f 2 } -# $1 string to search for proramm to kill +# $1 string to search for programme to kill killallproc() { local procid; procid="$(proclist "$1")" if [ -n "${procid}" ] ; then @@ -359,7 +359,7 @@ killallproc() { } -# $ chat $2 mesgid $3 nolog +# $ chat $2 msg_id $3 nolog declare -xr DELETE_URL=$URL'/deleteMessage' delete_message() { [ -z "$3" ] && printf "%s: Delete Message CHAT=%s MSG_ID=%s\n" "$(date)" "${1}" "${2}" >>"${UPDATELOG}" @@ -397,7 +397,7 @@ if [ -z "${BASHBOT_WGET}" ] && _exists curl ; then sendJsonResult "${res}" "sendJson (curl)" "$@" [ -n "${BASHBOT_EVENT_SEND[*]}" ] && event_send "send" "${@}" & } - #$1 Chat, $2 what , $3 file, $4 URL, $5 caption + #$1 Chat, $2 what, $3 file, $4 URL, $5 caption sendUpload() { [ "$#" -lt 4 ] && return if [ -n "$5" ]; then @@ -479,13 +479,13 @@ sendJsonResult(){ else # oops something went wrong! if [ "${res}" != "" ]; then - BOTSENT[ERROR]="$(JsonGetValue '"error_code"' <<< "${1}")" - BOTSENT[DESCRIPTION]="$(JsonGetString '"description"' <<< "${1}")" - BOTSENT[RETRY]="$(JsonGetValue '"parameters","retry_after"' <<< "${1}")" + BOTSENT[ERROR]="$(JsonGetValue '"error_code"' <<< "${1}")" + BOTSENT[DESCRIPTION]="$(JsonGetString '"description"' <<< "${1}")" + BOTSENT[RETRY]="$(JsonGetValue '"parameters","retry_after"' <<< "${1}")" else - BOTSENT[OK]="false" - BOTSENT[ERROR]="999" - BOTSENT[DESCRIPTION]="Send to telegram not possible, timeout/broken/no connection" + BOTSENT[OK]="false" + BOTSENT[ERROR]="999" + BOTSENT[DESCRIPTION]="Send to telegram not possible, timeout/broken/no connection" fi # log error [[ "${BOTSENT[ERROR]}" = "400" && "${BOTSENT[DESCRIPTION]}" == *"starting at byte offset"* ]] &&\ @@ -496,36 +496,36 @@ sendJsonResult(){ [ -n "${BASHBOT_RETRY}${BASHBOT_WGET}" ] && return # OK, we can retry sendJson, let's see what's failed - # throttled, telegram say we send to much messages + # throttled, telegram say we send too many messages if [ -n "${BOTSENT[RETRY]}" ]; then - BASHBOT_RETRY="$(( ++BOTSENT[RETRY] ))" - printf "Retry %s in %s seconds ...\n" "${2}" "${BASHBOT_RETRY}" - sendJsonRetry "${2}" "${BASHBOT_RETRY}" "${@:3}" - unset BASHBOT_RETRY - return + BASHBOT_RETRY="$(( ++BOTSENT[RETRY] ))" + printf "Retry %s in %s seconds ...\n" "${2}" "${BASHBOT_RETRY}" + sendJsonRetry "${2}" "${BASHBOT_RETRY}" "${@:3}" + unset BASHBOT_RETRY + return fi # timeout, failed connection or blocked if [ "${BOTSENT[ERROR]}" == "999" ];then # check if default curl and args are OK - if ! curl -sL -k -m 2 "${URL}" >/dev/null 2>&1 ; then - printf "%s: BASHBOT IP Address seems blocked!\n" "$(date)" - # user provided function to recover or notify block - if _exec_if_function bashbotBlockRecover; then - BASHBOT_RETRY="2" - printf "bashbotBlockRecover returned true, retry %s ...\n" "${2}" - sendJsonRetry "${2}" "${BASHBOT_RETRY}" "${@:3}" - unset BASHBOT_RETRY - fi + if ! curl -sL -k -m 2 "${URL}" >/dev/null 2>&1 ; then + printf "%s: BASHBOT IP Address seems blocked!\n" "$(date)" + # user provided function to recover or notify block + if _exec_if_function bashbotBlockRecover; then + BASHBOT_RETRY="2" + printf "bashbotBlockRecover returned true, retry %s ...\n" "${2}" + sendJsonRetry "${2}" "${BASHBOT_RETRY}" "${@:3}" + unset BASHBOT_RETRY + fi return - fi + fi # are not blocked, default curl and args are working - if [ -n "${BASHBOT_CURL_ARGS}" ] || [ "${BASHBOT_CURL}" != "curl" ]; then - printf "Problem with \"%s %s\"? retry %s with default config ...\n"\ - "${BASHBOT_CURL}" "${BASHBOT_CURL_ARGS}" "${2}" - BASHBOT_RETRY="2"; BASHBOT_CURL="curl"; BASHBOT_CURL_ARGS="" - sendJsonRetry "${2}" "${BASHBOT_RETRY}" "${@:3}" - unset BASHBOT_RETRY - fi + if [ -n "${BASHBOT_CURL_ARGS}" ] || [ "${BASHBOT_CURL}" != "curl" ]; then + printf "Problem with \"%s %s\"? retry %s with default config ...\n"\ + "${BASHBOT_CURL}" "${BASHBOT_CURL_ARGS}" "${2}" + BASHBOT_RETRY="2"; BASHBOT_CURL="curl"; BASHBOT_CURL_ARGS="" + sendJsonRetry "${2}" "${BASHBOT_RETRY}" "${@:3}" + unset BASHBOT_RETRY + fi fi fi } >>"${ERRORLOG}" @@ -557,15 +557,15 @@ getBotName() { # pure bash implementation, done by KayM (@gnadelwartz) # see https://stackoverflow.com/a/55666449/9381171 JsonDecode() { - local out="$1" remain="" U="" + local out="$1" remain="" U="" local regexp='(.*)\\u[dD]([0-9a-fA-F]{3})\\u[dD]([0-9a-fA-F]{3})(.*)' - while [[ "${out}" =~ $regexp ]] ; do - U=$(( ( (0xd${BASH_REMATCH[2]} & 0x3ff) <<10 ) | ( 0xd${BASH_REMATCH[3]} & 0x3ff ) + 0x10000 )) - remain="$(printf '\\U%8.8x' "${U}")${BASH_REMATCH[4]}${remain}" - out="${BASH_REMATCH[1]}" - done + while [[ "${out}" =~ $regexp ]] ; do + U=$(( ( (0xd${BASH_REMATCH[2]} & 0x3ff) <<10 ) | ( 0xd${BASH_REMATCH[3]} & 0x3ff ) + 0x10000 )) + remain="$(printf '\\U%8.8x' "${U}")${BASH_REMATCH[4]}${remain}" + out="${BASH_REMATCH[1]}" + done # this echo must stay for correct decoding! - echo -e "${out}${remain}" + echo -e "${out}${remain}" } JsonGetString() { @@ -595,7 +595,7 @@ process_client() { # log message on debug [[ -n "${debug}" ]] && printf "\n%s: New Message ==========\n%s\n" "$(date)" "$UPDATE" >>"${LOGDIR}/MESSAGE.log" - # check for uers / groups to ignore + # check for users / groups to ignore jssh_updateArray_async "BASHBOTBLOCKED" "${BLOCKEDFILE}" [ -n "${USER[ID]}" ] && [[ -n "${BASHBOTBLOCKED[${USER[ID]}]}" || -n "${BASHBOTBLOCKED[${CHAT[ID]}]}" ]] && return @@ -783,7 +783,7 @@ process_message() { MESSAGE[0]+="$(JsonDecode "${UPD["result",${num},"message","text"]}" | sed 's|\\/|/|g')" MESSAGE[ID]="${UPD["result",${num},"message","message_id"]}" - # Chat ID is now parsed when update isreceived + # Chat ID is now parsed when update is received CHAT[LAST_NAME]="$(JsonDecode "${UPD["result",${num},"message","chat","last_name"]}")" CHAT[FIRST_NAME]="$(JsonDecode "${UPD["result",${num},"message","chat","first_name"]}")" CHAT[USERNAME]="$(JsonDecode "${UPD["result",${num},"message","chat","username"]}")" @@ -793,7 +793,7 @@ process_message() { CHAT[TYPE]="$(JsonDecode "${UPD["result",${num},"message","chat","type"]}")" CHAT[ALL_ADMIN]="${UPD["result",${num},"message","chat","all_members_are_administrators"]}" - # user ID is now parsed when update isreceived + # user ID is now parsed when update is received #USER[ID]="${UPD["result",${num},"message","from","id"]}" USER[FIRST_NAME]="$(JsonDecode "${UPD["result",${num},"message","from","first_name"]}")" USER[LAST_NAME]="$(JsonDecode "${UPD["result",${num},"message","from","last_name"]}")" @@ -890,7 +890,7 @@ process_message() { [ -z "${MESSAGE[0]}" ] && [ -n "${SERVICE[PINNED]}" ] &&\ MESSAGE[0]="/_new_pinned_message ${USER[ID]} ${PINNED[ID]} ${PINNED[MESSAGE]}" fi - # set SSERVICE to yes if a service message was received + # set SERVICE to yes if a service message was received [[ "${SERVICE[*]}" =~ ^[[:blank:]]*$ ]] || SERVICE[0]="yes" # split message in command and args @@ -968,7 +968,7 @@ start_bot() { process_updates "${DEBUGMSG}" fi else - # ups, something bad happened, wait maxsleep*10 + # oops, something bad happened, wait maxsleep*10 (( nextsleep=nextsleep*2 , nextsleep= nextsleep>maxsleep*10 ?maxsleep*10:nextsleep )) [ "${OFFSET}" = "-999" ] &&\ log_error "Repeated timeout/broken/no connection on telegram update, sleep $(_round_float "${nextsleep}e-3")s" @@ -1004,7 +1004,7 @@ bot_init() { done echo "Done." fi - #setup bashbot + # setup bashbot [[ "${UID}" -eq "0" ]] && RUNUSER="nobody" echo -n "Enter User to run bashbot [$RUNUSER]: " read -r TOUSER @@ -1068,11 +1068,11 @@ if [ -z "${SOURCE}" ]; then ############## # internal options only for use from bashbot and developers case "${1}" in - # update botname botname when starting only + # update botname when starting only "botname"|"start"*) ME="$(getBotName)" if [ -n "${ME}" ]; then - # ok we have a connection an got botname, save it + # ok we have a connection and got botname, save it [ -n "${CLEAR}" ] && echo -e "${GREY}Bottoken is valid ...${NC}" jssh_updateKeyDB "botname" "${ME}" "${BOTCONFIG}" rm -f "${BOTCONFIG}.jssh.flock" @@ -1102,7 +1102,7 @@ if [ -z "${SOURCE}" ]; then debug_checks "end outproc" "$@" exit ;; - # finally starts the read update loop, internal use only1 + # finally starts the read update loop, internal use only1 "startbot" ) start_bot "$2" debug_checks "end startbot" "$@" @@ -1114,7 +1114,7 @@ if [ -z "${SOURCE}" ]; then debug_checks "end init" "$@" exit ;; - # print usage sats + # print usage stats "count") echo -e "${RED}Command ${GREY}count${RED} is deprecated, use ${GREY}stats{$RED}instead.${NC}";& "stats") ME="$(getConfigKey "botname")" @@ -1150,7 +1150,7 @@ if [ -z "${SOURCE}" ]; then debug_checks "end $1" "$@" exit ;; - # sedn message to all users + # send message to all users 'broadcast') ME="$(getConfigKey "botname")" declare -A SENDALL @@ -1171,7 +1171,7 @@ if [ -z "${SOURCE}" ]; then debug_checks "end $1" "$@" exit ;; - # does what is says + # does what it says "status") ME="$(getConfigKey "botname")" SESSION="${ME:-_bot}-startbot" @@ -1186,7 +1186,7 @@ if [ -z "${SOURCE}" ]; then debug_checks "end status" "$@" ;; - # start bot as background jod and check if bot is running + # start bot as background job and check if bot is running "start") # shellcheck disable=SC2086 SESSION="${ME:-_bot}-startbot" @@ -1244,6 +1244,6 @@ if [ -z "${SOURCE}" ]; then # warn if root if [[ "${UID}" -eq "0" ]] ; then echo -e "\\n${ORANGE}WARNING: ${SCRIPT} was started as ROOT (UID 0)!${NC}" - echo -e "${ORANGE}You are at HIGH RISK when running a Telegram BOT with root privilegs!${NC}" + echo -e "${ORANGE}You are at HIGH RISK when running a Telegram BOT with root privileges!${NC}" fi fi # end source diff --git a/db.json b/db.json index 0005a45..4db1ca2 100644 --- a/db.json +++ b/db.json @@ -14,7 +14,7 @@ "ok": { "ok":true, - "description":"Ttest for ok" + "description":"Test for ok" } , "getMe": { From 34ea573d9f75fd9959f9ae270c8b5dcb3359bff8 Mon Sep 17 00:00:00 2001 From: dcoomber <47242934+dcoomber@users.noreply.github.com> Date: Sat, 26 Sep 2020 20:05:01 +0200 Subject: [PATCH 02/17] Renamed mycommands.sh to match name in header comments --- mycommands.sh => mycommands.sh.dist | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename mycommands.sh => mycommands.sh.dist (100%) diff --git a/mycommands.sh b/mycommands.sh.dist similarity index 100% rename from mycommands.sh rename to mycommands.sh.dist From 7488d52922d507ef220268e86e96ecea55a29c5d Mon Sep 17 00:00:00 2001 From: dcoomber <47242934+dcoomber@users.noreply.github.com> Date: Sat, 26 Sep 2020 21:25:17 +0200 Subject: [PATCH 03/17] Cosmetic updates to some comments --- bashbot.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bashbot.sh b/bashbot.sh index 825dd7e..72a0156 100755 --- a/bashbot.sh +++ b/bashbot.sh @@ -915,7 +915,7 @@ start_bot() { [[ "${1}" == *"debug" ]] && exec &>>"${DEBUGLOG}" printf "%s\n" "${DEBUGMSG}"; DEBUGMSG="${1}" [[ "${DEBUGMSG}" == "xdebug"* ]] && set -x - #cleaup old pipes and empty logfiles + # cleaup old pipes and empty logfiles find "${DATADIR}" -type p -delete find "${DATADIR}" -size 0 -name "*.log" -delete # load addons on startup @@ -951,7 +951,7 @@ start_bot() { sleep "$(_round_float "${nextsleep}e-3" "1")" # get next update UPDATE="$(getJson "$UPD_URL$OFFSET" "nolog" 2>/dev/null | "${JSONSHFILE}" -s -b -n 2>/dev/null | iconv -f utf-8 -t utf-8 -c)" - # did we ge an responsn0r + # did we get an response? if [ -n "${UPDATE}" ]; then # we got something, do processing [ "${OFFSET}" = "-999" ] && [ "${nextsleep}" -gt "$((maxsleep*2))" ] &&\ From de7d363abca7344b15b05c7ad01b97f48910a9b1 Mon Sep 17 00:00:00 2001 From: dcoomber <47242934+dcoomber@users.noreply.github.com> Date: Sat, 26 Sep 2020 21:26:18 +0200 Subject: [PATCH 04/17] Removed duplicate reference to 'runas' --- bashbot.rc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bashbot.rc b/bashbot.rc index e5b1a43..65849b1 100755 --- a/bashbot.rc +++ b/bashbot.rc @@ -17,14 +17,13 @@ # save default values TERM="" # disable bashbot clear and color output -runas="nobody" runcmd="echo Dry run:" # not activated until you edit lines below ####################### # Configuration Section # edit the next line to fit the user you want to run bashbot, e.g. nobody: -# runas="nobody" +runas="nobody" # uncomment one of the following lines to fit your system # runcmd="su $runas -s /bin/bash -c " # runasuser with *su* @@ -81,4 +80,3 @@ case "$1" in ;; esac exit $RETVAL - From 9c8b4f9611635593fdf110eadfe572f0e75e6c3e Mon Sep 17 00:00:00 2001 From: dcoomber <47242934+dcoomber@users.noreply.github.com> Date: Sun, 27 Sep 2020 17:36:01 +0200 Subject: [PATCH 05/17] Correct instances of bahsbot to bashbot --- addons/example.sh | 2 +- doc/4_expert.md | 4 ++-- doc/5_practice.md | 2 +- doc/6_reference.md | 2 +- doc/7_develop.md | 18 +++++++++--------- examples/background-scripts/mycommands.sh | 2 +- examples/bashbot-multi.sh | 4 ++-- examples/jsonDB-keyboard/mycommands.sh | 2 +- examples/send-system-status/mycommands.sh | 2 +- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/addons/example.sh b/addons/example.sh index 9c9c15e..559a751 100644 --- a/addons/example.sh +++ b/addons/example.sh @@ -29,7 +29,7 @@ # BASHBOT_EVENT_LOCATION location or venue received # BASHBOT_EVENT_FILE file received # -# BAHSBOT_EVENT_TIMER this event is a bit special as it fires every Minute +# BASHBOT_EVENT_TIMER this event is a bit special as it fires every Minute # and has 3 meanings: oneshot, every time, every X minutes. # # all global variables and functions can be used in registered functions. diff --git a/doc/4_expert.md b/doc/4_expert.md index 9663268..90059b8 100644 --- a/doc/4_expert.md +++ b/doc/4_expert.md @@ -107,8 +107,8 @@ by sourcing it: *usage:* . bashbot.sh source -Before sourcing 'bahsbot.sh' for interactive and script use, you should export and set BASHBOT_HOME to bashbots installation dir, -e.g. '/usr/local/telegram-bot-bash'. see [Bashbot Environemt](#Bashbot-environment) +Before sourcing 'bashbot.sh' for interactive and script use, you should export and set BASHBOT_HOME to bashbots installation dir, +e.g. '/usr/local/telegram-bot-bash'. see [Bashbot Environment](#Bashbot-environment) **Note:** *If you don't set BASHBOT_HOME bashbot will use the actual directory as NEW home directory which means it will create all needed files and ask for bot token and botadmin if you are not in the real bot home!* diff --git a/doc/5_practice.md b/doc/5_practice.md index d6c897f..f0e3c5d 100644 --- a/doc/5_practice.md +++ b/doc/5_practice.md @@ -15,7 +15,7 @@ To start with a clean/minimal bot copy ```mycommands.sh.clean``` to ```mycommand the message strings and place commands in the```case ... esac``` block of the function mycommands(): ```bash # file: mycommands.sh -# your additional bahsbot commands +# your additional bashbot commands # uncomment the following lines to overwrite info and help messages bashbot_info='This is *MY* variant of _bashbot_, the Telegram bot written entirely in bash. diff --git a/doc/6_reference.md b/doc/6_reference.md index efee20a..add13f7 100644 --- a/doc/6_reference.md +++ b/doc/6_reference.md @@ -281,7 +281,7 @@ fi *See also [Chat Member](https://core.telegram.org/bots/api/#chatmember)* ##### user_is_allowed -Bahsbot supports User Access Control, see [Advanced Usage](3_advanced.md) +Bashbot supports User Access Control, see [Advanced Usage](3_advanced.md) *usage:* user_is_allowed "${USER[ID]}" "what" "${CHAT[ID]}" diff --git a/doc/7_develop.md b/doc/7_develop.md index 25b4238..8291d2a 100644 --- a/doc/7_develop.md +++ b/doc/7_develop.md @@ -31,7 +31,7 @@ you can the change the level of verbosity of the debug argument: to keep 'bashbot.sh' small, while extending functionality. In addition not every function is needed by all bots, so you can disable modules, e.g. by rename the respective module file to 'module.sh.off'. -Modules must use only functions provided by 'bahsbot.sh' or the module itself and should not depend on other modules or addons. +Modules must use only functions provided by 'bashbot.sh' or the module itself and should not depend on other modules or addons. The only mandatory module is 'module/sendMessage.sh'. If a not mandatory module is used in 'bashbot.sh' or 'commands.sh', the use of ```_is_function``` or @@ -115,7 +115,7 @@ To avoid wrong use of EVENT_SEND, e.g. fork bomb, event processing is suspended *Example:* ```bash # register callback: -BAHSBOT_EVENT_SEND["example_log","1"]="example_log" +BASHBOT_EVENT_SEND["example_log","1"]="example_log" EXAMPLE_LOG="${BASHBOT_ETC:-.}/addons/${EXAMPLE_ME}.log" # Note: do not call any send message functions from EVENT_SEND! @@ -130,7 +130,7 @@ example_log(){ Important: Bashbot timer tick is disabled by default and must be enabled by setting BASHBOT_START_TIMER to any value not zero. -* BAHSBOT_EVENT_TIMER executed every minute and can be used in 3 variants: oneshot, once a minute, every X minutes. +* BASHBOT_EVENT_TIMER executed every minute and can be used in 3 variants: oneshot, once a minute, every X minutes. Registering to BASHBOT_EVENT_TIMER works similar as for message events, but you must add a timing argument to the name. EVENT_TIMER is triggered every 60s and waits until the current running command is finished, so it's not exactly every @@ -139,7 +139,7 @@ minute, but once a minute. Every time EVENT_TIMER is triggered the variable "EVENT_TIMER" is increased. each callback is executed if ```EVENT_TIMER % time``` is '0' (true). This means if you register an every 5 minutes callback first execution may < 5 Minutes, all subsequent executions are once every 5. Minute. -*usage:* BAHSBOT_EVENT_TIMER[ "name" , "time" ], where time is: +*usage:* BASHBOT_EVENT_TIMER[ "name" , "time" ], where time is: * 0 ignored * 1 execute once every minute @@ -151,7 +151,7 @@ Note: If you want exact "in x minutes" use "EVENT_TIMER plus x" as time: ```-(EV *Example:* ```bash # register callback: -BAHSBOT_EVENT_TIMER["example_every","1"]="example_everymin" +BASHBOT_EVENT_TIMER["example_every","1"]="example_everymin" # function called every minute example_everymin() { @@ -160,13 +160,13 @@ example_everymin() { } # register other callback: -BAHSBOT_EVENT_TIMER["example_every5","5"]="example_every5min" +BASHBOT_EVENT_TIMER["example_every5","5"]="example_every5min" # execute once on the next 10 minutes since start "event" -BAHSBOT_EVENT_TIMER["example_10min","-10"]="example_in10min" +BASHBOT_EVENT_TIMER["example_10min","-10"]="example_in10min" # once in exact 10 minutes -BAHSBOT_EVENT_TIMER["example_10min","$(( (EVENT_TIMER+10) * -1 ))"]="example_in10min" +BASHBOT_EVENT_TIMER["example_10min","$(( (EVENT_TIMER+10) * -1 ))"]="example_in10min" ``` @@ -297,7 +297,7 @@ To create a new test run ```test/ADD-test-new.sh``` and answer the questions, it Each test consists of a script script named after ```p-name-test.sh``` *(where p is test pass 'a-z' and name the name of your test)* and an optional dir ```p-name-test/``` *(script name minus '.sh')* for additional files. -Tests with no dependency to other tests will run in pass 'a', tests which need an initialized bahsbot environment must run in pass 'd' or later. +Tests with no dependency to other tests will run in pass 'a', tests which need an initialized bashbot environment must run in pass 'd' or later. A temporary test environment is created when 'ALL-tests.sh' starts and deleted after all tests are finished. The file ```ALL-tests.inc.sh``` must be included from all tests and provide the test environment as shell variables: diff --git a/examples/background-scripts/mycommands.sh b/examples/background-scripts/mycommands.sh index 3084fae..9a813e4 100644 --- a/examples/background-scripts/mycommands.sh +++ b/examples/background-scripts/mycommands.sh @@ -3,7 +3,7 @@ # copy to mycommands.sh and add all your commands an functions here ... export res -# your additional bahsbot commands ... +# your additional bashbot commands ... mycommands() { case "$MESSAGE" in diff --git a/examples/bashbot-multi.sh b/examples/bashbot-multi.sh index db0eb03..122db50 100755 --- a/examples/bashbot-multi.sh +++ b/examples/bashbot-multi.sh @@ -23,8 +23,8 @@ if true; then else # alternative linux like locations BINDIR="/usr/local/bin" - ETC="/etc/bahsbot" - VAR="/var/bahsbot" + ETC="/etc/bashbot" + VAR="/var/bashbot" export BASHBOT_JSONSH="/usr/local/bin/JSON.sh" fi diff --git a/examples/jsonDB-keyboard/mycommands.sh b/examples/jsonDB-keyboard/mycommands.sh index bd2b081..3dec529 100644 --- a/examples/jsonDB-keyboard/mycommands.sh +++ b/examples/jsonDB-keyboard/mycommands.sh @@ -206,7 +206,7 @@ else my_startup fi - # your additional bahsbot commands + # your additional bashbot commands # NOTE: command can have @botname attached, you must add * in case tests... mycommands() { # a service Message was received diff --git a/examples/send-system-status/mycommands.sh b/examples/send-system-status/mycommands.sh index 349a7b6..dcf7fee 100644 --- a/examples/send-system-status/mycommands.sh +++ b/examples/send-system-status/mycommands.sh @@ -32,7 +32,7 @@ bashbot_help='*Available commands*: ' -# your additional bahsbot commands +# your additional bashbot commands # NOTE: command can have @botname attached, you must add * in case tests... mycommands() { local msg="" From 676a69465dc0da49aa0c732ec3434938f8fc0cb0 Mon Sep 17 00:00:00 2001 From: dcoomber <47242934+dcoomber@users.noreply.github.com> Date: Sun, 27 Sep 2020 19:41:08 +0200 Subject: [PATCH 06/17] Cosmetic updates to DEV document --- doc/7_develop.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/7_develop.md b/doc/7_develop.md index 8291d2a..8161f9f 100644 --- a/doc/7_develop.md +++ b/doc/7_develop.md @@ -3,7 +3,7 @@ ## Notes for bashbot developers This section is about help and best practices for new bashbot developers. The main focus on is creating new versions of bashbot, modules and addons, not on develop your individual bot. Nevertheless the information provided here should help your bot development also. -If you want to provide fixes or new features [fork bashbot on githup](https://help.github.com/en/articles/fork-a-repo) and provide changes as [pull request on github](https://help.github.com/en/articles/creating-a-pull-request). +If you want to provide fixes or new features [fork bashbot on github](https://help.github.com/en/articles/fork-a-repo) and provide changes as [pull request on github](https://help.github.com/en/articles/creating-a-pull-request). ### Debugging Bashbot Usually all bashbot output is discarded. @@ -37,7 +37,7 @@ The only mandatory module is 'module/sendMessage.sh'. If a not mandatory module is used in 'bashbot.sh' or 'commands.sh', the use of ```_is_function``` or ```_execute_if_function``` is mandatory to catch absence of the module. -**Addons** resides in ```addons/*.sh.dist``` and are not endabled by default. To activate an addon rename it to end with '.sh', e.g. by +**Addons** resides in ```addons/*.sh.dist``` and are not enabled by default. To activate an addon rename it to end with '.sh', e.g. by ```cp addons/example.sh.dist addons/example.sh```. Addons must register themself to BASHBOT_EVENTS at startup, e.g. to call a function every time a message is received. From d64ba40b63ec2083e9a23bcaab42b0a2eb1375c7 Mon Sep 17 00:00:00 2001 From: dcoomber <47242934+dcoomber@users.noreply.github.com> Date: Sun, 27 Sep 2020 20:11:28 +0200 Subject: [PATCH 07/17] Added shellcheck source for background script examples --- examples/background-scripts/run_diskusage.sh | 1 + examples/background-scripts/run_filecontent.sh | 3 ++- examples/background-scripts/run_filename.sh | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/examples/background-scripts/run_diskusage.sh b/examples/background-scripts/run_diskusage.sh index d9e9ff5..9fc6ce8 100755 --- a/examples/background-scripts/run_diskusage.sh +++ b/examples/background-scripts/run_diskusage.sh @@ -24,6 +24,7 @@ unset IFS # discard STDIN for background jobs! cat >/dev/null & +# shellcheck source=examples/background-scripts/mycommands.sh source "./mycommands.sh" # check if $1 is a number diff --git a/examples/background-scripts/run_filecontent.sh b/examples/background-scripts/run_filecontent.sh index e27fc7f..9142d0d 100755 --- a/examples/background-scripts/run_filecontent.sh +++ b/examples/background-scripts/run_filecontent.sh @@ -24,6 +24,8 @@ cat >/dev/null & # watch for new files created by a trusted program WATCHDIR="/my_trusted/dir_to_watch" + +# shellcheck source=examples/background-scripts/mycommands.sh source "./mycommands.sh" # test your script and the remove ... @@ -39,4 +41,3 @@ loop_callback() { } watch_dir_loop "$WATCHDIR" - diff --git a/examples/background-scripts/run_filename.sh b/examples/background-scripts/run_filename.sh index 0c9e0fe..b89cfe2 100755 --- a/examples/background-scripts/run_filename.sh +++ b/examples/background-scripts/run_filename.sh @@ -19,11 +19,13 @@ export 'LANGUAGE=C.UTF-8' unset IFS # set -f # if you are paranoid use set -f to disable globbing -# discard STDIN for background jobs! +# shellcheck source=examples/background-scripts/mycommands.sh cat >/dev/null & # watch for new logfiles WATCHDIR="/var/log" + +# shellcheck disable=SC1091 source "./mycommands.sh" # test your script and the remove ... From d667ecc262c8a7117ef7dab4ef7ffe72f3ff01fc Mon Sep 17 00:00:00 2001 From: dcoomber <47242934+dcoomber@users.noreply.github.com> Date: Sun, 27 Sep 2020 20:24:15 +0200 Subject: [PATCH 08/17] Merging with topkecleon-develop --- README.html | 79 +++++++++++++++++++++------------------- README.md | 12 ++++-- README.txt | 14 ++++--- bashbot.rc | 2 +- bashbot.sh | 17 ++++++++- commands.sh | 2 +- dev/all-tests.sh | 2 +- dev/git-add.sh | 2 +- dev/hooks/pre-commit.sh | 2 +- dev/hooks/pre-push.sh | 2 +- dev/install-hooks.sh | 2 +- dev/make-distribution.sh | 2 +- dev/make-standalone.sh | 2 +- dev/shellcheck.files | 2 +- dev/version.sh | 2 +- doc/0_install.md | 78 +++++++++++++++++++++++++++++---------- doc/2_usage.md | 2 +- modules/sendMessage.sh | 2 +- mycommands.sh.clean | 2 +- mycommands.sh.dist | 2 +- 20 files changed, 146 insertions(+), 84 deletions(-) diff --git a/README.html b/README.html index e5d8ee0..e3b9070 100644 --- a/README.html +++ b/README.html @@ -93,7 +93,8 @@ Written by Drew (@topkecleon) and Kay M (@gnadelwartz).

Prerequisites

Uses JSON.sh and the magic of sed.

Even bashbot is written in bash, it depends on commands typically available in a Unix/Linux Environment. More concrete on the common commands provided by recent versions of coreutils, busybox or toybox, see Developer Notes

-

Note for MacOS and BSD Users: As bashbot heavily uses modern bash and (gnu) grep/sed features, bashbot will not run without installing additional software, see Install Bashbot

+

Note for MacOS and BSD Users: As bashbot heavily uses modern bash and (gnu) grep/sed features, bashbot will not run without installing additional software, see Install Bashbot

+

Note for embedded systems: busybox or toybox ONLY is not sufficient, you need a to install a "real" bash, see also Install Bashbot

Bashbot Documentation and Downloads are available on www.github.com

Documentation