router_local_http.sh 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #!/bin/sh
  2. set -eu
  3. SCRIPT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
  4. APP_DIR=$(CDPATH= cd -- "$SCRIPT_DIR/.." && pwd)
  5. CONFIG_PATH=${1:-"$APP_DIR/config_router.conf"}
  6. CONFIG_DIR=$(CDPATH= cd -- "$(dirname -- "$CONFIG_PATH")" && pwd)
  7. if [ ! -r "$CONFIG_PATH" ]; then
  8. echo "[router-http] config not found: $CONFIG_PATH" >&2
  9. exit 1
  10. fi
  11. # shellcheck disable=SC1090
  12. . "$CONFIG_PATH"
  13. BUSYBOX_BIN=${BUSYBOX_BIN:-"$APP_DIR/busybox_armv7l"}
  14. RUNTIME_DIR=${RUNTIME_DIR:-"$APP_DIR/cfip_runtime"}
  15. VALUE_TEXT_FILE=${VALUE_TEXT_FILE:-"current_ip.txt"}
  16. HTTP_PORT=${HTTP_PORT:-8080}
  17. # Trim possible CRLF endings from config values edited on Windows/Web UI.
  18. CR=$(printf '\r')
  19. BUSYBOX_BIN=${BUSYBOX_BIN%"$CR"}
  20. RUNTIME_DIR=${RUNTIME_DIR%"$CR"}
  21. VALUE_TEXT_FILE=${VALUE_TEXT_FILE%"$CR"}
  22. HTTP_PORT=${HTTP_PORT%"$CR"}
  23. TEXT_PATH="$RUNTIME_DIR/$VALUE_TEXT_FILE"
  24. INDEX_PATH="$RUNTIME_DIR/index.html"
  25. resolve_path_from_config() {
  26. p="$1"
  27. case "$p" in
  28. /*) printf '%s\n' "$p" ;;
  29. *) printf '%s/%s\n' "$CONFIG_DIR" "$p" ;;
  30. esac
  31. }
  32. resolve_busybox() {
  33. if [ -n "$BUSYBOX_BIN" ]; then
  34. busybox_from_cfg=$(resolve_path_from_config "$BUSYBOX_BIN")
  35. if [ -x "$busybox_from_cfg" ]; then
  36. printf '%s\n' "$busybox_from_cfg"
  37. return 0
  38. fi
  39. fi
  40. if [ -n "$BUSYBOX_BIN" ] && [ -x "$BUSYBOX_BIN" ]; then
  41. printf '%s\n' "$BUSYBOX_BIN"
  42. return 0
  43. fi
  44. if [ -x "$APP_DIR/busybox_armv7l" ]; then
  45. printf '%s\n' "$APP_DIR/busybox_armv7l"
  46. return 0
  47. fi
  48. if command -v busybox >/dev/null 2>&1; then
  49. command -v busybox
  50. return 0
  51. fi
  52. return 1
  53. }
  54. print_busybox_debug() {
  55. echo "[router-http] debug CONFIG_PATH=$CONFIG_PATH" >&2
  56. echo "[router-http] debug CONFIG_DIR=$CONFIG_DIR" >&2
  57. echo "[router-http] debug APP_DIR=$APP_DIR" >&2
  58. echo "[router-http] debug BUSYBOX_BIN(raw)=$BUSYBOX_BIN" >&2
  59. resolved_from_cfg=$(resolve_path_from_config "$BUSYBOX_BIN")
  60. echo "[router-http] debug BUSYBOX_BIN(resolved)=$resolved_from_cfg" >&2
  61. if [ -e "$resolved_from_cfg" ]; then
  62. if [ -x "$resolved_from_cfg" ]; then
  63. echo "[router-http] debug resolved BusyBox exists and is executable" >&2
  64. else
  65. echo "[router-http] debug resolved BusyBox exists but is NOT executable; run: chmod +x $resolved_from_cfg" >&2
  66. fi
  67. else
  68. echo "[router-http] debug resolved BusyBox does not exist" >&2
  69. fi
  70. if [ -e "$APP_DIR/busybox_armv7l" ]; then
  71. if [ -x "$APP_DIR/busybox_armv7l" ]; then
  72. echo "[router-http] debug fallback $APP_DIR/busybox_armv7l exists and is executable" >&2
  73. else
  74. echo "[router-http] debug fallback $APP_DIR/busybox_armv7l exists but is NOT executable; run: chmod +x $APP_DIR/busybox_armv7l" >&2
  75. fi
  76. else
  77. echo "[router-http] debug fallback $APP_DIR/busybox_armv7l does not exist" >&2
  78. fi
  79. }
  80. busybox_has_applet() {
  81. busybox_bin="$1"
  82. applet="$2"
  83. if "$busybox_bin" --list 2>/dev/null | grep "^$applet$" >/dev/null; then
  84. return 0
  85. fi
  86. "$busybox_bin" 2>/dev/null | grep "[[:space:]]$applet[,[:space:]]" >/dev/null
  87. }
  88. ensure_index() {
  89. if [ ! -f "$TEXT_PATH" ]; then
  90. return 0
  91. fi
  92. rm -f "$INDEX_PATH"
  93. cp "$TEXT_PATH" "$INDEX_PATH"
  94. }
  95. start_httpd() {
  96. busybox_bin=$(resolve_busybox || true)
  97. if [ -n "$busybox_bin" ] && busybox_has_applet "$busybox_bin" httpd; then
  98. echo "[router-http] serving $RUNTIME_DIR on 0.0.0.0:$HTTP_PORT via $busybox_bin httpd"
  99. "$busybox_bin" httpd -f -p "$HTTP_PORT" -h "$RUNTIME_DIR" &
  100. httpd_pid=$!
  101. trap 'kill "$httpd_pid" 2>/dev/null || true' INT TERM EXIT
  102. wait "$httpd_pid"
  103. exit $?
  104. fi
  105. if [ -n "$busybox_bin" ]; then
  106. echo "[router-http] selected BusyBox has no httpd applet: $busybox_bin" >&2
  107. fi
  108. if command -v httpd >/dev/null 2>&1; then
  109. echo "[router-http] found system httpd at $(command -v httpd), but it is not used" >&2
  110. echo "[router-http] ASUS firmware httpd is usually the router admin web server and does not support serving an arbitrary -h directory" >&2
  111. fi
  112. print_busybox_debug
  113. echo "[router-http] usable BusyBox httpd applet not found" >&2
  114. echo "[router-http] set BUSYBOX_BIN in config_router.conf to your full BusyBox binary, for example: BUSYBOX_BIN=\"./busybox_armv7l\"" >&2
  115. exit 1
  116. }
  117. if [ ! -d "$RUNTIME_DIR" ]; then
  118. echo "[router-http] runtime dir not found: $RUNTIME_DIR" >&2
  119. echo "[router-http] run: sh scripts/router_local_update.sh $CONFIG_PATH" >&2
  120. exit 1
  121. fi
  122. ensure_index
  123. start_httpd