| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #!/bin/sh
- set -eu
- SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
- APP_DIR=$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd)
- CONFIG_PATH=${1:-"$APP_DIR/config_router.conf"}
- CONFIG_DIR=$(CDPATH= cd -- "$(dirname -- "$CONFIG_PATH")" && pwd)
- if [ ! -r "$CONFIG_PATH" ]; then
- echo "[router-http] config not found: $CONFIG_PATH" >&2
- exit 1
- fi
- # shellcheck disable=SC1090
- . "$CONFIG_PATH"
- BUSYBOX_BIN=${BUSYBOX_BIN:-"$APP_DIR/busybox_armv7l"}
- RUNTIME_DIR=${RUNTIME_DIR:-"$APP_DIR/cfip_runtime"}
- VALUE_TEXT_FILE=${VALUE_TEXT_FILE:-"current_ip.txt"}
- HTTP_PORT=${HTTP_PORT:-8080}
- # Trim possible CRLF endings from config values edited on Windows/Web UI.
- CR=$(printf '\r')
- BUSYBOX_BIN=${BUSYBOX_BIN%"$CR"}
- RUNTIME_DIR=${RUNTIME_DIR%"$CR"}
- VALUE_TEXT_FILE=${VALUE_TEXT_FILE%"$CR"}
- HTTP_PORT=${HTTP_PORT%"$CR"}
- TEXT_PATH="$RUNTIME_DIR/$VALUE_TEXT_FILE"
- INDEX_PATH="$RUNTIME_DIR/index.html"
- resolve_path_from_config() {
- p="$1"
- case "$p" in
- /*) printf '%s\n' "$p" ;;
- *) printf '%s/%s\n' "$CONFIG_DIR" "$p" ;;
- esac
- }
- resolve_busybox() {
- if [ -n "$BUSYBOX_BIN" ]; then
- busybox_from_cfg=$(resolve_path_from_config "$BUSYBOX_BIN")
- if [ -x "$busybox_from_cfg" ]; then
- printf '%s\n' "$busybox_from_cfg"
- return 0
- fi
- fi
- if [ -n "$BUSYBOX_BIN" ] && [ -x "$BUSYBOX_BIN" ]; then
- printf '%s\n' "$BUSYBOX_BIN"
- return 0
- fi
- if [ -x "$APP_DIR/busybox_armv7l" ]; then
- printf '%s\n' "$APP_DIR/busybox_armv7l"
- return 0
- fi
- if command -v busybox >/dev/null 2>&1; then
- command -v busybox
- return 0
- fi
- return 1
- }
- print_busybox_debug() {
- echo "[router-http] debug CONFIG_PATH=$CONFIG_PATH" >&2
- echo "[router-http] debug CONFIG_DIR=$CONFIG_DIR" >&2
- echo "[router-http] debug APP_DIR=$APP_DIR" >&2
- echo "[router-http] debug BUSYBOX_BIN(raw)=$BUSYBOX_BIN" >&2
- resolved_from_cfg=$(resolve_path_from_config "$BUSYBOX_BIN")
- echo "[router-http] debug BUSYBOX_BIN(resolved)=$resolved_from_cfg" >&2
- if [ -e "$resolved_from_cfg" ]; then
- if [ -x "$resolved_from_cfg" ]; then
- echo "[router-http] debug resolved BusyBox exists and is executable" >&2
- else
- echo "[router-http] debug resolved BusyBox exists but is NOT executable; run: chmod +x $resolved_from_cfg" >&2
- fi
- else
- echo "[router-http] debug resolved BusyBox does not exist" >&2
- fi
- if [ -e "$APP_DIR/busybox_armv7l" ]; then
- if [ -x "$APP_DIR/busybox_armv7l" ]; then
- echo "[router-http] debug fallback $APP_DIR/busybox_armv7l exists and is executable" >&2
- else
- echo "[router-http] debug fallback $APP_DIR/busybox_armv7l exists but is NOT executable; run: chmod +x $APP_DIR/busybox_armv7l" >&2
- fi
- else
- echo "[router-http] debug fallback $APP_DIR/busybox_armv7l does not exist" >&2
- fi
- }
- busybox_has_applet() {
- busybox_bin="$1"
- applet="$2"
- if "$busybox_bin" --list 2>/dev/null | grep "^$applet$" >/dev/null; then
- return 0
- fi
- "$busybox_bin" 2>/dev/null | grep "[[:space:]]$applet[,[:space:]]" >/dev/null
- }
- ensure_index() {
- if [ ! -f "$TEXT_PATH" ]; then
- return 0
- fi
- rm -f "$INDEX_PATH"
- cp "$TEXT_PATH" "$INDEX_PATH"
- }
- start_httpd() {
- busybox_bin=$(resolve_busybox || true)
- if [ -n "$busybox_bin" ] && busybox_has_applet "$busybox_bin" httpd; then
- echo "[router-http] serving $RUNTIME_DIR on 0.0.0.0:$HTTP_PORT via $busybox_bin httpd"
- "$busybox_bin" httpd -f -p "$HTTP_PORT" -h "$RUNTIME_DIR" &
- httpd_pid=$!
- trap 'kill "$httpd_pid" 2>/dev/null || true' INT TERM EXIT
- wait "$httpd_pid"
- exit $?
- fi
- if [ -n "$busybox_bin" ]; then
- echo "[router-http] selected BusyBox has no httpd applet: $busybox_bin" >&2
- fi
- if command -v httpd >/dev/null 2>&1; then
- echo "[router-http] found system httpd at $(command -v httpd), but it is not used" >&2
- echo "[router-http] ASUS firmware httpd is usually the router admin web server and does not support serving an arbitrary -h directory" >&2
- fi
- print_busybox_debug
- echo "[router-http] usable BusyBox httpd applet not found" >&2
- echo "[router-http] set BUSYBOX_BIN in config_router.conf to your full BusyBox binary, for example: BUSYBOX_BIN=\"./busybox_armv7l\"" >&2
- exit 1
- }
- if [ ! -d "$RUNTIME_DIR" ]; then
- echo "[router-http] runtime dir not found: $RUNTIME_DIR" >&2
- echo "[router-http] run: sh scripts/router_local_update.sh $CONFIG_PATH" >&2
- exit 1
- fi
- ensure_index
- start_httpd
|