mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-31 00:25:13 +08:00
🌴 Sync 2026-06-17 21:17:50
This commit is contained in:
1 parent
7e638c9c4a
commit
0ec700ea8c
36 files changed
+3856
-3564
No files matched your search
@@ -59,7 +59,7 @@ import)
|
||||
fi
|
||||
rm -f "$tmp" "$IMPORT_B64"
|
||||
if [ "$rc" = 0 ]; then echo "result: config restored, backend restarted"; else echo "result: import failed"; fi
|
||||
echo "$(date '+%F %T') done (rc=$rc)"
|
||||
if [ "$rc" = 0 ]; then echo "$(date '+%F %T') ✓ 完成"; else echo "$(date '+%F %T') ✗ 失败 (rc=$rc)"; fi
|
||||
) </dev/null >/dev/null 2>&1 &
|
||||
echo "started in background, see $LOG"
|
||||
;;
|
||||
|
||||
@@ -21,6 +21,8 @@ CONFIG_DAE="/etc/dae/config.dae"
|
||||
TMP_GEN="/tmp/dae-gen.dae"
|
||||
DAE_BIN="/usr/bin/dae"
|
||||
DAE_INITD="/etc/init.d/dae"
|
||||
SUBS_DIR="/etc/dae/subscriptions"
|
||||
SUB_STAGE="/tmp/daede-sub.txt"
|
||||
|
||||
# dae single-quoted strings have no escaping; strip quotes/newlines defensively.
|
||||
sanitize() {
|
||||
@@ -378,10 +380,36 @@ do_import() {
|
||||
echo "ok"
|
||||
}
|
||||
|
||||
# Converter writes a batch of share links to a local file that dae reads as a
|
||||
# file:// subscription, so a converted airport is one subscription instead of
|
||||
# hundreds of manual nodes. $1=id (airport id), reads links from SUB_STAGE.
|
||||
# id is restricted to [A-Za-z0-9_] to keep the path inside SUBS_DIR.
|
||||
do_write_sub() {
|
||||
local id="$1"
|
||||
case "$id" in ''|*[!A-Za-z0-9_]*) echo "bad id" >&2; return 2 ;; esac
|
||||
[ -f "$SUB_STAGE" ] || { echo "no staged data" >&2; return 1; }
|
||||
mkdir -p "$SUBS_DIR"
|
||||
# dae rejects subscription/config files readable by group/other (needs <=0640)
|
||||
cp "$SUB_STAGE" "$SUBS_DIR/$id.sub.tmp" || { echo "write failed" >&2; return 1; }
|
||||
chmod 0600 "$SUBS_DIR/$id.sub.tmp"
|
||||
mv "$SUBS_DIR/$id.sub.tmp" "$SUBS_DIR/$id.sub"
|
||||
rm -f "$SUB_STAGE"
|
||||
echo "ok"
|
||||
}
|
||||
|
||||
do_delete_sub() {
|
||||
local id="$1"
|
||||
case "$id" in ''|*[!A-Za-z0-9_]*) return 0 ;; esac
|
||||
rm -f "$SUBS_DIR/$id.sub"
|
||||
echo "ok"
|
||||
}
|
||||
|
||||
# ===================== entry =====================
|
||||
|
||||
case "$1" in
|
||||
generate) generate ;;
|
||||
import) do_import ;;
|
||||
*) echo "usage: $0 {generate|import}" >&2; exit 2 ;;
|
||||
generate) generate ;;
|
||||
import) do_import ;;
|
||||
write-sub) do_write_sub "$2" ;;
|
||||
delete-sub) do_delete_sub "$2" ;;
|
||||
*) echo "usage: $0 {generate|import|write-sub <id>|delete-sub <id>}" >&2; exit 2 ;;
|
||||
esac
|
||||
@@ -70,7 +70,7 @@ fi
|
||||
echo "$(date '+%F %T') updated $DEST ($size bytes)"
|
||||
fi
|
||||
fi
|
||||
echo "$(date '+%F %T') done (rc=$rc)"
|
||||
if [ "$rc" = 0 ]; then echo "$(date '+%F %T') ✓ 完成"; else echo "$(date '+%F %T') ✗ 失败 (rc=$rc)"; fi
|
||||
) </dev/null >/dev/null 2>&1 &
|
||||
|
||||
echo "started in background, see $LOG"
|
||||
|
||||
@@ -85,7 +85,7 @@ fi
|
||||
exit 3
|
||||
fi
|
||||
|
||||
echo "$(date '+%F %T') done (rc=$rc)"
|
||||
if [ "$rc" = 0 ]; then echo "$(date '+%F %T') ✓ 完成"; else echo "$(date '+%F %T') ✗ 失败 (rc=$rc)"; fi
|
||||
|
||||
# luci-app-daede upgrade replaces ACL JSON — reload rpcd so changes apply.
|
||||
if [ "$PKG" = "luci-app-daede" ] && [ "$rc" = "0" ]; then
|
||||
|
||||
@@ -42,7 +42,12 @@
|
||||
"/etc/dae/config.dae": [ "write" ],
|
||||
"/tmp/dae-validate.dae": [ "write" ],
|
||||
"/tmp/daede-import.b64": [ "write" ],
|
||||
"/tmp/daede-sub.txt": [ "write" ],
|
||||
"/tmp/daede-daedsub-*": [ "write" ],
|
||||
"/bin/rm -f /tmp/daede-daedsub-*": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/config-backup.sh import": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/gen-dae-config.sh write-sub *": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/gen-dae-config.sh delete-sub *": [ "exec" ],
|
||||
"/etc/config/daede": [ "write" ],
|
||||
"/var/log/dae/dae.log": [ "write" ],
|
||||
"/var/log/daed/daed.log": [ "write" ],
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
# daede-sub - serve a converter's staged node list to the local daed only.
|
||||
#
|
||||
# daed (dae-wing) can only build a subscription by HTTP-fetching a link, and it
|
||||
# does not read file:// like dae core. So the converter stages the base64 share
|
||||
# links in /tmp/daede-daedsub-<token> and points daed's importSubscription at
|
||||
# http://127.0.0.1/cgi-bin/daede-sub?t=<token>. This CGI is the read side.
|
||||
#
|
||||
# Locked to loopback (REMOTE_ADDR), so even though uhttpd listens on the LAN no
|
||||
# remote client can pull the links. The frontend deletes the staged file after
|
||||
# the import (success or failure), so the exposure is one local fetch.
|
||||
|
||||
deny() { printf 'Status: 403 Forbidden\r\nContent-Type: text/plain\r\n\r\nforbidden\n'; exit 0; }
|
||||
|
||||
[ "$REMOTE_ADDR" = "127.0.0.1" ] || deny
|
||||
|
||||
# token: only [A-Za-z0-9] so the path can't escape /tmp
|
||||
t=$(printf '%s' "$QUERY_STRING" | sed -n 's/^.*\bt=\([A-Za-z0-9]\{1,64\}\).*$/\1/p')
|
||||
[ -n "$t" ] || deny
|
||||
|
||||
f="/tmp/daede-daedsub-$t"
|
||||
[ -f "$f" ] || deny
|
||||
|
||||
printf 'Content-Type: text/plain\r\n\r\n'
|
||||
cat "$f"
|
||||
Reference in new issue
Block a user