126 lines
3.3 KiB
Bash
Executable File
126 lines
3.3 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Set content-type for JSON response
|
|
echo "Content-type: application/json"
|
|
echo ""
|
|
|
|
# Configuration
|
|
QUEUE_FILE="/tmp/at_pipe.txt"
|
|
CELL_SCAN_KEYWORD="CELL_SCAN"
|
|
MAX_SCAN_TIME=180 # 3 minutes maximum scan time
|
|
LOCK_WAIT_TIME=6 # Maximum seconds to wait for lock
|
|
|
|
# Function to output error in JSON format
|
|
output_error() {
|
|
printf '{"status":"error","error":"%s","output":""}\n' "$1"
|
|
exit 1
|
|
}
|
|
|
|
# Function to create and verify queue entry
|
|
create_queue_entry() {
|
|
local TIMESTAMP=$(date +%s)
|
|
local entry=$(printf '{"id":"%s","timestamp":"%s","command":"%s","status":"scanning","pid":"%s","start_time":"%s","priority":"high"}\n' \
|
|
"${CELL_SCAN_KEYWORD}" \
|
|
"$(date '+%H:%M:%S')" \
|
|
"${CELL_SCAN_KEYWORD}" \
|
|
"$$" \
|
|
"$TIMESTAMP")
|
|
|
|
echo "$entry" >> "$QUEUE_FILE"
|
|
|
|
# Verify our entry was written
|
|
if grep -q "\"pid\":\"$$\".*\"start_time\":\"$TIMESTAMP\"" "$QUEUE_FILE"; then
|
|
logger -t cell_scan "Queue entry created successfully"
|
|
return 0
|
|
else
|
|
logger -t cell_scan "Failed to create queue entry"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Remove our entry from the queue
|
|
remove_queue_entry() {
|
|
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE"
|
|
logger -t cell_scan "Removed entry for PID $$"
|
|
}
|
|
|
|
# Escape special characters for JSON string
|
|
escape_json() {
|
|
printf '%s' "$1" | awk '
|
|
BEGIN { RS="\n"; ORS="\\n" }
|
|
{
|
|
gsub(/\\/, "\\\\")
|
|
gsub(/"/, "\\\"")
|
|
gsub(/\r/, "")
|
|
print
|
|
}' | sed 's/\\n$//'
|
|
}
|
|
|
|
# Execute cell scan with proper timeout handling
|
|
execute_cell_scan() {
|
|
local tmp_output=$(mktemp)
|
|
local scan_pid
|
|
|
|
# Start scan in background
|
|
(sms_tool at "AT+QSCAN=3,1" -t $MAX_SCAN_TIME > "$tmp_output" 2>/dev/null) &
|
|
scan_pid=$!
|
|
logger -t cell_scan "Started QSCAN with PID: $scan_pid"
|
|
|
|
# Wait for scan to complete or timeout
|
|
local wait_time=0
|
|
while [ $wait_time -lt $MAX_SCAN_TIME ]; do
|
|
if ! kill -0 $scan_pid 2>/dev/null; then
|
|
break
|
|
fi
|
|
sleep 1
|
|
wait_time=$((wait_time + 1))
|
|
done
|
|
|
|
# Check if we need to kill the scan
|
|
if [ $wait_time -ge $MAX_SCAN_TIME ]; then
|
|
kill $scan_pid 2>/dev/null
|
|
wait $scan_pid 2>/dev/null
|
|
logger -t cell_scan "Scan timed out after $MAX_SCAN_TIME seconds"
|
|
output_error "Scan timed out"
|
|
fi
|
|
|
|
logger -t cell_scan "Scan completed in $wait_time seconds"
|
|
|
|
# Process and output results
|
|
if [ -s "$tmp_output" ]; then
|
|
local escaped_output=$(escape_json "$(cat "$tmp_output")")
|
|
printf '{"status":"success","output":"%s"}\n' "$escaped_output"
|
|
else
|
|
output_error "No scan results"
|
|
fi
|
|
|
|
rm -f "$tmp_output"
|
|
}
|
|
|
|
# Main execution
|
|
main() {
|
|
# Set global timeout
|
|
( sleep $MAX_SCAN_TIME; kill -TERM $$ 2>/dev/null ) &
|
|
TIMEOUT_PID=$!
|
|
|
|
# Ensure queue file exists
|
|
touch "$QUEUE_FILE"
|
|
|
|
# Create queue entry
|
|
if ! create_queue_entry; then
|
|
output_error "Failed to create queue entry"
|
|
fi
|
|
|
|
# Register cleanup handler
|
|
trap 'remove_queue_entry; kill $TIMEOUT_PID 2>/dev/null; exit' INT TERM EXIT
|
|
|
|
# Execute scan and output results
|
|
execute_cell_scan
|
|
|
|
# Cleanup
|
|
kill $TIMEOUT_PID 2>/dev/null
|
|
remove_queue_entry
|
|
}
|
|
|
|
# Start main execution
|
|
main |