292 lines
7.8 KiB
Bash
Executable File
292 lines
7.8 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Read POST data
|
|
read -r QUERY_STRING
|
|
|
|
# Function to urldecode
|
|
urldecode() {
|
|
local value="$1"
|
|
value="${value//+/ }"
|
|
value="${value//%/\\x}"
|
|
printf '%b' "$value"
|
|
}
|
|
|
|
# Extract values from POST data
|
|
iccidProfile1=$(echo "$QUERY_STRING" | sed -n 's/.*iccidProfile1=\([^&]*\).*/\1/p' | tr -d "'")
|
|
imeiProfile1=$(echo "$QUERY_STRING" | sed -n 's/.*imeiProfile1=\([^&]*\).*/\1/p' | tr -d "'")
|
|
iccidProfile2=$(echo "$QUERY_STRING" | sed -n 's/.*iccidProfile2=\([^&]*\).*/\1/p' | tr -d "'")
|
|
imeiProfile2=$(echo "$QUERY_STRING" | sed -n 's/.*imeiProfile2=\([^&]*\).*/\1/p' | tr -d "'")
|
|
|
|
# URL decode the values
|
|
iccidProfile1=$(urldecode "$iccidProfile1")
|
|
imeiProfile1=$(urldecode "$imeiProfile1")
|
|
iccidProfile2=$(urldecode "$iccidProfile2")
|
|
imeiProfile2=$(urldecode "$imeiProfile2")
|
|
|
|
echo "Content-type: application/json"
|
|
echo ""
|
|
|
|
# Validate required first profile
|
|
if [ -z "$iccidProfile1" ] || [ -z "$imeiProfile1" ]; then
|
|
echo '{"status": "error", "message": "Profile 1 is required"}'
|
|
exit 1
|
|
fi
|
|
|
|
# Function to log messages
|
|
log_message() {
|
|
local level="$1"
|
|
local message="$2"
|
|
local LOG_DIR="/tmp/log/imeiprofile"
|
|
local LOG_FILE="${LOG_DIR}/imeiprofile.log"
|
|
|
|
mkdir -p "${LOG_DIR}"
|
|
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE"
|
|
logger -t imeiprofile "${level}: ${message}"
|
|
}
|
|
|
|
# Create required directories
|
|
mkdir -p /www/cgi-bin/services
|
|
|
|
# Function to create service script
|
|
create_service_script() {
|
|
cat > /www/cgi-bin/services/imeiprofile.sh <<'EOL'
|
|
#!/bin/sh
|
|
|
|
# Load UCI functions
|
|
. /lib/functions.sh
|
|
|
|
# Define file paths
|
|
QUEUE_FILE="/tmp/at_pipe.txt"
|
|
LOG_DIR="/tmp/log/imeiprofile"
|
|
LOG_FILE="${LOG_DIR}/imeiprofile.log"
|
|
PID_FILE="/var/run/imeiprofile.pid"
|
|
|
|
mkdir -p "${LOG_DIR}"
|
|
[ ! -f "${QUEUE_FILE}" ] && touch "${QUEUE_FILE}"
|
|
|
|
# Save PID
|
|
echo $$ > "${PID_FILE}"
|
|
|
|
# Enhanced logging function
|
|
log_message() {
|
|
local level="$1"
|
|
local message="$2"
|
|
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
echo "${timestamp} - [${level}] ${message}" >> "$LOG_FILE"
|
|
logger -t imeiprofile "${level}: ${message}"
|
|
}
|
|
|
|
# AT command handling with locking
|
|
handle_lock() {
|
|
local max_wait=30
|
|
local wait_count=0
|
|
|
|
while [ -f "$QUEUE_FILE" ] && grep -q "AT_COMMAND" "$QUEUE_FILE" && [ $wait_count -lt $max_wait ]; do
|
|
sleep 1
|
|
wait_count=$((wait_count + 1))
|
|
done
|
|
|
|
printf '{"command":"AT_COMMAND","pid":"%s","timestamp":"%s"}\n' "$$" "$(date '+%H:%M:%S')" >> "$QUEUE_FILE"
|
|
}
|
|
|
|
# Execute AT command with retries
|
|
execute_at_command() {
|
|
local command="$1"
|
|
local result=""
|
|
local retry_count=0
|
|
local max_retries=3
|
|
|
|
while [ $retry_count -lt $max_retries ]; do
|
|
handle_lock
|
|
result=$(sms_tool at "$command" -t 4 2>&1)
|
|
local status=$?
|
|
sed -i "/\"pid\":\"$$\"/d" "$QUEUE_FILE"
|
|
|
|
if [ $status -eq 0 ] && [ -n "$result" ]; then
|
|
echo "$result"
|
|
return 0
|
|
fi
|
|
|
|
retry_count=$((retry_count + 1))
|
|
[ $retry_count -lt $max_retries ] && sleep 2
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
# Get current ICCID
|
|
get_current_iccid() {
|
|
local result=$(execute_at_command "AT+ICCID")
|
|
if [ $? -eq 0 ] && echo "$result" | grep -q "+ICCID:"; then
|
|
echo "$result" | grep "+ICCID:" | cut -d' ' -f2 | tr -d '[:space:]'
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
# Get current IMEI
|
|
get_current_imei() {
|
|
local result=$(execute_at_command "AT+CGSN")
|
|
if [ $? -eq 0 ]; then
|
|
echo "$result" | grep -v "AT+CGSN" | grep -v "OK" | tr -d '\r\n[:space:]'
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
# Set IMEI
|
|
set_imei() {
|
|
local imei="$1"
|
|
if execute_at_command "AT+EGMR=1,7,\"$imei\";+QPOWD=1"; then
|
|
return 0
|
|
fi
|
|
return 1
|
|
}
|
|
|
|
# Function to safely get UCI value with default
|
|
get_uci_value() {
|
|
local value
|
|
config_get value imei_profile "$1" "$2"
|
|
echo "${value:-$2}"
|
|
}
|
|
|
|
# Main service loop
|
|
while true; do
|
|
# Load current configuration
|
|
config_load quecmanager
|
|
|
|
# Get Profile 1
|
|
iccid_profile1=$(get_uci_value "iccid_profile1")
|
|
imei_profile1=$(get_uci_value "imei_profile1")
|
|
|
|
# Get Profile 2
|
|
iccid_profile2=$(get_uci_value "iccid_profile2")
|
|
imei_profile2=$(get_uci_value "imei_profile2")
|
|
|
|
# Get current ICCID and IMEI
|
|
current_iccid=$(get_current_iccid)
|
|
current_imei=$(get_current_imei)
|
|
|
|
if [ $? -eq 0 ] && [ -n "$current_iccid" ] && [ -n "$current_imei" ]; then
|
|
if [ "${current_iccid}" = "${iccid_profile1}" ]; then
|
|
if [ "${current_imei}" != "${imei_profile1}" ]; then
|
|
if set_imei "${imei_profile1}"; then
|
|
log_message "INFO" "Successfully applied Profile 1 IMEI"
|
|
else
|
|
log_message "ERROR" "Failed to apply Profile 1 IMEI"
|
|
fi
|
|
fi
|
|
elif [ -n "$iccid_profile2" ] && [ "${current_iccid}" = "${iccid_profile2}" ]; then
|
|
if [ "${current_imei}" != "${imei_profile2}" ]; then
|
|
if set_imei "${imei_profile2}"; then
|
|
log_message "INFO" "Successfully applied Profile 2 IMEI"
|
|
else
|
|
log_message "ERROR" "Failed to apply Profile 2 IMEI"
|
|
fi
|
|
fi
|
|
else
|
|
log_message "INFO" "No matching ICCID profile found"
|
|
fi
|
|
else
|
|
log_message "ERROR" "Failed to get current ICCID or IMEI"
|
|
fi
|
|
|
|
sleep 30
|
|
done
|
|
EOL
|
|
|
|
chmod 755 /www/cgi-bin/services/imeiprofile.sh
|
|
}
|
|
|
|
# Function to create init.d script
|
|
create_init_script() {
|
|
cat > /etc/init.d/imeiprofile-service <<'EOL'
|
|
#!/bin/sh /etc/rc.common
|
|
|
|
START=99
|
|
STOP=10
|
|
USE_PROCD=1
|
|
|
|
start_service() {
|
|
local enabled
|
|
|
|
# Check if service is enabled in UCI
|
|
config_load quecmanager
|
|
config_get enabled imei_profile enabled '0'
|
|
|
|
[ "$enabled" != "1" ] && return 0
|
|
|
|
procd_open_instance
|
|
procd_set_param command /www/cgi-bin/services/imeiprofile.sh
|
|
procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}
|
|
procd_set_param stdout 1
|
|
procd_set_param stderr 1
|
|
procd_set_param nice 19
|
|
procd_close_instance
|
|
}
|
|
|
|
service_triggers() {
|
|
procd_add_reload_trigger "quecmanager"
|
|
}
|
|
|
|
reload_service() {
|
|
stop
|
|
start
|
|
}
|
|
EOL
|
|
|
|
chmod 755 /etc/init.d/imeiprofile-service
|
|
}
|
|
|
|
# Initialize UCI configuration
|
|
touch /etc/config/quecmanager
|
|
|
|
# Remove existing IMEI profile section if it exists
|
|
uci -q delete quecmanager.imei_profile
|
|
|
|
# Create new IMEI profile section
|
|
uci set quecmanager.imei_profile=service
|
|
uci set quecmanager.imei_profile.enabled=1
|
|
|
|
# Set Profile 1 configuration
|
|
uci set quecmanager.imei_profile.iccid_profile1="$iccidProfile1"
|
|
uci set quecmanager.imei_profile.imei_profile1="$imeiProfile1"
|
|
|
|
# Set Profile 2 configuration if provided
|
|
if [ -n "$iccidProfile2" ]; then
|
|
uci set quecmanager.imei_profile.iccid_profile2="$iccidProfile2"
|
|
uci set quecmanager.imei_profile.imei_profile2="$imeiProfile2"
|
|
fi
|
|
|
|
# Commit UCI changes
|
|
if ! uci commit quecmanager; then
|
|
log_message "ERROR" "Failed to save UCI configuration"
|
|
echo '{"status": "error", "message": "Failed to save UCI configuration"}'
|
|
exit 1
|
|
fi
|
|
|
|
log_message "INFO" "UCI configuration saved successfully"
|
|
|
|
# Create service script if it doesn't exist
|
|
if [ ! -f "/www/cgi-bin/services/imeiprofile.sh" ]; then
|
|
create_service_script
|
|
log_message "INFO" "Created service script"
|
|
fi
|
|
|
|
# Create init.d script if it doesn't exist
|
|
if [ ! -f "/etc/init.d/imeiprofile-service" ]; then
|
|
create_init_script
|
|
log_message "INFO" "Created init.d script"
|
|
fi
|
|
|
|
# Enable and start the service
|
|
/etc/init.d/imeiprofile-service enable
|
|
if /etc/init.d/imeiprofile-service restart; then
|
|
log_message "INFO" "Service started successfully"
|
|
echo '{"status": "success", "message": "IMEI profiles saved and service started"}'
|
|
else
|
|
log_message "ERROR" "Failed to start service"
|
|
echo '{"status": "error", "message": "Failed to start service"}'
|
|
fi
|