new discord script, takes color, title, also accepts distinct.

This commit is contained in:
2023-11-09 21:08:00 +00:00
parent e5543afc9b
commit f74ac68554
8 changed files with 291 additions and 88 deletions
+26 -9
View File
@@ -1,16 +1,33 @@
#!/bin/bash
LOCATION=`dirname "$0"`
backupDir="$1"
backupType="$2"
source "${LOCATION}/../config.sh"
# load in defaults from config
scriptRoot="$(dirname "$0")/.."
configFile="$scriptRoot/config.sh"
if [[ -f "$configFile" ]]; then
source "$configFile"
cd "${BACKUP_DIRECTORY}"
if [[ -z "$backupDir" ]]; then
backupDir="$BACKUP_DIRECTORY"
fi
if [[ -z "$backupType" ]]; then
backupType="$PRUNE_TYPE"
fi
fi
backups=`find * -type f | sort | xargs du -h`
echo "${backups}"
${LOCATION}/../discord.sh block "${backups}"
if [[ "$backupType" = "<DIR>" ]]; then
backups=$(find "$backupDir" -maxdepth 1 -type d | grep -v "^$backupDir$" | sort | xargs du -h --summarize)
hashes=""
else
backups=$(find "$backupDir" -type f -name "$backupType" | sort | xargs du -h)
hashes=$(find "$backupDir" -type f -name "$backupType" | sort | xargs md5sum --tag)
fi
hashes=`find * -type f | sort | xargs md5sum --tag`
echo "${hashes}"
${LOCATION}/../discord.sh block "${hashes}"
echo "$backups"
if [[ -n "$hashes" ]]; then
echo "$hashes"
fi
"$scriptRoot/discord.sh" -c "mint" -t "Backup Status" "$backups" "$hashes"
+27 -15
View File
@@ -1,23 +1,35 @@
#!/bin/bash
LOCATION=`dirname "$0"`
locations="$@"
source "${LOCATION}/../config.sh"
# load in defaults from config
scriptRoot="$(dirname "$0")/.."
configFile="$scriptRoot/config.sh"
if [[ -f "$configFile" ]]; then
source "$configFile"
COUNT=1
for index in "${!STORAGE_ALERT[@]}"; do
storage=`${LOCATION}/../storage.sh $index ${STORAGE_ALERT[$index]}`
alert=$?
if [[ "0" != "${alert}" ]]; then
echo "${storage} is below threshold ${STORAGE_ALERT[$index]}G"
${LOCATION}/../discord-if-distinct.sh block "storage-${COUNT}" "${storage} is below threshold ${STORAGE_ALERT[$index]}G"
else
echo "${storage} is above threshold ${STORAGE_ALERT[$index]}G"
${LOCATION}/../discord-if-distinct.sh block "storage-${COUNT}" "${storage} is above threshold ${STORAGE_ALERT[$index]}G"
if [[ -z "$locations" ]]; then
locations=${STORAGE_MONITOR[@]}
fi
fi
let "COUNT++"
warn=false
messages=()
for index in "${!STORAGE_ALERT[@]}"; do
storage=$("$scriptRoot/storage.sh" "$index" "${STORAGE_ALERT[$index]}")
alert="$?"
if [[ "0" != "$alert" ]]; then
warn=true
messages+=("$storage is below threshold ${STORAGE_ALERT[$index]}G")
else
messages+=("$storage is above threshold ${STORAGE_ALERT[$index]}G")
fi
done
if [[ "$warn" = true ]]; then
purple="purple"
fi
printf "%s\n" "${messages[@]}"
printf "%s\n" "${messages[@]}" | "$scriptRoot/discord.sh" -c "${purple-blue}" -d "Storage Alert"
+11 -5
View File
@@ -1,11 +1,17 @@
#!/bin/bash
LOCATION=`dirname "$0"`
locations="$@"
source "${LOCATION}/../config.sh"
# load in defaults from config
scriptRoot="$(dirname "$0")/.."
configFile="$scriptRoot/config.sh"
if [[ -f "$configFile" ]]; then
source "$configFile"
storage=`${LOCATION}/../df-custom.sh ${STORAGE_MONITOR[@]}`
if [[ -z "$locations" ]]; then
locations=${STORAGE_MONITOR[@]}
fi
fi
echo "${storage}"
${LOCATION}/../discord.sh block "${storage}"
"$scriptRoot/df-custom.sh" $locations | "$scriptRoot/discord.sh" -c "blue" -t "Storage Status"
+2 -2
View File
@@ -21,12 +21,12 @@ alert="$?"
if [[ "0" -ne "$alert" ]]; then
# if currently in an alert status
alertLevelF=`echo "scale=1 ; $alertLevel * 9 / 5 + 32" | bc -l`
"$scriptRoot/discord.sh" "$thermal, above threshold $alertLevel C ($alertLevelF F)"
"$scriptRoot/discord.sh" -c "red" -t "Thermal Alert" "$thermal" $'\n' "above threshold $alertLevel C ($alertLevelF F)"
touch "$HOME/.thermal.alert"
elif [[ -f "$HOME/.thermal.alert" ]]; then
# if previously in an alert status
alertLevelF=`echo "scale=1 ; $alertLevel * 9 / 5 + 32" | bc -l`
"$scriptRoot/discord.sh" "$thermal, previously above threshold $alertLevel C ($alertLevelF F)"
"$scriptRoot/discord.sh" -c "orange" -t "Thermal Alert" "$thermal" $'\n' "previously above threshold $alertLevel C ($alertLevelF F)"
rm "$HOME/.thermal.alert"
fi
+1 -3
View File
@@ -2,7 +2,5 @@
scriptRoot="$(dirname "$0")/.."
thermal=$("$scriptRoot/thermal.sh")
"$scriptRoot/discord.sh" "$thermal"
"$scriptRoot/thermal.sh" | "$scriptRoot/discord.sh" -c "yellow" -t "Thermal Status"
+1 -1
View File
@@ -86,7 +86,7 @@ if [ "${FULL_MESSAGE}" != "${OLD_MSG}" ]; then
curl -s -H "Content-Type: application/json" -X POST -d "{\"username\": \"${DISCORD_SERVER_NAME}\", \"content\": ${MESSAGE}}" $HOOK_URL | jq -r '.id,.message'
if [ -n "${EXTRA}" ]; then
"${LOCATION}/discord.sh" "${HOOK}" "${EXTRA}"
"${LOCATION}/discord-old.sh" "${HOOK}" "${EXTRA}"
fi
fi
Executable
+79
View File
@@ -0,0 +1,79 @@
#!/bin/bash
LOCATION=`dirname "$0"`
source "${LOCATION}/config.sh"
if [[ $# -gt 1 ]]; then
HOOK_ARG="$1"
# sed removes spaces before each line
MESSAGE=`echo "${@:2}" | sed 's/^ *//' | sed 's/ *$//'`
else
# sed removes spaces before each line
MESSAGE=`echo "${@}" | sed 's/^ *//' | sed 's/ *$//'`
if [[ "$MESSAGE" == "general" ]] || [[ "$MESSAGE" == "block" ]] || [[ "$MESSAGE" == "restake" ]] || [[ "$MESSAGE" == "storage" ]]; then
HOOK_ARG="$MESSAGE"
MESSAGE=''
fi
fi
if [[ -z "$MESSAGE" ]]; then
echo 'no message provided'
exit 0
fi
# if message is too long, split it, and after curl, recursively call with remainder
# 2k max, but we must account for escaping text in json, so limit to 90% capacity
EXTRA="${MESSAGE:1800}"
if [ -n "${EXTRA}" ]; then
MESSAGE="${MESSAGE:0:1800}"
# as an added elegance, when spliting into pieces, find the last \n newline,
# and break there instead, but only if the new smaller chunk is of sufficient size
chunk1=`echo "$MESSAGE" | head -n -1`
chunks=`echo "$MESSAGE" | tail -n 1`
if (( "${#chunk1}" >= 1000 )); then
MESSAGE="$chunk1"
EXTRA="${chunks}${EXTRA}"
fi
fi
# sed: rewrite json string, because "\u001b[m" needs to "\u001b[0m" instead
# linux is fine with the missing zero, but discord needs it
MESSAGE=`echo "${MESSAGE}" | jq -aRs . | sed 's/\\\\u001b\[m/\\\\u001b[0m/g'`
HOOK="general"
HOOK_URL=$DISCORD_GENERAL_HOOK
case $HOOK_ARG in
block)
# force block format without color
if [[ "$MESSAGE" != *"\\u001b"* ]]; then
MESSAGE="\"\`\`\`${MESSAGE:1:-1}\n\`\`\`\""
# just here to resolve formatting issue in vim "`"
fi
;;
restake)
HOOK="restake"
HOOK_URL=$DISCORD_RESTAKE_HOOK
;;
storage)
HOOK="storage"
HOOK_URL=$DISCORD_STORAGE_HOOK
;;
esac
# if color detected, update message from "<content>" to "```ansi <content>```", so it gets displayed correctly
if [[ "$MESSAGE" == *"\\u001b"* ]]; then
MESSAGE="\"\`\`\`ansi\n${MESSAGE:1:-1}\n\`\`\`\""
# just here to resolve formatting issue in vim "`"
fi
curl -s -H "Content-Type: application/json" -X POST -d "{\"username\": \"${DISCORD_SERVER_NAME}\", \"content\": ${MESSAGE}}" $HOOK_URL | jq -r '.id,.message'
if [ -n "${EXTRA}" ]; then
"${LOCATION}/discord-old.sh" "${HOOK}" "${EXTRA}"
fi
+144 -53
View File
@@ -1,79 +1,170 @@
#!/bin/bash
LOCATION=`dirname "$0"`
# discord colors are standard 6-digit hex, but converted to a base-10 integer
# colors taken from https://xkcd.com/color/rgb/
# and built into a palette based on https://sashamaps.net/docs/resources/20-colors/
#
# DARK: maroon(#650021), brown(#653700), olive(#6e750e), teal(#029386), navy(#01153e), black(#000000),
# BRIGHT: red(#e50000), orange(#f97306), yellow(#ffff14), lime(#aaff32), green(#15b01a),
# cyan(#00ffff), blue(#0343df), purple(#7e1e9c), magenta(#c20078), grey(#929591),
# LIGHT: pink(#ff81c0), apricot(#ffb16d), beige(#e6daa6), mint(#9ffeb0), lavender(#c79fef), white(#ffffff).
source "${LOCATION}/config.sh"
declare -A colors
colors=(
["maroon"]=6619169 ["brown"]=6633216 ["olive"]=7238926 ["teal"]=168838 ["navy"]=70974 ["black"]=0
["red"]=15007744 ["orange"]=16347910 ["yellow"]=16776980 ["lime"]=11206450 ["green"]=1421338
["cyan"]=65535 ["blue"]=213983 ["purple"]=8265372 ["magenta"]=12714104 ["grey"]=9606545
["pink"]=16744896 ["apricot"]=16757101 ["beige"]=15129254 ["mint"]=10485424 ["lavender"]=13082607 ["white"]=16777215
)
if [[ $# -gt 1 ]]; then
HOOK_ARG="$1"
# sed removes spaces before each line
MESSAGE=`echo "${@:2}" | sed 's/^ *//' | sed 's/ *$//'`
else
# sed removes spaces before each line
MESSAGE=`echo "${@}" | sed 's/^ *//' | sed 's/ *$//'`
print_usage() {
echo "Usage: $0 [-h hook-url], [-c color], [-d [distinct-name] | -t title] message..."
}
if [[ "$MESSAGE" == "general" ]] || [[ "$MESSAGE" == "block" ]] || [[ "$MESSAGE" == "restake" ]] || [[ "$MESSAGE" == "storage" ]]; then
HOOK_ARG="$MESSAGE"
MESSAGE=''
# handle all arguments provided
while getopts 'h:c:d:t:' flag; do
case "$flag" in
h)
if [[ "$OPTARG" == "http"*"?wait=true" ]]; then
hookUrl="$OPTARG"
else
echo "Invalid hook-url provided, should be something like:"
echo "https://discord.com/api/webhooks/***?wait=true"
print_usage
exit 1
fi
;;
c)
if [[ -v "colors[$OPTARG]" ]]; then
color="$OPTARG"
else
echo "Invalid color provided, colors available:"
echo "maroon, brown, olive, teal, navy, black,"
echo "red, orange, yellow, lime, green,"
echo " cyan, blue, purple, magenta, grey,"
echo "pink, apricot, beige, mint, lavender, white."
print_usage
exit 1
fi
;;
d)
# '-d' without value is allowed, but generates a warning
# in which case we'll use name of parent command with arguments
# whatever the distinct key, we clean it up, since it will be used as a filename
if [[ -z "$OPTARG" ]]; then
distinct=$(ps -o args= $PPID | sed 's/[\/\|]/_/g')
echo "Warning: doing distinct by parent, with key '$distinct'" >&2
else
distinct=$(echo "$OPTARG" | sed 's/[\/\|]/_/g')
fi
;;
t)
# title, for supplying a title, without activing the "distinct" feature
title="$OPTARG"
;;
*)
echo "unknown option provided '$flag'"
print_usage
exit 1
;;
esac
done
shift "$((OPTIND-1))"
# load in defaults from config
scriptRoot=$(dirname "$0")
configFile="$scriptRoot/config.sh"
if [[ -f "$configFile" ]]; then
source "$configFile"
botName="$DISCORD_SERVER_NAME"
if [[ -z "$hookUrl" ]]; then
hookUrl="$DISCORD_GENERAL_HOOK"
fi
fi
if [[ -z "$MESSAGE" ]]; then
echo 'no message provided'
exit 0
# stop if we have no hook to send message to
if [[ -z "$hookUrl" ]]; then
echo "Discord Hook URL must either be in config file, or supplied via '-h' argument."
exit 1
fi
# if message is too long, split it, and after curl, recursively call with remainder
# 2k max, but we must account for escaping text in json, so limit to 90% capacity
EXTRA="${MESSAGE:1800}"
# get full message, read from arguments
message=$(echo "$@" | sed 's/^ *//' | sed 's/ *$//')
if [ -n "${EXTRA}" ]; then
MESSAGE="${MESSAGE:0:1800}"
# if we have no message, read from stdin instead
if [[ -z "$message" ]]; then
message=$(cat - | sed 's/^ *//' | sed 's/ *$//')
fi
# sed removes blank lines from the end of the message
fullMsg=$(echo "$message" | sed -e :a -e '/^\n*$/{$d;N;ba' -e '}')
# if message is too long, split it, and after curl, recursively call with remainder
# 4k max, but we must account for escaping text in json, so limit to 90% capacity
extra="${message:3600}"
if [ -n "$extra" ]; then
message="${message:0:3600}"
# as an added elegance, when spliting into pieces, find the last \n newline,
# and break there instead, but only if the new smaller chunk is of sufficient size
chunk1=`echo "$MESSAGE" | head -n -1`
chunks=`echo "$MESSAGE" | tail -n 1`
chunk1=$(echo "$message" | head -n -1)
chunks=$(echo "$message" | tail -n 1)
if (( "${#chunk1}" >= 1000 )); then
MESSAGE="$chunk1"
EXTRA="${chunks}${EXTRA}"
message="$chunk1"
extra="$chunks$extra"
fi
fi
# sed: rewrite json string, because "\u001b[m" needs to "\u001b[0m" instead
# linux is fine with the missing zero, but discord needs it
MESSAGE=`echo "${MESSAGE}" | jq -aRs . | sed 's/\\\\u001b\[m/\\\\u001b[0m/g'`
HOOK="general"
HOOK_URL=$DISCORD_GENERAL_HOOK
message=$(echo "$message" | jq -aRs . | sed 's/\\u001b\[m/\\u001b[0m/g')
case $HOOK_ARG in
block)
# force block format without color
if [[ "$MESSAGE" != *"\\u001b"* ]]; then
MESSAGE="\"\`\`\`${MESSAGE:1:-1}\n\`\`\`\""
# just here to resolve formatting issue in vim "`"
fi
;;
restake)
HOOK="restake"
HOOK_URL=$DISCORD_RESTAKE_HOOK
;;
storage)
HOOK="storage"
HOOK_URL=$DISCORD_STORAGE_HOOK
;;
esac
message="\"\`\`\`ansi\n${message:1:-1}\n\`\`\`\""
# if color detected, update message from "<content>" to "```ansi <content>```", so it gets displayed correctly
if [[ "$MESSAGE" == *"\\u001b"* ]]; then
MESSAGE="\"\`\`\`ansi\n${MESSAGE:1:-1}\n\`\`\`\""
# just here to resolve formatting issue in vim "`"
# handle distinct stuff
oldMsg=""
if [[ -n "$distinct" ]]; then
if [[ -f "$scriptRoot/distinct/$distinct.msg" ]]; then
oldMsg=$(cat "$scriptRoot/distinct/$distinct.msg")
fi
if [[ "$fullMsg" = "$oldMsg" ]]; then
echo "duplicate message"
exit 0
fi
echo "$fullMsg" > "$scriptRoot/distinct/$distinct.msg"
fi
curl -s -H "Content-Type: application/json" -X POST -d "{\"username\": \"${DISCORD_SERVER_NAME}\", \"content\": ${MESSAGE}}" $HOOK_URL | jq -r '.id,.message'
if [ -n "${EXTRA}" ]; then
"${LOCATION}/discord.sh" "${HOOK}" "${EXTRA}"
# build content json
content="{"
if [[ -n "$botName" ]]; then
content="$content\"username\": $(echo "$botName" | jq -aRs .), "
fi
content="$content\"embeds\":[{\"description\": $message"
if [[ -n "$color" ]]; then
content="$content, \"color\": ${colors[$color]}"
fi
if [[ -n "$distinct" ]] || [[ -n "$title" ]]; then
content="$content, \"title\": $(echo "${distinct-$title}" | jq -aRs .)"
fi
content="$content}]}"
# actually send the message to discord
curl -s -H "Content-Type: application/json" -X POST -d "$content" "$hookUrl" | jq -r '.id,.message'
# if the message was too long, send along the rest as a separate message
if [ -n "$extra" ]; then
script=$(basename "$0")
args=("-h" "$hookUrl")
# when we call again, we convert distinct into a title
if [[ -n "$distinct" ]] || [[ -n "$title" ]]; then
args+=("-t" "${distinct-$title}")
fi
if [[ -n "$color" ]]; then
args+=("-c" "$color")
fi
"$scriptRoot/$script" ${args[@]} "$extra"
fi