From 305dd464f8a86f1296cb50707b7b62356ed0730a Mon Sep 17 00:00:00 2001 From: Jens Franik Date: Thu, 22 Jan 2026 21:00:21 +0100 Subject: [PATCH] added shack plenum script --- linux/shack-check-plenum-agenda-cron.sh | 84 +++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 linux/shack-check-plenum-agenda-cron.sh diff --git a/linux/shack-check-plenum-agenda-cron.sh b/linux/shack-check-plenum-agenda-cron.sh new file mode 100755 index 0000000..5c0f679 --- /dev/null +++ b/linux/shack-check-plenum-agenda-cron.sh @@ -0,0 +1,84 @@ +#!/bin/bash +export LC_ALL=C.UTF-8 +export LANG=C.UTF-8 + +# --- CONFIGURATION HEADER --- +TARGET_DIR="/data/privat/s/shackspace.de/data/plenum/agenda_files" +API_URL='https://api.shackspace.de/v1/plena/next' +WIKI_BASE="https://wiki.shackspace.de/plenum" +TODAY=$(date +%Y-%m-%d) +TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S) +GLOB_PATTERN="agenda_${TODAY}_[0-9][0-9]-[0-9][0-9]-[0-9][0-9].txt" + +# Default flag states +SHOW_NO_PLENUM=0 +SHOW_NEXT_DATE=0 +FORCE_CONTENT=0 +FORCE_DUMP=0 + +# --- PARSE FLAGS --- +while getopts "pnvf" opt; do + case $opt in + p) SHOW_NO_PLENUM=1 ;; + n) SHOW_NEXT_DATE=1 ;; + v) FORCE_CONTENT=1 ;; + f) FORCE_DUMP=1 ;; + *) echo "Usage: $0 [-p] [-n] [-v] [-f]"; exit 1 ;; + esac +done + +# --- DATA FETCHING --- +RAW=$(curl -s "$API_URL") +[[ -z "$RAW" ]] && { echo "Error: API unreachable." >&2; exit 1; } + +ISO_DATE=$(jq -r .date <<<"$RAW" | tr -d 'Z') +FILE_DATE=$(date -d "$ISO_DATE" +%Y-%m-%d) +URL_API=$(jq -r .url <<<"$RAW") + +# Use today's date for URL if -f is active, otherwise use API URL +[[ $FORCE_DUMP -eq 1 ]] && FETCH_DATE="$TODAY" || FETCH_DATE="$FILE_DATE" +[[ $FORCE_DUMP -eq 1 ]] && URL="${WIKI_BASE}/${TODAY}" || URL="$URL_API" + +CONTENT=$(curl -s "$URL" | w3m -dump -T text/html -I UTF-8 -O UTF-8 | sed -n "/^Plenum $FETCH_DATE/,/^Seiten-Werkzeuge/p" | sed '/^Seiten-Werkzeuge/d') +[[ $(grep -q "Dieses Thema existiert noch nicht" <<< "$CONTENT"; echo $?) -eq 0 ]] && CONTENT="" + +# --- FILE CHECK --- +EXISTING_COUNT=$(ls -la "${TARGET_DIR}"/${GLOB_PATTERN} 2>/dev/null | wc -l) + +# --- GIT FUNCTION (TOTALLY SILENT) --- +git_sync() { + local file=$1 + if [[ -d "$TARGET_DIR" ]] && [[ -d "${TARGET_DIR}/.git" ]]; then + pushd "$TARGET_DIR" > /dev/null + git add "$file" > /dev/null 2>&1 + git commit -q -m "auto: add $file" > /dev/null 2>&1 + git push -q origin main > /dev/null 2>&1 + popd > /dev/null + fi +} + +# --- MAIN LOGIC --- +if [[ "$FORCE_DUMP" -eq 1 ]]; then + # SILENT DUMP: Only if a file for today already exists + if [[ $EXISTING_COUNT -gt 0 && -n "$CONTENT" ]]; then + FILENAME="agenda_$TIMESTAMP.txt" + echo "$CONTENT" > "${TARGET_DIR}/$FILENAME" + git_sync "$FILENAME" + fi +elif [[ "$FILE_DATE" == "$TODAY" ]]; then + # Standard daily dump (first run) + if [[ $EXISTING_COUNT -eq 0 && -n "$CONTENT" ]]; then + FILENAME="agenda_$TIMESTAMP.txt" + echo "$CONTENT" > "${TARGET_DIR}/$FILENAME" + echo "$CONTENT" + git_sync "$FILENAME" + fi +else + [[ $SHOW_NO_PLENUM -eq 1 ]] && echo "There is no Plenum today" + [[ $SHOW_NEXT_DATE -eq 1 ]] && echo "Next Plenum on $(date -d "$ISO_DATE" '+%a, %Y-%m-%d')" +fi + +if [[ $FORCE_CONTENT -eq 1 && -n "$CONTENT" && "$FETCH_DATE" != "$TODAY" ]]; then + echo "--- Forced Content Output ($FETCH_DATE) ---" + echo "$CONTENT" +fi