Bruno BELANYI
eebe509b02
All checks were successful
continuous-integration/drone/push Build is passing
188 lines
5 KiB
Bash
Executable file
188 lines
5 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
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 " -f, --format"
|
|
print_err " should the message be formatted using 'pandoc'."
|
|
print_err " Must be either 'true' or 'false'."
|
|
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 " 'CI_PIPELINE_STATUS'/'DRONE_BUILD_STATUS' indicates a failure."
|
|
}
|
|
|
|
# Blessed Stack Overflow
|
|
rawurlencode() {
|
|
(set +x
|
|
local string="${1}"
|
|
local strlen=${#string}
|
|
local encoded=""
|
|
local pos c o
|
|
|
|
for ((pos=0 ; pos<strlen; pos++)); do
|
|
c=${string:$pos:1}
|
|
case "$c" in
|
|
[-_.~a-zA-Z0-9] ) o="$c" ;;
|
|
* ) printf -v o '%%%02x' "'$c"
|
|
esac
|
|
encoded+="$o"
|
|
done
|
|
echo "$encoded")
|
|
}
|
|
|
|
default_woodpecker_message() {
|
|
local msg="Build ${CI_PIPELINE_STATUS}"
|
|
local woodpecker_url="${CI_SYSTEM_LINK}/${CI_REPO}/${CI_PIPELINE_NUMBER}"
|
|
if [ "$FORMAT" == "true" ]; then
|
|
msg="$msg [${CI_REPO}#${CI_COMMIT_SHA:0:8}]($woodpecker_url)"
|
|
else
|
|
msg="$msg $woodpecker_url"
|
|
fi
|
|
msg="$msg (${CI_COMMIT_TAG:-$CI_COMMIT_BRANCH})"
|
|
printf '%s' "$msg"
|
|
}
|
|
|
|
default_drone_message() {
|
|
local msg="Build ${DRONE_BUILD_STATUS}"
|
|
local drone_url="${DRONE_SYSTEM_PROTO}://${DRONE_SYSTEM_HOST}/${DRONE_REPO}/${DRONE_BUILD_NUMBER}"
|
|
if [ "$FORMAT" == "true" ]; then
|
|
msg="$msg [${DRONE_REPO_OWNER}/${DRONE_REPO_NAME}#${DRONE_COMMIT:0:8}]($drone_url)"
|
|
else
|
|
msg="$msg $drone_url"
|
|
fi
|
|
msg="$msg (${DRONE_TAG:-$DRONE_BRANCH})"
|
|
printf '%s' "$msg"
|
|
}
|
|
|
|
ensure_variables() {
|
|
if [ "$CI" == "woodpecker" ] && [ -z "$MESSAGE" ]; then
|
|
MESSAGE="$(default_woodpecker_message)"
|
|
elif [ "$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
|
|
}
|
|
|
|
get_message_type() {
|
|
if [ "$MSG_TYPE" == "auto" ]; then
|
|
if [ "$CI_PIPELINE_STATUS" == "failure" ]; then
|
|
MSG_TYPE="text"
|
|
elif [ "$DRONE_BUILD_STATUS" == "failure" ]; then
|
|
MSG_TYPE="text"
|
|
else
|
|
MSG_TYPE="notice"
|
|
fi
|
|
fi
|
|
|
|
printf '%s' "m.$MSG_TYPE"
|
|
}
|
|
|
|
make_message_json() {
|
|
{
|
|
printf '%s' "$1" |
|
|
jq --raw-input --slurp "{msgtype: \"$(get_message_type)\", body: .}"
|
|
[ "$FORMAT" == "true" ] && printf '%s' "$1" |
|
|
pandoc |
|
|
jq --raw-input --slurp "{format: \"org.matrix.custom.html\", formatted_body: .}"
|
|
} | jq -s 'add'
|
|
}
|
|
|
|
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)"
|
|
|
|
if [ -z "$token" ] || [ "$token" == "null" ]; then
|
|
print_err "Error during login"
|
|
exit 1
|
|
fi
|
|
|
|
message_json="$(make_message_json "$MESSAGE")"
|
|
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'
|
|
FORMAT='true'
|
|
|
|
while [ $# -gt 0 ]; do
|
|
opt="$1"
|
|
shift
|
|
|
|
case "$opt" in
|
|
-f|--format)
|
|
arg="$1"
|
|
shift
|
|
|
|
if [ "$arg" == "true" ] || [ "$arg" == "false" ]; then
|
|
FORMAT="$arg"
|
|
continue
|
|
fi
|
|
|
|
print_err "Must give value 'true' or 'false' with '-t|--type'"
|
|
exit 1
|
|
;;
|
|
-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
|