Compare commits

..

7 commits

Author SHA1 Message Date
Bruno BELANYI bad1c90d39 ci: add Drone CI
All checks were successful
continuous-integration/drone/push Build is passing
This is my first experiment to make sure I can actually use this in my
CI.
2021-06-12 19:19:35 +02:00
Bruno BELANYI dfbc17b518 matrix-notifier: use 'auto' default message type
This is the one that makes most sense in CI.
2021-06-12 19:19:26 +02:00
Bruno BELANYI 0f701ddbe2 matrix-notifier: refactor handling of message type 2021-06-12 19:19:26 +02:00
Bruno BELANYI 7b71469624 matrix-notifier: add 'auto' message type
This is useful to only ping me when the build is failing.
2021-06-12 19:19:26 +02:00
Bruno BELANYI abf66aa479 matrix-notifier: use 'notice' default message type 2021-06-12 19:19:26 +02:00
Bruno BELANYI e017deeaa7 matrix-notifier: allow specifying message type 2021-06-12 19:19:26 +02:00
Bruno BELANYI f45e1378eb matrix-notifier: add usage
And split into functions to make it more manageable.
2021-06-12 19:19:26 +02:00
2 changed files with 130 additions and 32 deletions

27
.drone.yml Normal file
View file

@ -0,0 +1,27 @@
---
kind: pipeline
type: exec
name: Matrix Notifier check
steps:
- name: Pre-commit checks
commands:
- nix flake check
- name: Notifiy
commands:
- nix run .
environment:
ADDRESS:
from_secret: matrix_homeserver
ROOM:
from_secret: matrix_roomid
USER:
from_secret: matrix_username
PASS:
from_secret: matrix_password
when:
status:
- failure
- success
...

View file

@ -4,6 +4,18 @@ print_err() {
printf "%s\n" "$1" >&2
}
usage() {
print_err "Usage: $0 [option]..."
print_err ""
print_err " -h, --help"
print_err " print this usage screen and exit"
print_err " -t, --type"
print_err " which message type should be sent must be one of"
print_err " 'text' or 'notice', or 'auto'."
print_err " The special value 'auto' defaults to 'notice', unless"
print_err " 'DRONE_BUILD_STATUS' indicates a failure."
}
# Blessed Stack Overflow
rawurlencode() {
(set +x
@ -30,41 +42,100 @@ default_drone_message() {
printf '%s' "$msg"
}
if [ "$DRONE" == "true" ] && [ -z "$MESSAGE" ]; then
MESSAGE="$(default_drone_message)"
fi
ensure_variables() {
if [ "$DRONE" == "true" ] && [ -z "$MESSAGE" ]; then
MESSAGE="$(default_drone_message)"
fi
if [ -z "$USER" ] || [ -z "$PASS" ]; then
print_err "You must provide USER and PASS"
exit 1
elif [ -z "$ADDRESS" ] || [ -z "$ROOM" ]; then
print_err "You must provide ADDRESS and ROOM"
exit 1
elif [ -z "$MESSAGE" ]; then
print_err "You must provide MESSAGE"
exit 1
fi
if [ -z "$USER" ] || [ -z "$PASS" ]; then
print_err "You must provide USER and PASS"
exit 1
elif [ -z "$ADDRESS" ] || [ -z "$ROOM" ]; then
print_err "You must provide ADDRESS and ROOM"
exit 1
elif [ -z "$MESSAGE" ]; then
print_err "You must provide MESSAGE"
exit 1
fi
}
if [ "$(curl -XGET "$ADDRESS/_matrix/client/r0/login" 2>/dev/null |
jq 'any(.flows[].type; .== "m.login.password")')" != "true" ]; then
print_err "Login method not supported"
exit 1
fi
get_message_type() {
if [ "$MSG_TYPE" == "auto" ]; then
if [ "$DRONE_BUILD_STATUS" == "failure" ]; then
MSG_TYPE="text"
else
MSG_TYPE="notice"
fi
fi
printf '%s' "m.$MSG_TYPE"
}
send_message() {
local login_json
local token
local message_json
if [ "$(curl -XGET "$ADDRESS/_matrix/client/r0/login" 2>/dev/null |
jq 'any(.flows[].type; .== "m.login.password")')" != "true" ]; then
print_err "Login method not supported"
exit 1
fi
LOGIN_JSON="$(printf '%s\n%s' "$USER" "$PASS" |
jq -Rn '[inputs] | {type: "m.login.password", user: .[0], password: .[1]}')" &>/dev/null
TOKEN="$(curl -XPOST \
-d "$LOGIN_JSON" \
"$ADDRESS/_matrix/client/r0/login" 2>/dev/null| jq .access_token --raw-output)"
login_json="$(printf '%s\n%s' "$USER" "$PASS" |
jq -Rn '[inputs] | {type: "m.login.password", user: .[0], password: .[1]}')" &>/dev/null
token="$(curl -XPOST \
-d "$login_json" \
"$ADDRESS/_matrix/client/r0/login" 2>/dev/null| jq .access_token --raw-output)"
if [ -z "$TOKEN" ] || [ "$TOKEN" == "null" ]; then
print_err "Error during login"
exit 1
fi
if [ -z "$token" ] || [ "$token" == "null" ]; then
print_err "Error during login"
exit 1
fi
MESSAGE_JSON="$(printf '%s' "$MESSAGE" |
jq --raw-input --slurp '{msgtype: "m.text", body: .}')"
curl -XPOST \
-d "$MESSAGE_JSON" \
"$ADDRESS/_matrix/client/r0/rooms/$(rawurlencode "$ROOM")/send/m.room.message?access_token=$(rawurlencode "$TOKEN")" 2>/dev/null
message_json="$(printf '%s' "$MESSAGE" |
jq --raw-input --slurp "{msgtype: \"$(get_message_type)\", body: .}")"
curl -XPOST \
-d "$message_json" \
"$ADDRESS/_matrix/client/r0/rooms/$(rawurlencode "$ROOM")/send/m.room.message?access_token=$(rawurlencode "$token")" 2>/dev/null
}
MSG_TYPE='auto'
while [ $# -gt 0 ]; do
opt="$1"
shift
case "$opt" in
-t|--type)
arg="$1"
shift
if [ -z "$arg" ]; then
print_err "Must give a message type when using '-t|--type'"
exit 1
fi
for type in text notice auto; do
if [ "$arg" == "$type" ]; then
continue 2 # Go to next argument
fi
done
print_err "Invalid message type '$arg'"
exit 1
;;
-h|--help)
usage
exit
;;
*)
print_err "Unknown argument '$opt'"
usage
exit 1
;;
esac
done
ensure_variables
send_message