chch_api/chch-status.sh

105 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
SSH_IP="127.0.0.1"
SSHPORT="2322"
SSH_USER="command"
SSH_SUCCESS_FILE="/tmp/chch-status_ssh-success"
JSON_FILE="/var/www/chch_api/chch.json"
JSON_FILE_TEMPL="$SCRIPT_DIR/include/chch.json.template"
JSON_FILE_TMP="$(mktemp)"
STATUS_FILE="/tmp/chch-status"
STATUS_OPEN="geöffnet"
STATUS_CLOSED="geschlossen"
STATUS_NULL="unbekannt"
STATUS_NULL_DELAY_MINUTES=10
STATUS_NULL_TIMEOUT_MINUTES=180
STATUS_MSG_CLOSED="Geschlossen | Closed"
STATUS_MSG_OPEN="Geöffnet | Open"
YAMMAT_JSON_URL="http://localhost:9991/backup/inventory.json"
BEVERAGE_SUPPLY_TMP="/tmp/chch-beverage-supply-tmp"
WIKI_PATH="/var/www/chch/"
WIKI_IMAGE_CLOSED="ChCh_closed.png"
WIKI_IMAGE_OPEN="ChCh_open.png"
WIKI_MAIN_PAGE="Hauptseite"
WIKI_STATUS_PAGE="Aktueller_ChCh-Öffnungsstatus"
find "$SSH_SUCCESS_FILE" -mmin +$STATUS_NULL_TIMEOUT_MINUTES -exec rm "$STATUS_FILE" \; 2>/dev/null
OLD_STATUS="$(cat "$STATUS_FILE" 2>/dev/null)"
STATUS="$(echo status | ssh -q -p $SSHPORT $SSH_USER@$SSH_IP 2>/dev/null)"
if [ -z "$STATUS" ]; then
if [ -f "$SSH_SUCCESS_FILE" ] && test "$(find "$SSH_SUCCESS_FILE" -mmin -$STATUS_NULL_DELAY_MINUTES -mmin +0)"; then
STATUS="$OLD_STATUS"
[ -z "$STATUS" ] && STATUS="$STATUS_NULL"
else
STATUS="$STATUS_NULL"
fi
else
touch "$SSH_SUCCESS_FILE"
fi
TIMESTAMP_LASTCHANGE=$(stat -c '%Y' "$STATUS_FILE" 2>/dev/null) || TIMESTAMP_LASTCHANGE=$(date +%s)
[ "$STATUS" != "$STATUS_NULL" ] && printf "%s\n" "$STATUS" > "$STATUS_FILE"
if [ "$STATUS" == "$OLD_STATUS" ] || [ "$STATUS" == "$STATUS_NULL" ]; then
touch --date=@"$TIMESTAMP_LASTCHANGE" "$STATUS_FILE"
else
TIMESTAMP_LASTCHANGE=$(stat -c '%Y' "$STATUS_FILE" 2>/dev/null)
fi
TIMESTAMP_LASTCHANGE_DATE="$(date -d "@$TIMESTAMP_LASTCHANGE" "+%H:%M (%d.%m.%Y)")"
API_STATUS="null"
API_STATUS_MSG="$STATUS_MSG_CLOSED"
WIKI_STATUS="{{Noframeright|[[File:$WIKI_IMAGE_CLOSED|link=]]|'''unbekannt'''}}"
case $STATUS in
$STATUS_OPEN)
API_STATUS="true"
WIKI_STATUS="{{Noframeright|[[File:$WIKI_IMAGE_OPEN|link=]]|'''$STATUS'''<br>seit&nbsp;$TIMESTAMP_LASTCHANGE_DATE}}"
API_STATUS_MSG="$STATUS_MSG_OPEN"
;;
$STATUS_CLOSED)
API_STATUS="false"
API_STATUS_MSG="$STATUS_MSG_CLOSED"
WIKI_STATUS="{{Noframeright|[[File:$WIKI_IMAGE_CLOSED|link=]]|'''$STATUS'''<br>seit&nbsp;$TIMESTAMP_LASTCHANGE_DATE}}"
;;
$STATUS_NULL)
API_STATUS="null"
STATUS_="'''Öffnungsstatus unbekannt'''"
IMAGE="$WIKI_IMAGE_CLOSED"
WIKI_STATUS_SINCE=""
if [ -f "$STATUS_FILE" ]; then
case $(head -n1 "$STATUS_FILE") in
$STATUS_OPEN)
STATUS_="'''unbekannt'''<br>zuletzt&nbsp;war&nbsp;$STATUS_OPEN"
IMAGE="$WIKI_IMAGE_OPEN"
WIKI_STATUS_SINCE="<br>seit&nbsp;$TIMESTAMP_LASTCHANGE_DATE"
;;
$STATUS_CLOSED)
STATUS_="'''unbekannt'''<br>zuletzt&nbsp;war&nbsp;$STATUS_CLOSED"
IMAGE="$WIKI_IMAGE_CLOSED"
WIKI_STATUS_SINCE="<br>seit&nbsp;$TIMESTAMP_LASTCHANGE_DATE"
;;
esac
fi
API_STATUS_MSG="$STATUS_MSG_CLOSED"
WIKI_STATUS="{{Noframeright|[[File:$IMAGE|link=]]|${STATUS_}$WIKI_STATUS_SINCE}}"
;;
esac
BEVERAGE_SUPPLY="$(wget -O- "$YAMMAT_JSON_URL" 2>/dev/null | jq -rc "[ .[] | select( . | .amount > 0 ) | { value: .amount, unit: \"btl\", name: .name, description: ([(.price/100), \"€\"]|join(\" \")) } ]")"
if [ -z "$BEVERAGE_SUPPLY" ]; then
BEVERAGE_SUPPLY="$(cat $BEVERAGE_SUPPLY_TMP)"
else
echo "$BEVERAGE_SUPPLY" > "$BEVERAGE_SUPPLY_TMP"
fi
# The status file for spaceapi.ccc.de and for our IRC bot.
sed "s/%%STATUS%%/${API_STATUS}/;s/%%MESSAGE%%/${API_STATUS_MSG}/;s/%%LASTCHANGE%%/${TIMESTAMP_LASTCHANGE}/;s/%%BEVERAGE_SUPPLY%%/${BEVERAGE_SUPPLY}/" "$JSON_FILE_TEMPL" | jq . > "$JSON_FILE_TMP"
chown --reference="$JSON_FILE_TEMPL" "$JSON_FILE_TMP"
chmod --reference="$JSON_FILE_TEMPL" "$JSON_FILE_TMP"
mv "$JSON_FILE_TMP" "$JSON_FILE"
echo -n "$WIKI_STATUS" | php "$WIKI_PATH/maintenance/edit.php" -m -b --no-rc -s "$STATUS" "$WIKI_STATUS_PAGE" >> /dev/null 2>&1
echo "$WIKI_MAIN_PAGE" | php "$WIKI_PATH/maintenance/purgeList.php" --purge >> /dev/null 2>&1