- Added Cell Locking Scheduler UI improvements - Fixed change_sms_code.sh to properly exit - Added an experimental feature: Keep-alive - Added disable state for speedtest when keep-alive is active Co-Authored-By: Russel Yasol <73575327+dr-dolomite@users.noreply.github.com>
195 lines
5.8 KiB
Bash
Executable File
195 lines
5.8 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Configuration
|
|
CONFIG_FILE="/etc/keep_alive_schedule.conf"
|
|
STATUS_FILE="/tmp/keep_alive_status"
|
|
SPEEDTEST_SCRIPT="/www/cgi-bin/home/speedtest/speedtest.sh"
|
|
|
|
# Function to convert HH:MM to minutes since midnight
|
|
time_to_minutes() {
|
|
echo "$1" | awk -F: '{print $1 * 60 + $2}'
|
|
}
|
|
|
|
# Function to validate time interval
|
|
validate_interval() {
|
|
START_TIME=$1
|
|
END_TIME=$2
|
|
INTERVAL_MINUTES=$3
|
|
|
|
# Convert times to minutes
|
|
START_MINUTES=$(time_to_minutes "$START_TIME")
|
|
END_MINUTES=$(time_to_minutes "$END_TIME")
|
|
|
|
# Calculate duration between start and end time
|
|
if [ $END_MINUTES -lt $START_MINUTES ]; then
|
|
# Handle case where end time is on the next day
|
|
DURATION=$((1440 - START_MINUTES + END_MINUTES))
|
|
else
|
|
DURATION=$((END_MINUTES - START_MINUTES))
|
|
fi
|
|
|
|
# Check if interval is longer than duration
|
|
if [ $INTERVAL_MINUTES -gt $DURATION ]; then
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
# Function to generate cron time expression
|
|
generate_cron_time() {
|
|
START_TIME=$1
|
|
END_TIME=$2
|
|
INTERVAL=$3
|
|
|
|
START_HOUR=$(echo "$START_TIME" | cut -d: -f1 | sed 's/^0//')
|
|
START_MIN=$(echo "$START_TIME" | cut -d: -f2)
|
|
END_HOUR=$(echo "$END_TIME" | cut -d: -f1 | sed 's/^0//')
|
|
END_MIN=$(echo "$END_TIME" | cut -d: -f2)
|
|
|
|
# If end time is less than start time, it means we cross midnight
|
|
if [ $(time_to_minutes "$END_TIME") -lt $(time_to_minutes "$START_TIME") ]; then
|
|
# Create two cron entries for before and after midnight
|
|
echo "*/$INTERVAL $START_HOUR-23 * * * $SPEEDTEST_SCRIPT"
|
|
echo "*/$INTERVAL 0-$((END_HOUR - 1)) * * * $SPEEDTEST_SCRIPT"
|
|
else
|
|
echo "*/$INTERVAL $START_HOUR-$((END_HOUR - 1)) * * * $SPEEDTEST_SCRIPT"
|
|
fi
|
|
}
|
|
|
|
# Function to urldecode
|
|
urldecode() {
|
|
echo -e "$(echo "$1" | sed 's/+/ /g;s/%\([0-9A-F][0-9A-F]\)/\\x\1/g')"
|
|
}
|
|
|
|
# Function to save configuration
|
|
save_config() {
|
|
echo "START_TIME=$1" >"$CONFIG_FILE"
|
|
echo "END_TIME=$2" >>"$CONFIG_FILE"
|
|
echo "INTERVAL=$3" >>"$CONFIG_FILE"
|
|
echo "ENABLED=1" >>"$CONFIG_FILE"
|
|
}
|
|
|
|
# Function to disable scheduling
|
|
disable_scheduling() {
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
sed -i 's/ENABLED=1/ENABLED=0/' "$CONFIG_FILE"
|
|
fi
|
|
# Remove any existing cron jobs
|
|
crontab -l | grep -v "$SPEEDTEST_SCRIPT" | crontab -
|
|
}
|
|
|
|
# Function to get current status
|
|
get_status() {
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
ENABLED=$(grep "ENABLED=" "$CONFIG_FILE" | cut -d'=' -f2)
|
|
START_TIME=$(grep "START_TIME=" "$CONFIG_FILE" | cut -d'=' -f2)
|
|
END_TIME=$(grep "END_TIME=" "$CONFIG_FILE" | cut -d'=' -f2)
|
|
INTERVAL=$(grep "INTERVAL=" "$CONFIG_FILE" | cut -d'=' -f2)
|
|
|
|
echo "Status: 200 OK"
|
|
echo "Content-Type: application/json"
|
|
echo ""
|
|
echo "{\"enabled\":$ENABLED,\"start_time\":\"$START_TIME\",\"end_time\":\"$END_TIME\",\"interval\":$INTERVAL}"
|
|
else
|
|
echo "Status: 200 OK"
|
|
echo "Content-Type: application/json"
|
|
echo ""
|
|
echo "{\"enabled\":0,\"start_time\":\"\",\"end_time\":\"\",\"interval\":0}"
|
|
fi
|
|
}
|
|
|
|
# Handle POST requests
|
|
if [ "$REQUEST_METHOD" = "POST" ]; then
|
|
# Read POST data
|
|
read -r POST_DATA
|
|
|
|
# Check if disabling is requested
|
|
echo "$POST_DATA" | grep -q "disable=true"
|
|
if [ $? -eq 0 ]; then
|
|
disable_scheduling
|
|
echo "Status: 200 OK"
|
|
echo "Content-Type: application/json"
|
|
echo ""
|
|
echo "{\"status\":\"success\",\"message\":\"Scheduling disabled\"}"
|
|
exit 0
|
|
fi
|
|
|
|
# Extract times and interval
|
|
START_TIME=$(echo "$POST_DATA" | grep -o 'start_time=[^&]*' | cut -d'=' -f2)
|
|
END_TIME=$(echo "$POST_DATA" | grep -o 'end_time=[^&]*' | cut -d'=' -f2)
|
|
INTERVAL=$(echo "$POST_DATA" | grep -o 'interval=[^&]*' | cut -d'=' -f2)
|
|
|
|
# Decode times
|
|
START_TIME=$(urldecode "$START_TIME")
|
|
END_TIME=$(urldecode "$END_TIME")
|
|
INTERVAL=$(urldecode "$INTERVAL")
|
|
|
|
# Validate times
|
|
if [ -z "$START_TIME" ] || [ -z "$END_TIME" ] || [ -z "$INTERVAL" ]; then
|
|
echo "Status: 400 Bad Request"
|
|
echo "Content-Type: application/json"
|
|
echo ""
|
|
echo "{\"error\":\"Missing start time, end time, or interval\"}"
|
|
exit 1
|
|
fi
|
|
|
|
# Validate interval is a number
|
|
if ! echo "$INTERVAL" | grep -q '^[0-9]\+$'; then
|
|
echo "Status: 400 Bad Request"
|
|
echo "Content-Type: application/json"
|
|
echo ""
|
|
echo "{\"error\":\"Interval must be a number in minutes\"}"
|
|
exit 1
|
|
fi
|
|
|
|
# Validate interval
|
|
if ! validate_interval "$START_TIME" "$END_TIME" "$INTERVAL"; then
|
|
echo "Status: 400 Bad Request"
|
|
echo "Content-Type: application/json"
|
|
echo ""
|
|
echo "{\"error\":\"Interval is longer than the time between start and end time\"}"
|
|
exit 1
|
|
fi
|
|
|
|
# Create temporary file for new crontab
|
|
TEMP_CRON=$(mktemp)
|
|
|
|
# Get existing crontab entries (excluding our script)
|
|
crontab -l 2>/dev/null | grep -v "$SPEEDTEST_SCRIPT" >"$TEMP_CRON"
|
|
|
|
# Generate and add cron entries
|
|
generate_cron_time "$START_TIME" "$END_TIME" "$INTERVAL" >>"$TEMP_CRON"
|
|
|
|
# Install new crontab
|
|
crontab "$TEMP_CRON"
|
|
rm "$TEMP_CRON"
|
|
|
|
# Save configuration
|
|
save_config "$START_TIME" "$END_TIME" "$INTERVAL"
|
|
|
|
echo "Status: 200 OK"
|
|
echo "Content-Type: application/json"
|
|
echo ""
|
|
echo "{\"status\":\"success\",\"message\":\"Keep-alive scheduling enabled\"}"
|
|
exit 0
|
|
fi
|
|
|
|
# Parse query string for GET requests
|
|
if [ "$REQUEST_METHOD" = "GET" ]; then
|
|
QUERY_STRING=$(echo "$QUERY_STRING" | sed 's/&/\n/g')
|
|
for param in $QUERY_STRING; do
|
|
case "$param" in
|
|
status=*)
|
|
get_status
|
|
exit 0
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
|
|
# If no valid request is made
|
|
echo "Status: 400 Bad Request"
|
|
echo "Content-Type: application/json"
|
|
echo ""
|
|
echo "{\"error\":\"Invalid request\"}"
|
|
exit 1 |