diff --git a/CHANGELOG.md b/CHANGELOG.md index f123d6ba..73e9f2e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The **patch** part changes incrementally at each release. ### Changed * evocheck : version 19.04 from upstream +* evomaintenance : use the web API instead of PG Insert ### Fixed diff --git a/evomaintenance/defaults/main.yml b/evomaintenance/defaults/main.yml index 462f25a6..b0a6e361 100644 --- a/evomaintenance/defaults/main.yml +++ b/evomaintenance/defaults/main.yml @@ -31,6 +31,9 @@ evomaintenance_urgency_tel: "06.00.00.00.00" evomaintenance_realm: "{{ evolinux_internal_domain }}" +evomaintenance_api_endpoint: Null +evomaintenance_api_key: Null + evomaintenance_default_hosts: [] evomaintenance_additional_hosts: [] evomaintenance_hosts: "{{ evomaintenance_default_hosts | union(evomaintenance_additional_hosts) | unique }}" diff --git a/evomaintenance/files/evomaintenance.sh b/evomaintenance/files/evomaintenance.sh index 723c9648..40b36625 100644 --- a/evomaintenance/files/evomaintenance.sh +++ b/evomaintenance/files/evomaintenance.sh @@ -29,15 +29,17 @@ evomaintenance is a program that helps reporting what you've done on a server Usage: evomaintenance or evomaintenance --message="add new host" - or evomaintenance --no-db --no-mail --no-commit + or evomaintenance --no-api --no-mail --no-commit or echo "add new vhost" | evomaintenance Options -m, --message=MESSAGE set the message from the command line --mail enable the mail hook (default) --no-mail disable the mail hook - --db enable the database hook (default) - --no-db disable the database hook + --db enable the database hook + --no-db disable the database hook (default) + --api enable the API hook (default) + --no-api disable the API hook --commit enable the commit hook (default) --no-commit disable the commit hook --evocheck enable evocheck execution (default) @@ -149,8 +151,8 @@ get_evocheck() { print_log() { printf "*********** %s ***************\n" "$(get_now)" print_session_data - printf "Hooks : commit=%s db=%s mail=%s\n"\ - "${HOOK_COMMIT}" "${HOOK_DB}" "${HOOK_MAIL}" + printf "Hooks : commit=%s db=%s api=%s mail=%s\n"\ + "${HOOK_COMMIT}" "${HOOK_DB}" "${HOOK_API}" "${HOOK_MAIL}" if [ "${HOOK_MAIL}" = "1" ]; then printf "Mailto : %s\n" "${EVOMAINTMAIL}" fi @@ -220,6 +222,35 @@ hook_db() { fi } +hook_api() { + if [ "${VERBOSE}" = "1" ]; then + printf "\n********** API call **************\n" + printf "curl -f -s -S -X POST [REDACTED] -k -F api_key=[REDACTED] -F action=insertEvoMaintenance -F hostname=%s -F userid=%s -F ipaddress=%s -F begin_date=%s -F end_date='now()' -F details=%s" \ + "${HOSTNAME}" "${USER}" "${IP}" "${BEGIN_DATE}" "${MESSAGE}" + printf "\n***********************************\n" + fi + + if [ "${DRY_RUN}" != "1" ] && [ -x "${CURL_BIN}" ]; then + API_RETURN_STATUS=$(curl -f -s -S -X POST \ + "${API_ENDPOINT}" -k \ + -F api_key="${API_KEY}" \ + -F action=insertEvoMaintenance \ + -F hostname="${HOSTNAME}" \ + -F userid="${USER}" \ + -F ipaddress="${IP}" \ + -F begin_date="${BEGIN_DATE}" \ + -F end_date='now()' \ + -F details="${MESSAGE}") + + # either cURL or the API backend can throw an error, otherwise it returns this JSON response + if [ "$API_RETURN_STATUS" = '{"status":"Ok"}' ]; then + echo "API call OK." + else + echo "API call FAILED." + fi + fi +} + format_mail() { cat <&1 fi +CURL_BIN=$(command -v curl) +readonly CURL_BIN +if [ -z "${CURL_BIN}" ]; then + echo "No \`curl' command has been found, can't call the API." 2>&1 +fi + +if [ -z "${API_ENDPOINT}" ]; then + echo "No API endpoint specified, can't call the API." 2>&1 +fi + EVOCHECK_BIN="/usr/share/scripts/evocheck.sh" GIT_REPOSITORIES="/etc /etc/bind" @@ -489,6 +540,9 @@ if [ "${INTERACTIVE}" = "1" ] && [ "${AUTO}" = "0" ]; then if [ "${HOOK_DB}" = "1" ]; then printf "* save metadata to the database\n" fi + if [ "${HOOK_API}" = "1" ]; then + printf "* send metadata to the API\n" + fi echo "" answer="" @@ -506,6 +560,7 @@ if [ "${INTERACTIVE}" = "1" ] && [ "${AUTO}" = "0" ]; then HOOK_COMMIT=0 HOOK_MAIL=0 HOOK_DB=0 + HOOK_API=0 AUTO=1 break ;; @@ -622,6 +677,36 @@ if [ "${INTERACTIVE}" = "1" ] && [ "${AUTO}" = "0" ]; then ;; esac done + + # API hook + if [ "${HOOK_API}" = "1" ]; then + y="Y"; n="n" + else + y="y"; n="N" + fi + answer="" + while :; do + printf "> Do you want to send the metadata to the API? [%s] " "${y},${n}" + read -r answer + case $answer in + [Yy] ) + hook_api; + break + ;; + [Nn] ) + break + ;; + "" ) + if [ "${HOOK_API}" = "1" ]; then + hook_api + fi + break + ;; + * ) + echo "answer with a valid choice" + ;; + esac + done fi # Log hook @@ -637,6 +722,9 @@ if [ "${INTERACTIVE}" = "0" ] || [ "${AUTO}" = "1" ]; then if [ "${HOOK_DB}" = "1" ]; then hook_db fi + if [ "${HOOK_API}" = "1" ]; then + hook_api + fi fi exit 0 diff --git a/evomaintenance/tasks/install_vendor_debian.yml b/evomaintenance/tasks/install_vendor_debian.yml index c39e6204..b64543c8 100644 --- a/evomaintenance/tasks/install_vendor_debian.yml +++ b/evomaintenance/tasks/install_vendor_debian.yml @@ -7,6 +7,7 @@ with_items: - postgresql-client - sudo + - curl tags: - evomaintenance diff --git a/evomaintenance/tasks/main.yml b/evomaintenance/tasks/main.yml index d0b9ba3b..5b09456e 100644 --- a/evomaintenance/tasks/main.yml +++ b/evomaintenance/tasks/main.yml @@ -5,11 +5,9 @@ - assert: that: - - evomaintenance_pg_passwd is not none - - evomaintenance_pg_db is not none - - evomaintenance_pg_table is not none - - evomaintenance_pg_host is not none - msg: evomaintenance database variables must be set + - evomaintenance_api_endpoint is not none + - evomaintenance_api_key is not none + msg: evomaintenance api variables must be set - include: install_package_debian.yml when: diff --git a/evomaintenance/templates/evomaintenance.j2 b/evomaintenance/templates/evomaintenance.j2 index acb6fd46..8888b1d6 100644 --- a/evomaintenance/templates/evomaintenance.j2 +++ b/evomaintenance/templates/evomaintenance.j2 @@ -11,3 +11,5 @@ FULLFROM="{{ evomaintenance_full_from }}" URGENCYFROM={{ evomaintenance_urgency_from }} URGENCYTEL="{{ evomaintenance_urgency_tel }}" REALM="{{ evomaintenance_realm }}" +API_ENDPOINT={{ evomaintenance_api_endpoint }} +API_KEY={{ evomaintenance_api_key }}