用户工具

站点工具


homelab

这是本文档旧的修订版!


Homelab

HomeLab IP 提醒脚本

``` #!/bin/bash

LOG_FILE=“/tmp/notify-ip.log” BARK_TITLE=“北京 daheng 内网 IP 报告” BARK_GROUP=“Server IP 提醒” RETRY_COUNT=0 MAX_RETRIES=60 BARK_PUSH_URL=“” BARK_DEVICE_KEY=“”

log() {

  local level="$1"
  shift
  printf '%s [%s] %s\n' "$(date '+%Y-%m-%dT%H:%M:%S%z')" "$level" "$*" >> "$LOG_FILE"

}

MISSING_CONFIG=() if [ -z “${BARK_PUSH_URL:-}” ]; then

  MISSING_CONFIG+=("BARK_PUSH_URL")

fi if [ -z “${BARK_DEVICE_KEY:-}” ]; then

  MISSING_CONFIG+=("BARK_DEVICE_KEY")

fi if [ “${#MISSING_CONFIG[@]}” -gt 0 ]; then

  log ERROR "Missing required Bark config: ${MISSING_CONFIG[*]}"
  exit 1

fi

if ! command -v python3 > /dev/null 2>&1; then

  log ERROR "python3 is required to build the Bark payload"
  exit 1

fi

if ! command -v curl > /dev/null 2>&1; then

  log ERROR "curl is required to send the Bark notification"
  exit 1

fi

log INFO “Waiting for network connectivity; max retries: ${MAX_RETRIES}” while ! ping -c 1 -W 1 8.8.8.8 > /dev/null 2>&1; do

  RETRY_COUNT=$((RETRY_COUNT + 1))
  if [ "$RETRY_COUNT" -ge "$MAX_RETRIES" ]; then
      log ERROR "Network timeout after ${MAX_RETRIES} attempts, exiting"
      exit 1
  fi
  if [ $((RETRY_COUNT % 10)) -eq 0 ]; then
      log INFO "Network still unavailable after ${RETRY_COUNT} attempts"
  fi
  sleep 1

done log INFO “Network connectivity confirmed after ${RETRY_COUNT} attempts”

INTERNAL_IPS=$(ip -4 addr show | awk '/ inet / { split($2, ip, “/”); if (ip[1] !~ /^127\./) print ip[1] }')

if [ -z “$INTERNAL_IPS” ]; then

  MESSAGE="无法获取内网 IP 地址。"

else

  MESSAGE="主机内网 IP 地址:$(printf '%s\n' "$INTERNAL_IPS" | tr '\n' ' ')"

fi

JSON_PAYLOAD=$(

  BARK_TITLE="$BARK_TITLE" \
  BARK_BODY="$MESSAGE" \
  BARK_DEVICE_KEY="$BARK_DEVICE_KEY" \
  BARK_GROUP="$BARK_GROUP" \
  python3 - <<'PY'

import json import os

payload = {

  "title": os.environ["BARK_TITLE"],
  "body": os.environ["BARK_BODY"],
  "device_key": os.environ["BARK_DEVICE_KEY"],
  "group": os.environ["BARK_GROUP"],

}

print(json.dumps(payload, ensure_ascii=False)) PY )

RESPONSE_FILE=$(mktemp) log INFO “Sending Bark notification” HTTP_STATUS=$(

  curl -sS -o "$RESPONSE_FILE" -w '%{http_code}' \
      -X POST "$BARK_PUSH_URL" \
      -H 'Content-Type: application/json; charset=utf-8' \
      --data-binary "$JSON_PAYLOAD" 2>> "$LOG_FILE"

) CURL_EXIT=$? RESPONSE_BODY=$(cat “$RESPONSE_FILE”) rm -f “$RESPONSE_FILE”

log INFO “Bark HTTP status: ${HTTP_STATUS:-unknown}” log INFO “Bark response body: ${RESPONSE_BODY:-<empty>}”

if [ “$CURL_EXIT” -ne 0 ]; then

  log ERROR "Bark notification failed with curl exit code ${CURL_EXIT}"
  exit "$CURL_EXIT"

fi

case “$HTTP_STATUS” in

  2*)
      log INFO "Bark notification sent successfully"
      ;;
  *)
      log ERROR "Bark notification returned non-success HTTP status: ${HTTP_STATUS:-unknown}"
      exit 1
      ;;

esac

echo “Attempted to send Bark notification.” ```

/storage/data/attic/homelab.1782780404.txt.gz · 最后更改: bestony

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki