router_local_http.sh 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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/router_local.conf"}
  6. if [ ! -r "$CONFIG_PATH" ]; then
  7. echo "[router-http] config not found: $CONFIG_PATH" >&2
  8. exit 1
  9. fi
  10. # shellcheck disable=SC1090
  11. . "$CONFIG_PATH"
  12. BUSYBOX_BIN=${BUSYBOX_BIN:-"$APP_DIR/busybox_armv7l"}
  13. RUNTIME_DIR=${RUNTIME_DIR:-"$APP_DIR/cfip_runtime"}
  14. VALUE_TEXT_FILE=${VALUE_TEXT_FILE:-"current_ip.txt"}
  15. HTTP_PORT=${HTTP_PORT:-8080}
  16. TEXT_PATH="$RUNTIME_DIR/$VALUE_TEXT_FILE"
  17. INDEX_PATH="$RUNTIME_DIR/index.html"
  18. resolve_busybox() {
  19. if [ -n "$BUSYBOX_BIN" ] && [ -x "$BUSYBOX_BIN" ]; then
  20. printf '%s\n' "$BUSYBOX_BIN"
  21. return 0
  22. fi
  23. if [ -x "$APP_DIR/busybox_armv7l" ]; then
  24. printf '%s\n' "$APP_DIR/busybox_armv7l"
  25. return 0
  26. fi
  27. if command -v busybox >/dev/null 2>&1; then
  28. command -v busybox
  29. return 0
  30. fi
  31. return 1
  32. }
  33. busybox_has_applet() {
  34. busybox_bin="$1"
  35. applet="$2"
  36. "$busybox_bin" --list 2>/dev/null | grep "^$applet$" >/dev/null
  37. }
  38. ensure_index() {
  39. if [ ! -f "$TEXT_PATH" ]; then
  40. return 0
  41. fi
  42. rm -f "$INDEX_PATH"
  43. cp "$TEXT_PATH" "$INDEX_PATH"
  44. }
  45. start_httpd() {
  46. busybox_bin=$(resolve_busybox || true)
  47. if [ -n "$busybox_bin" ] && busybox_has_applet "$busybox_bin" httpd; then
  48. echo "[router-http] serving $RUNTIME_DIR on 0.0.0.0:$HTTP_PORT via $busybox_bin httpd"
  49. "$busybox_bin" httpd -f -p "$HTTP_PORT" -h "$RUNTIME_DIR" &
  50. httpd_pid=$!
  51. trap 'kill "$httpd_pid" 2>/dev/null || true' INT TERM EXIT
  52. wait "$httpd_pid"
  53. exit $?
  54. fi
  55. if [ -n "$busybox_bin" ]; then
  56. echo "[router-http] selected BusyBox has no httpd applet: $busybox_bin" >&2
  57. fi
  58. if command -v httpd >/dev/null 2>&1; then
  59. echo "[router-http] found system httpd at $(command -v httpd), but it is not used" >&2
  60. echo "[router-http] ASUS firmware httpd is usually the router admin web server and does not support serving an arbitrary -h directory" >&2
  61. fi
  62. echo "[router-http] usable BusyBox httpd applet not found" >&2
  63. echo "[router-http] set BUSYBOX_BIN in router_local.conf to your full BusyBox binary, for example: BUSYBOX_BIN=\"./busybox_armv7l\"" >&2
  64. exit 1
  65. }
  66. if [ ! -d "$RUNTIME_DIR" ]; then
  67. echo "[router-http] runtime dir not found: $RUNTIME_DIR" >&2
  68. echo "[router-http] run: sh scripts/router_local_update.sh $CONFIG_PATH" >&2
  69. exit 1
  70. fi
  71. ensure_index
  72. start_httpd