🍕 Sync 2026-06-29 08:46:17

This commit is contained in:
github-actions[bot] committed 2026-06-29 08:46:17 +08:00
1 parent d16630f75b
commit ea7617e5dd
20 files changed
+329 -31

No files matched your search

+1 -1
View File
@@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=airconnect
PKG_VERSION:=1.9.3
PKG_VERSION:=1.10.1
PKG_RELEASE=1
PKG_SOURCE:=AirConnect-$(PKG_VERSION).zip
+1 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=daed
PKG_VERSION:=2026.06.14
PKG_RELEASE:=13
PKG_RELEASE:=14
PKG_SOURCE:=daed-src-2026.06.14-4e215048068a.tar.gz
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
+3 -1
View File
@@ -4,4 +4,6 @@ config daed 'config'
option listen_addr '0.0.0.0:2023'
option log_maxbackups '1'
option log_maxsize '5'
option subscribe_auto_update '0'
option subscribe_update_cycle 'daily'
option subscribe_update_hour '4'
+3 -1
View File
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-daede
PKG_VERSION:=1.14.7
PKG_RELEASE:=23
PKG_RELEASE:=24
PKG_MAINTAINER:=kenzok8
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
@@ -80,6 +80,8 @@ define Package/$(PKG_NAME)/install
$(INSTALL_BIN) ./root/usr/share/luci-app-daede/config-backup.sh $(1)/usr/share/luci-app-daede/config-backup.sh
$(INSTALL_BIN) ./root/usr/share/luci-app-daede/refresh-index.sh $(1)/usr/share/luci-app-daede/refresh-index.sh
$(INSTALL_BIN) ./root/usr/share/luci-app-daede/geo-cron.sh $(1)/usr/share/luci-app-daede/geo-cron.sh
$(INSTALL_BIN) ./root/usr/share/luci-app-daede/daed-sub-update.sh $(1)/usr/share/luci-app-daede/daed-sub-update.sh
$(INSTALL_BIN) ./root/usr/share/luci-app-daede/daed-sub-cron.sh $(1)/usr/share/luci-app-daede/daed-sub-cron.sh
$(INSTALL_DIR) $(1)/www/cgi-bin
$(INSTALL_BIN) ./root/www/cgi-bin/daede-sub $(1)/www/cgi-bin/daede-sub
$(INSTALL_BIN) ./root/www/cgi-bin/daede-graphql $(1)/www/cgi-bin/daede-graphql
@@ -3,6 +3,7 @@
'use strict';
'require baseclass';
'require form';
'require fs';
'require uci';
'require view.daede.widgets as widgets';
@@ -19,6 +20,31 @@ function renderDaedSettings() {
o.default = '0.0.0.0:2023';
o.rmempty = false;
o = s.option(form.Value, 'dashboard_username', _('daed Username'),
_('Used by LuCI to update daed subscriptions through GraphQL. It does not change the daed Web login account.'));
o.placeholder = 'admin';
o.rmempty = false;
o = s.option(form.Value, 'dashboard_password', _('daed Password'));
o.password = true;
o = s.option(form.Flag, 'subscribe_auto_update', _('Enable subscription auto-update'));
o.default = '0';
o = s.option(form.ListValue, 'subscribe_update_cycle', _('Update Cycle'));
o.value('daily', _('Daily'));
o.value('weekly', _('Weekly'));
o.default = 'daily';
o.depends('subscribe_auto_update', '1');
o = s.option(form.ListValue, 'subscribe_update_hour', _('Update Time'));
for (let h = 0; h < 24; h++) {
const hh = ('0' + h).slice(-2);
o.value(String(h), hh + ':00');
}
o.default = '4';
o.depends('subscribe_auto_update', '1');
o = s.option(form.Value, 'log_maxsize', _('Max Log Size (MB)'),
_('Rotate the log file once it grows past this many megabytes.'));
o.datatype = 'uinteger';
@@ -48,7 +74,24 @@ function renderDaedSettings() {
if (statusTimer) clearTimeout(statusTimer);
statusTimer = setTimeout(function() { status.classList.remove('show'); }, hold || 3000);
}
const save = E('button', { 'class': 'cbi-button cbi-button-positive' }, _('Save and Apply'));
const update = E('button', { 'class': 'cbi-button cbi-button-action' }, _('Update subscriptions now'));
update.addEventListener('click', function(ev) {
ev.preventDefault();
update.disabled = true;
flash(_('Updating daed subscriptions…'));
fs.exec('/usr/share/luci-app-daede/daed-sub-update.sh', []).then(function(res) {
if (res && res.code !== 0) {
const err = (res.stderr || res.stdout || ('exit ' + res.code)).trim().split('\n')[0];
flash(_('Subscription update failed: %s').format(err), 'err', 9000);
} else {
flash(_('Subscriptions updated'), 'ok');
}
}).catch(function(e) {
flash(_('Subscription update failed: %s').format(e.message || e), 'err', 9000);
}).finally(function() { update.disabled = false; });
});
save.addEventListener('click', function(ev) {
ev.preventDefault();
save.disabled = true;
@@ -59,6 +102,14 @@ function renderDaedSettings() {
return (ch && Object.keys(ch).length) ? uci.apply() : null;
});
})
.then(function() {
const enabled = uci.get('daed', 'config', 'subscribe_auto_update') === '1';
return fs.exec('/usr/share/luci-app-daede/daed-sub-cron.sh', [ enabled ? 'enable' : 'disable' ]);
})
.then(function(res) {
if (res && res.code !== 0)
throw new Error((res.stderr || res.stdout || ('exit ' + res.code)).trim());
})
.then(function() {
/* no success popup — the reload is feedback enough */
setTimeout(function() { window.location.reload(); }, 500);
@@ -71,7 +122,7 @@ function renderDaedSettings() {
})
.finally(function() { save.disabled = false; });
});
card.appendChild(E('div', { 'class': 'dd-editor-actions' }, [ save, status ]));
card.appendChild(E('div', { 'class': 'dd-editor-actions' }, [ update, save, status ]));
return card;
});
}
+30
View File
@@ -106,6 +106,36 @@ msgstr ""
msgid "Number of rotated log files to keep."
msgstr ""
msgid "daed Username"
msgstr ""
msgid "Used by LuCI to update daed subscriptions through GraphQL. It does not change the daed Web login account."
msgstr ""
msgid "daed Password"
msgstr ""
msgid "Enable subscription auto-update"
msgstr ""
msgid "Update Cycle"
msgstr ""
msgid "Update Time"
msgstr ""
msgid "Update subscriptions now"
msgstr ""
msgid "Updating daed subscriptions…"
msgstr ""
msgid "Subscriptions updated"
msgstr ""
msgid "Subscription update failed: %s"
msgstr ""
msgid "Log Advanced Settings"
msgstr ""
+30
View File
@@ -120,6 +120,36 @@ msgstr "轮转后保留的旧日志文件数。"
msgid "Log Settings"
msgstr "日志设置"
msgid "daed Username"
msgstr "daed 用户名"
msgid "Used by LuCI to update daed subscriptions through GraphQL. It does not change the daed Web login account."
msgstr "LuCI 通过 GraphQL 更新 daed 订阅时使用;不会修改 daed Web 的登录账号。"
msgid "daed Password"
msgstr "daed 密码"
msgid "Enable subscription auto-update"
msgstr "启用订阅自动更新"
msgid "Update Cycle"
msgstr "更新周期"
msgid "Update Time"
msgstr "更新时间"
msgid "Update subscriptions now"
msgstr "立即更新订阅"
msgid "Updating daed subscriptions…"
msgstr "正在更新 daed 订阅…"
msgid "Subscriptions updated"
msgstr "订阅已更新"
msgid "Subscription update failed: %s"
msgstr "订阅更新失败:%s"
# ---- config.js: dae Settings ----
msgid "dae Parameters"
msgstr "dae 参数"
+30
View File
@@ -120,6 +120,36 @@ msgstr "轮转后保留的旧日志文件数。"
msgid "Log Settings"
msgstr "日志设置"
msgid "daed Username"
msgstr "daed 用户名"
msgid "Used by LuCI to update daed subscriptions through GraphQL. It does not change the daed Web login account."
msgstr "LuCI 通过 GraphQL 更新 daed 订阅时使用;不会修改 daed Web 的登录账号。"
msgid "daed Password"
msgstr "daed 密码"
msgid "Enable subscription auto-update"
msgstr "启用订阅自动更新"
msgid "Update Cycle"
msgstr "更新周期"
msgid "Update Time"
msgstr "更新时间"
msgid "Update subscriptions now"
msgstr "立即更新订阅"
msgid "Updating daed subscriptions…"
msgstr "正在更新 daed 订阅…"
msgid "Subscriptions updated"
msgstr "订阅已更新"
msgid "Subscription update failed: %s"
msgstr "订阅更新失败:%s"
# ---- config.js: dae Settings ----
msgid "dae Parameters"
msgstr "dae 参数"
@@ -0,0 +1,38 @@
#!/bin/sh
# Manage daed subscription auto-update cron entry.
ACTION="$1"
CRONTAB="/etc/crontabs/root"
TAG="# luci-app-daede daed-sub-update"
SCRIPT="/usr/share/luci-app-daede/daed-sub-update.sh"
clean() {
[ -f "$CRONTAB" ] || return 0
grep -vF -e "$TAG" -e "$SCRIPT" "$CRONTAB" > "$CRONTAB.tmp" 2>/dev/null
mv "$CRONTAB.tmp" "$CRONTAB"
}
clean
if [ "$ACTION" = "enable" ] && [ "$(uci -q get daed.config.subscribe_auto_update)" = "1" ]; then
hour="$(uci -q get daed.config.subscribe_update_hour)"
case "$hour" in
''|*[!0-9]*) hour=4 ;;
esac
[ "$hour" -ge 0 ] 2>/dev/null && [ "$hour" -le 23 ] 2>/dev/null || hour=4
case "$(uci -q get daed.config.subscribe_update_cycle)" in
weekly) sched="17 $hour * * 0" ;;
*) sched="17 $hour * * *" ;;
esac
mkdir -p /etc/crontabs
{
echo "$TAG"
echo "$sched $SCRIPT >/dev/null 2>&1"
} >> "$CRONTAB"
/etc/init.d/cron enable >/dev/null 2>&1
fi
/etc/init.d/cron restart >/dev/null 2>&1
exit 0
@@ -0,0 +1,118 @@
#!/bin/sh
# Update all daed subscriptions through dae-wing GraphQL.
LOG="/tmp/luci-app-daede.daed-sub-update.log"
LOCK="/tmp/luci-app-daede.daed-sub-update.lock"
log() {
echo "$(date '+%F %T') $*" >> "$LOG"
}
fail() {
local code="$1"; shift
log "$*"
echo "$*" >&2
exit "$code"
}
json_escape() {
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
}
cleanup() {
[ -n "$TMPDIR" ] && rm -rf "$TMPDIR"
rmdir "$LOCK" 2>/dev/null
}
if ! mkdir "$LOCK" 2>/dev/null; then
fail 1 "daed subscription update already running"
fi
trap cleanup EXIT INT TERM
TMPDIR="$(mktemp -d /tmp/daed-sub-update.XXXXXX)" || exit 1
port="$(uci -q get daed.config.listen_addr | sed -n 's/.*:\([0-9]\{1,5\}\)$/\1/p')"
[ -n "$port" ] || port=2023
endpoint="http://127.0.0.1:$port/graphql"
username="$(uci -q get daed.config.dashboard_username)"
password="$(uci -q get daed.config.dashboard_password)"
if [ -z "$username" ] || [ -z "$password" ]; then
fail 2 "missing daed dashboard username or password"
fi
if ! /bin/pidof daed >/dev/null 2>&1; then
fail 3 "daed is not running"
fi
post_graphql() {
local body="$1" outfile="$2" auth="$3"
if [ -n "$auth" ]; then
uclient-fetch -q -O "$outfile" \
--header="Content-Type: application/json" \
--header="Authorization: Bearer $auth" \
--post-file="$body" \
"$endpoint" 2>>"$LOG"
else
uclient-fetch -q -O "$outfile" \
--header="Content-Type: application/json" \
--post-file="$body" \
"$endpoint" 2>>"$LOG"
fi
}
login_body="$TMPDIR/login.json"
login_resp="$TMPDIR/login.out"
printf '{"query":"query Login($username:String!,$password:String!){token(username:$username,password:$password)}","variables":{"username":"%s","password":"%s"}}' \
"$(json_escape "$username")" "$(json_escape "$password")" > "$login_body"
log "starting daed subscription update"
if ! post_graphql "$login_body" "$login_resp"; then
fail 4 "login request failed"
fi
token="$(sed -n 's/.*"token"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$login_resp")"
if [ -z "$token" ]; then
fail 5 "login failed: $(cat "$login_resp" 2>/dev/null)"
fi
list_body="$TMPDIR/list.json"
list_resp="$TMPDIR/list.out"
printf '{"query":"query Subscriptions{subscriptions{id tag link}}","variables":{}}' > "$list_body"
if ! post_graphql "$list_body" "$list_resp" "$token"; then
fail 6 "subscription list request failed"
fi
if grep -q '"errors"' "$list_resp"; then
fail 7 "subscription list failed: $(cat "$list_resp" 2>/dev/null)"
fi
sed 's/"id"/\
"id"/g' "$list_resp" | sed -n 's/.*"id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' > "$TMPDIR/ids"
count="$(grep -c . "$TMPDIR/ids" 2>/dev/null || echo 0)"
if [ "${count:-0}" -eq 0 ]; then
log "no daed subscriptions to update"
exit 0
fi
ok=0
fail=0
while IFS= read -r id || [ -n "$id" ]; do
[ -n "$id" ] || continue
update_body="$TMPDIR/update.json"
update_resp="$TMPDIR/update.out"
printf '{"query":"mutation Update($id:ID!){updateSubscription(id:$id){id tag status}}","variables":{"id":"%s"}}' \
"$(json_escape "$id")" > "$update_body"
if post_graphql "$update_body" "$update_resp" "$token" && ! grep -q '"errors"' "$update_resp"; then
ok=$((ok + 1))
log "updated subscription $id"
else
fail=$((fail + 1))
log "failed subscription $id: $(cat "$update_resp" 2>/dev/null)"
fi
done < "$TMPDIR/ids"
log "finished daed subscription update: ok=$ok fail=$fail total=$count"
[ "$fail" -eq 0 ]
@@ -79,7 +79,10 @@
"/usr/share/luci-app-daede/update-pkg.sh luci-app-daede": [ "exec" ],
"/usr/share/luci-app-daede/fetch-clash-yaml.sh *": [ "exec" ],
"/usr/share/luci-app-daede/gen-dae-config.sh generate": [ "exec" ],
"/usr/share/luci-app-daede/gen-dae-config.sh import": [ "exec" ]
"/usr/share/luci-app-daede/gen-dae-config.sh import": [ "exec" ],
"/usr/share/luci-app-daede/daed-sub-update.sh": [ "exec" ],
"/usr/share/luci-app-daede/daed-sub-cron.sh enable": [ "exec" ],
"/usr/share/luci-app-daede/daed-sub-cron.sh disable": [ "exec" ]
},
"uci": [ "dae", "daed", "daede" ]
}
@@ -39,6 +39,14 @@ function parse_users(cfg) {
/* Main */
const config = {};
/* Cache START */
/* Cache settings */
config.profile = {
"store-selected": false,
"store-fake-ip": false
};
/* Cache END */
/* Inbound START */
config.listeners = [];
uci.foreach(uciconf, uciserver, (cfg) => {
+2 -2
View File
@@ -7,8 +7,8 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=virtualdog
PKG_VERSION:=1.0.0
PKG_RELEASE:=1
PKG_VERSION:=1.0.1
PKG_RELEASE:=2
LUCI_DEPENDS:=+virtualdog
LUCI_MINIFY_CSS:=0
LUCI_MINIFY_JS:=0
@@ -17,9 +17,11 @@ function virtualdog_status()
local sys = require "luci.sys"
local uci = require "luci.model.uci".cursor()
local port = uci:get_first("virtualdog", "virtualdog", "port") or "8080"
local access_token = uci:get_first("virtualdog", "virtualdog", "access_token") or ""
local status = {
running = (sys.call("pidof virtualdogd >/dev/null") == 0),
port = port
port = port,
access_token = access_token
}
http.prepare_content("application/json")
http.write_json(status)
@@ -23,12 +23,5 @@ port.description = translate("Port for VirtualDog HTTP server.")
local access_token = s:option(Value, "access_token", translate("Access token"))
access_token.password = true
access_token.optional = true
local help = s:option(DummyValue, "_kvm_help", translate("KVM packages"))
help.rawhtml = true
function help.cfgvalue()
return "<pre>" .. virtualdog_model.kvm_help() .. "</pre>"
end
return m
@@ -1,7 +0,0 @@
local virtualdog = {}
virtualdog.kvm_help = function()
return "amd KVM使用 opkg install kmod-kvm-amd\nintel KVM使用 opkg install kmod-kvm-intel"
end
return virtualdog
@@ -7,7 +7,7 @@ XHR.poll(5, '<%=url("admin/services/virtualdog_status")%>', null, function(x, st
}
if (st.running) {
el.innerHTML = '<br/><em style="color:green"><%:The VirtualDog service is running.%></em>'
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Click to open VirtualDog%> \" onclick=\"window.open('http://" + window.location.hostname + ":" + st.port + "/')\"/>";
+ "<br/><br/><input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\" <%:Click to open VirtualDog%> \" onclick=\"window.open('http://" + window.location.hostname + ":" + st.port + "/auth?token=" + st.access_token + "')\"/>";
}
}
});
@@ -28,8 +28,6 @@ msgstr "VirtualDog HTTP 服务端口。"
msgid "Access token"
msgstr "访问令牌"
msgid "KVM packages"
msgstr "KVM 依赖"
msgid "The VirtualDog service is not running."
msgstr "VirtualDog 服务未运行。"
+2 -2
View File
@@ -10,12 +10,12 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=natflow
PKG_VERSION:=20260531
PKG_RELEASE:=26
PKG_RELEASE:=27
PKG_SOURCE:=$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=https://github.com/ptpt52/natflow.git
PKG_SOURCE_PROTO:=git
PKG_SOURCE_VERSION:=dab8eb7a37937b4cc848e63003a6a22097098b15
PKG_SOURCE_VERSION:=2c0dcb153602970189b18bb9ca6cf2bbcca4d992
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_MAINTAINER:=Chen Minqiang <ptpt52@gmail.com>
PKG_LICENSE:=GPL-2.0
+3 -3
View File
@@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=torrserver
PKG_VERSION:=MatriX.141.8
PKG_RELEASE:=9
PKG_VERSION:=MatriX.141.9
PKG_RELEASE:=10
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/YouROK/TorrServer.git
PKG_SOURCE_VERSION:=6e2e02d1be6ac8e75023c5fb3fb4f7c554b6c98c
PKG_SOURCE_VERSION:=9ba8f2a8a37869eda85eb2f1deaac71e89a183af
PKG_MIRROR_HASH:=skip
PKG_MAINTAINER:=Konstantine Shevlakov <shevlakov@132lan.ru>