Skip to content

Instantly share code, notes, and snippets.

@RubenNL
Last active March 2, 2019 13:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RubenNL/e9af989312cab8fff5f5312e5b420c8c to your computer and use it in GitHub Desktop.
Save RubenNL/e9af989312cab8fff5f5312e5b420c8c to your computer and use it in GitHub Desktop.
gotify-bash

i didn't like installing/compiling golang for my needs, so i created a bash-implemention of https://github.com/gotify/cli!

This is still BETA! nothing is tested on multiple platforms.

TODO:

  • STDIN support
  • error handling(i think this is fixed)
#!/bin/bash
files=(/etc/gotify/cli-bash.json $HOME/.gotify/cli-bash.json .cli-bash.json)
for filepath in "${files[@]}"
do
if [ -f $filepath ]; then
break;
fi
done
case $1 in
"init")
echo "init"
read -p 'fullUrl: ' fullurl
echo "connecting..."
response=$(curl -sSf "$fullurl/version" || echo "$?")
if (( ${#response} < 4 )); then
echo "failed."
$0 $1
exit
fi
echo "Success!"
version=$(echo $response | awk 'BEGIN { FS="\""; RS="," }; { if ($2 == "version") {print "v"$4}; if($2 == "buildDate") {print "@"$4} }' ORS='')
echo "Gotify $version"
echo ""
echo "Configure an application token"
echo "1. Enter an application-token"
echo "2. Create an application token (with user/pass)"
notselected=true
while ($notselected); do
read -p 'Enter 1 or 2 or c(ancel): ' answer
echo "answer: $answer"
if echo "$answer" | grep "1"; then
notselected=false
tokenrequest=true
read -p "Application Token: " appToken
elif echo "$answer" | grep "2"; then
notselected=false
loginrequest=true
while ($loginrequest); do
echo "Enter Credentials (only used for creating the token not saved afterwards)"
read -p 'Username: ' username
old_stty_cfg=$(stty -g)
stty -echo
read -p 'Password: ' password
stty $old_stty_cfg
echo ""
echo "connecting..."
response=$(curl -sSfu "$username:$password" "$fullurl/current/user" || echo "$?")
if (( ${#response} < 4 )); then
echo "login failed."
else
loginrequest=false
fi
done
read -p "Application name: " appname
read -p "Application description (can be empty): " appdesc
response=$(curl -sSf -X POST -H "Content-Type: application/json" -u "$username:$password" "$fullurl/application" -d "{\"description\": \"$appdesc\", \"name\": \"$appname\"}")
appToken=$(echo $response | awk 'BEGIN { FS="\""; RS="," }; { if($2 == "token") {print $4} }')
fi
echo $appToken
response=$(curl -sSf -X POST -H "Content-Type: application/json" -H "X-Gotify-Key: $appToken" "$fullurl/message" -d "{ \"message\": \"testMessage\", \"priority\": 0, \"title\": \"gotify-BASH\"}" || echo "$?")
if (( ${#response} < 4 )); then
echo "test message failed."
exit
else
tokenrequest=false
fi
while (true); do
echo "Where to put the config file?"
for i in "${!files[@]}"
do
printf "%s\t%s\n" "$(($i + 1))" "${files[$i]}"
done
read -p "Enter a number: " filenumber
if [[ "$filenumber" =~ ^[1-${#files[@]}]$ ]]; then
filepath=${files[$(($filelocation - 1))]}
break;
fi
done
mkdir -p $(dirname "$filepath")
echo -e "{\n\t\"token\": \"$appToken\",\n\t\"url\": \"$fullurl\"\n}" > $filepath
done
;;
"version"|"v"|"-v"|"--version")
echo "no version nummering used..."
;;
"config")
cat "$filepath"
;;
"push"|"p")
shift
fileData=$(cat $filepath || echo "$?")
if (( ${#fileData} < 4 )); then
echo "data file error. try $0 init"
exit
fi
token=$(echo $fileData | awk 'BEGIN { FS="\""; RS="," }; { if($2 == "token") {print $4} }')
url=$(echo $fileData | awk 'BEGIN { FS="\""; RS="," }; { if($2 == "url") {print $4} }')
title=""
priority=0
message=""
quiet=false
while [[ "$#" -gt 0 ]]; do case $1 in
-h|--help|help)
cat << EOF
NAME:
gotify-bash push - Pushes a message
USAGE:
gotify-bash push [command options] <message-text>
OPTIONS:
--priority value, -p value Set the priority (default: 0)
--title value, -t value Set the title (empty for app name)
--token value Override the app token
--url value Override the Gotify URL
--quiet, -q Do not output anything (on success)
EOF
exit
;;
-p|--priority)
priority=$2
shift
;;
--title|-t)
title=$2
shift
;;
--token)
token=$2
shift
;;
--url)
url=$2
shift
;;
-q|--quiet)
quiet=true
;;
*)
break;
;;
esac;shift;done
message=$@
if [[ "$#" -eq 0 ]]; then
echo "a message must be set as argument"
exit
fi
response=$(curl -s -w "%{http_code}" -X POST -H "Content-Type: application/json" -H "X-Gotify-Key: $token" "$url/message" -d "{\"message\": \"$message\", \"priority\": $priority, \"title\": \"$title\"}")
case ${response: -3} in
000)
echo "curl request error"
;;
200)
if ! ($quiet); then
echo "message created"
fi
;;
*)
echo "request error code ${response: -3}"
echo "response: ${response::-3}"
;;
esac
;;
"help"|"--help"|"-v"|""|*)
cat << EOF
NAME:
Gotify-bash - The unofficial bash implemention of Gotify-CLI
USAGE:
gotify-bash [global options] command [command options] [arguments...]
VERSION:
1.2.0
COMMANDS:
init Initializes the Gotify-CLI
version, v Shows the version
config Shows the config
push, p Pushes a message
help, h Shows a list of commands
GLOBAL OPTIONS:
--help, -h show help
--version, -v print the version
EOF
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment