From 40667b162e5cc0a0cef9fe5baf6b66f3d69596a4 Mon Sep 17 00:00:00 2001 From: Whispering Wind <151555003+ReturnFI@users.noreply.github.com> Date: Sun, 29 Dec 2024 18:53:08 +0330 Subject: [PATCH] Enhance kick.sh: Add error handling and restore backup on critical errors --- core/scripts/hysteria2/kick.sh | 44 ++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/core/scripts/hysteria2/kick.sh b/core/scripts/hysteria2/kick.sh index 5c92e13..aa29ad0 100644 --- a/core/scripts/hysteria2/kick.sh +++ b/core/scripts/hysteria2/kick.sh @@ -2,6 +2,15 @@ source /etc/hysteria/core/scripts/path.sh +LOCKFILE="/tmp/kick.lock" +exec 200>$LOCKFILE +flock -n 200 || exit 1 + +LOGFILE="/var/log/kick.log" +BACKUP_FILE="${USERS_FILE}.bak" + +cp "$USERS_FILE" "$BACKUP_FILE" + kick_user() { local username=$1 local secret=$2 @@ -11,15 +20,35 @@ kick_user() { SECRET=$(jq -r '.trafficStats.secret' "$CONFIG_FILE") +if ! jq empty "$USERS_FILE"; then + echo "$(date): [ERROR] Invalid users.json. Restoring backup." >> $LOGFILE + cp "$BACKUP_FILE" "$USERS_FILE" + exit 1 +fi + +handle_error() { + echo "$(date): [ERROR] An error occurred. Restoring backup." >> $LOGFILE + cp "$BACKUP_FILE" "$USERS_FILE" + exit 1 +} + +trap handle_error ERR + for USERNAME in $(jq -r 'keys[]' "$USERS_FILE"); do + BLOCKED=$(jq -r --arg user "$USERNAME" '.[$user].blocked // false' "$USERS_FILE") + + if [ "$BLOCKED" == "true" ]; then + echo "$(date): [INFO] Skipping $USERNAME as they are already blocked." >> $LOGFILE + continue + fi + MAX_DOWNLOAD_BYTES=$(jq -r --arg user "$USERNAME" '.[$user].max_download_bytes // 0' "$USERS_FILE") EXPIRATION_DAYS=$(jq -r --arg user "$USERNAME" '.[$user].expiration_days // 0' "$USERS_FILE") ACCOUNT_CREATION_DATE=$(jq -r --arg user "$USERNAME" '.[$user].account_creation_date' "$USERS_FILE") CURRENT_DOWNLOAD_BYTES=$(jq -r --arg user "$USERNAME" '.[$user].download_bytes // 0' "$USERS_FILE") - BLOCKED=$(jq -r --arg user "$USERNAME" '.[$user].blocked // false' "$USERS_FILE") if [ -z "$ACCOUNT_CREATION_DATE" ]; then - echo "Skipping $USERNAME due to missing account creation date." + echo "$(date): [INFO] Skipping $USERNAME due to missing account creation date." >> $LOGFILE continue fi @@ -28,10 +57,17 @@ for USERNAME in $(jq -r 'keys[]' "$USERS_FILE"); do if [ "$MAX_DOWNLOAD_BYTES" -gt 0 ] && [ "$CURRENT_DOWNLOAD_BYTES" -ge 0 ] && [ "$EXPIRATION_DAYS" -gt 0 ]; then if [ "$CURRENT_DOWNLOAD_BYTES" -ge "$MAX_DOWNLOAD_BYTES" ] || [ "$CURRENT_DATE" -ge "$EXPIRATION_DATE" ]; then - jq --arg user "$USERNAME" '.[$user].blocked = true' "$USERS_FILE" > temp.json && mv temp.json "$USERS_FILE" + for i in {1..3}; do + jq --arg user "$USERNAME" '.[$user].blocked = true' "$USERS_FILE" > temp.json && mv temp.json "$USERS_FILE" && break + sleep 1 + done kick_user "$USERNAME" "$SECRET" + echo "$(date): [INFO] Blocked and kicked user $USERNAME." >> $LOGFILE fi else - echo "Skipping $USERNAME due to invalid or missing data." + echo "$(date): [INFO] Skipping $USERNAME due to invalid or missing data." >> $LOGFILE fi done + +# echo "$(date): [INFO] Kick script completed successfully." >> $LOGFILE +# exit 0