Sync outdated speedtest scripts
This commit is contained in:
@@ -1,71 +1,29 @@
|
||||
#!/bin/sh
|
||||
# Location: /www/cgi-bin/quecmanager/home/speedtest/speedtest_status.sh
|
||||
|
||||
# Configuration
|
||||
STATUS_FILE="/tmp/speedtest_status.json"
|
||||
FINAL_RESULT="/tmp/speedtest_final.json"
|
||||
PID_FILE="/tmp/speedtest.pid"
|
||||
|
||||
# Set headers
|
||||
echo "Content-Type: application/json"
|
||||
echo "Cache-Control: no-cache, no-store, must-revalidate"
|
||||
echo "Pragma: no-cache"
|
||||
echo "Expires: 0"
|
||||
echo ""
|
||||
|
||||
# Function to return file content if it's a valid result
|
||||
return_if_result() {
|
||||
local file="$1"
|
||||
if [ -f "$file" ] && [ -r "$file" ] && [ -s "$file" ]; then
|
||||
if grep -q '"type":"result"' "$file" 2>/dev/null; then
|
||||
cat "$file"
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Function to check if process is running
|
||||
is_process_running() {
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
PID=$(cat "$PID_FILE" 2>/dev/null)
|
||||
if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
# Priority 1: Check FINAL_RESULT file first
|
||||
if return_if_result "$FINAL_RESULT"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Priority 2: Check STATUS_FILE for completed result
|
||||
if return_if_result "$STATUS_FILE"; then
|
||||
# Copy to final result for future requests
|
||||
cp "$STATUS_FILE" "$FINAL_RESULT" 2>/dev/null
|
||||
chmod 644 "$FINAL_RESULT" 2>/dev/null
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Priority 3: If process is running, return current status
|
||||
if is_process_running; then
|
||||
if [ -f "$STATUS_FILE" ] && [ -r "$STATUS_FILE" ] && [ -s "$STATUS_FILE" ]; then
|
||||
cat "$STATUS_FILE"
|
||||
# Check if the test is completed and we have a final result
|
||||
if [ -f "$FINAL_RESULT" ] && [ -r "$FINAL_RESULT" ] && [ -s "$FINAL_RESULT" ]; then
|
||||
# Return the saved final result
|
||||
cat $FINAL_RESULT
|
||||
elif [ -f "$STATUS_FILE" ]; then
|
||||
# Check if the file is readable and not empty
|
||||
if [ -r "$STATUS_FILE" ] && [ -s "$STATUS_FILE" ]; then
|
||||
# Return current status if test is running
|
||||
cat $STATUS_FILE
|
||||
else
|
||||
echo '{"status":"running","message":"Test in progress...","timestamp":'$(date +%s)'}'
|
||||
# File exists but is empty or not readable
|
||||
echo '{"status": "pending", "message": "Test initializing..."}'
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Priority 4: Check for error status
|
||||
if [ -f "$STATUS_FILE" ] && [ -r "$STATUS_FILE" ] && [ -s "$STATUS_FILE" ]; then
|
||||
if grep -q '"status":"error"' "$STATUS_FILE" 2>/dev/null; then
|
||||
cat "$STATUS_FILE"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
# Default: No test running
|
||||
echo '{"status":"not_running","timestamp":'$(date +%s)'}'
|
||||
else
|
||||
# Indicate no active test
|
||||
echo '{"status": "not_running"}'
|
||||
fi
|
||||
@@ -1,118 +1,36 @@
|
||||
#!/bin/sh
|
||||
# Location: /www/cgi-bin/quecmanager/home/speedtest/start_speedtest.sh
|
||||
|
||||
# Configuration
|
||||
STATUS_FILE="/tmp/speedtest_status.json"
|
||||
FINAL_RESULT="/tmp/speedtest_final.json"
|
||||
PID_FILE="/tmp/speedtest.pid"
|
||||
LOG_FILE="/tmp/speedtest.log"
|
||||
TIMEOUT=300 # 5 minutes timeout
|
||||
|
||||
# Set content type header
|
||||
echo "Content-Type: application/json"
|
||||
echo ""
|
||||
|
||||
# Function to cleanup on exit
|
||||
cleanup() {
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
PID=$(cat "$PID_FILE" 2>/dev/null)
|
||||
if [ -n "$PID" ]; then
|
||||
kill "$PID" 2>/dev/null
|
||||
wait "$PID" 2>/dev/null
|
||||
fi
|
||||
rm -f "$PID_FILE"
|
||||
fi
|
||||
rm -f "$STATUS_FILE"
|
||||
}
|
||||
|
||||
# Check if speedtest is already running
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
PID=$(cat "$PID_FILE" 2>/dev/null)
|
||||
if [ -n "$PID" ] && kill -0 "$PID" 2>/dev/null; then
|
||||
echo '{"status":"error","message":"Speedtest already running"}'
|
||||
exit 1
|
||||
fi
|
||||
# Clean up stale PID file
|
||||
rm -f "$PID_FILE"
|
||||
fi
|
||||
|
||||
# Remove any existing files
|
||||
rm -f "$STATUS_FILE" "$FINAL_RESULT" "$LOG_FILE"
|
||||
|
||||
# Check if speedtest binary exists
|
||||
if ! command -v speedtest >/dev/null 2>&1; then
|
||||
echo '{"status":"error","message":"Speedtest binary not found"}'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create directories if they don't exist
|
||||
mkdir -p /tmp/home 2>/dev/null
|
||||
# Remove any existing status files
|
||||
rm -f $STATUS_FILE
|
||||
rm -f $FINAL_RESULT
|
||||
|
||||
# Initialize status file
|
||||
echo '{"status":"starting","timestamp":'$(date +%s)'}' > "$STATUS_FILE"
|
||||
chmod 644 "$STATUS_FILE"
|
||||
echo '{"status": "starting"}' > $STATUS_FILE
|
||||
chmod 644 $STATUS_FILE
|
||||
|
||||
# Start speedtest in background with proper error handling
|
||||
# Run speedtest in background and pipe output to status file
|
||||
(
|
||||
# Set environment
|
||||
export HOME=/tmp/home
|
||||
export PATH="/usr/bin:/bin:/usr/sbin:/sbin"
|
||||
|
||||
# Log start time
|
||||
echo "Starting speedtest at $(date)" > "$LOG_FILE"
|
||||
|
||||
# Run speedtest with timeout and error handling
|
||||
timeout "$TIMEOUT" speedtest --accept-license --accept-gdpr --format=json --progress=yes --progress-update-interval=500ms 2>>"$LOG_FILE" | \
|
||||
/usr/bin/speedtest --accept-license --accept-gdpr -f json -p yes --progress-update-interval=100 | \
|
||||
while IFS= read -r line; do
|
||||
# Validate JSON before writing
|
||||
if echo "$line" | grep -q '^{.*}$'; then
|
||||
# Write the line as-is (speedtest already includes timestamp)
|
||||
echo "$line" > "$STATUS_FILE"
|
||||
|
||||
# Check if this is the final result
|
||||
if echo "$line" | grep -q '"type":"result"'; then
|
||||
echo "$line" > "$FINAL_RESULT"
|
||||
chmod 644 "$FINAL_RESULT"
|
||||
echo "Speedtest completed at $(date)" >> "$LOG_FILE"
|
||||
echo "Final result written to $FINAL_RESULT" >> "$LOG_FILE"
|
||||
break
|
||||
fi
|
||||
else
|
||||
# Log non-JSON output
|
||||
echo "Non-JSON output: $line" >> "$LOG_FILE"
|
||||
# Update status file with latest JSON data
|
||||
echo "$line" > $STATUS_FILE
|
||||
|
||||
# If this is a result line, also save it as the final result
|
||||
if echo "$line" | grep -q '"type":"result"'; then
|
||||
echo "$line" > $FINAL_RESULT
|
||||
chmod 644 $FINAL_RESULT
|
||||
fi
|
||||
done
|
||||
|
||||
# Check if we have a result after the loop
|
||||
if [ ! -f "$FINAL_RESULT" ] && [ -f "$STATUS_FILE" ]; then
|
||||
# Check if the last status was actually a result
|
||||
if grep -q '"type":"result"' "$STATUS_FILE" 2>/dev/null; then
|
||||
cp "$STATUS_FILE" "$FINAL_RESULT"
|
||||
chmod 644 "$FINAL_RESULT"
|
||||
echo "Copied result from status file to final result" >> "$LOG_FILE"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Handle timeout or error cases
|
||||
if [ $? -ne 0 ]; then
|
||||
ERROR_MSG="Speedtest failed or timed out"
|
||||
echo "Error: $ERROR_MSG at $(date)" >> "$LOG_FILE"
|
||||
echo "{\"status\":\"error\",\"message\":\"$ERROR_MSG\",\"timestamp\":$(date +%s)}" > "$STATUS_FILE"
|
||||
fi
|
||||
|
||||
# Keep PID file for a moment to let status script detect completion
|
||||
sleep 2
|
||||
|
||||
# Cleanup PID file
|
||||
rm -f "$PID_FILE"
|
||||
|
||||
) &
|
||||
|
||||
# Save the background process PID
|
||||
echo $! > "$PID_FILE"
|
||||
|
||||
# Set up cleanup trap
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
# Return immediate success response
|
||||
echo '{"status":"started","timestamp":'$(date +%s)'}'
|
||||
echo '{"status":"started"}'
|
||||
Reference in New Issue
Block a user