mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-06 20:14:10 +08:00
🦄 Sync 2026-06-17 03:41:10
This commit is contained in:
1 parent
aa76a8f79d
commit
08b7eb4ffb
79 files changed
+1354
-486
No files matched your search
@@ -5,8 +5,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-daede
|
||||
PKG_VERSION:=1.12.0
|
||||
PKG_RELEASE:=11
|
||||
PKG_VERSION:=1.13.0
|
||||
PKG_RELEASE:=12
|
||||
PKG_MAINTAINER:=kenzok8
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
|
||||
@@ -13,6 +13,22 @@ const DATA_PATHS = {
|
||||
geosite: '/usr/share/v2ray/geosite.dat'
|
||||
};
|
||||
|
||||
// Geo data source presets. `loyalsoldier` keeps both URLs empty so the actual
|
||||
// default lives in one place — update-geo.sh — avoiding UI/script drift.
|
||||
const GEO_PRESETS = {
|
||||
loyalsoldier: { geoip: '', geosite: '' },
|
||||
v2fly: {
|
||||
geoip: 'https://github.com/v2fly/geoip/releases/latest/download/geoip.dat',
|
||||
geosite: 'https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat'
|
||||
}
|
||||
};
|
||||
|
||||
function currentPreset(gi, gs) {
|
||||
if (!gi && !gs) return 'loyalsoldier';
|
||||
if (gi === GEO_PRESETS.v2fly.geoip && gs === GEO_PRESETS.v2fly.geosite) return 'v2fly';
|
||||
return 'custom';
|
||||
}
|
||||
|
||||
const HEALTH_PATHS = {
|
||||
btf: '/sys/kernel/btf/vmlinux',
|
||||
netns: '/run/netns/daens'
|
||||
@@ -36,6 +52,11 @@ const CSS = [
|
||||
'.dd-up-btn:hover{background:rgba(128,128,128,.12)}',
|
||||
'.dd-up-btn:disabled{opacity:.45;cursor:not-allowed}',
|
||||
'.dd-up-btn-primary{border-color:#4aa065;color:#4aa065}',
|
||||
'.dd-geo-row{display:grid;grid-template-columns:96px 1fr;gap:10px;align-items:center;font-size:12px;padding:6px 0}',
|
||||
'.dd-geo-row label{opacity:.75;font-weight:600}',
|
||||
'.dd-geo-row input[type=text],.dd-geo-row select{font-size:12px;padding:4px 8px;border:1px solid rgba(128,128,128,.35);border-radius:5px;background:transparent;color:inherit;width:100%}',
|
||||
'.dd-geo-chk{display:flex;align-items:center;gap:6px}',
|
||||
'.dd-geo-actions{margin-top:10px;display:flex;gap:10px;align-items:center}',
|
||||
'.dd-up-log{margin-top:10px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:11px;padding:10px;border:1px solid rgba(128,128,128,.14);border-radius:8px;max-height:200px;overflow:auto;white-space:pre-wrap;word-break:break-all;display:none;background:inherit;color:#4a8c63}',
|
||||
'.dd-up-log.show{display:block}',
|
||||
'body.dark .dd-up-log,html[data-theme="dark"] .dd-up-log,html[data-bs-theme="dark"] .dd-up-log{color:#a3d9ad}',
|
||||
@@ -102,13 +123,20 @@ function probePkg(pkg) {
|
||||
});
|
||||
}
|
||||
|
||||
// YYYYMMDD-HHMM stamp for backup filenames
|
||||
function stamp() {
|
||||
const d = new Date(), p = n => (n < 10 ? '0' : '') + n;
|
||||
return '' + d.getFullYear() + p(d.getMonth() + 1) + p(d.getDate()) + '-' + p(d.getHours()) + p(d.getMinutes());
|
||||
}
|
||||
|
||||
return view.extend({
|
||||
load: function() {
|
||||
// background apk update so new versions show on next poll
|
||||
fs.exec('/usr/share/luci-app-daede/refresh-index.sh', []).catch(function() {});
|
||||
return Promise.all([
|
||||
backend.detectBackend(),
|
||||
uci.load('daed').catch(function() {})
|
||||
uci.load('daed').catch(function() {}),
|
||||
uci.load('daede').catch(function() {})
|
||||
]).then(function(r) {
|
||||
return r[0];
|
||||
});
|
||||
@@ -172,6 +200,49 @@ return view.extend({
|
||||
return runJob('update-pkg.sh', pkg, btn, '/tmp/luci-app-daede.pkg-' + pkg + '.log');
|
||||
};
|
||||
|
||||
// === Config backup (export / import the whole daede config) ===
|
||||
const exportBtn = E('button', { 'class': 'dd-up-btn' }, _('Export'));
|
||||
const importBtn = E('button', { 'class': 'dd-up-btn' }, _('Import'));
|
||||
const fileInput = E('input', { 'type': 'file', 'accept': '.tar.gz,.gz,application/gzip', 'style': 'display:none' });
|
||||
|
||||
exportBtn.addEventListener('click', function() {
|
||||
const orig = exportBtn.textContent;
|
||||
exportBtn.disabled = true; exportBtn.textContent = '...';
|
||||
fs.exec('/usr/share/luci-app-daede/config-backup.sh', ['export']).then(function(res) {
|
||||
if (res.code !== 0 || !res.stdout) {
|
||||
logPane.textContent = String(res.stderr || res.stdout || 'export failed').trim();
|
||||
logPane.classList.add('show');
|
||||
return;
|
||||
}
|
||||
const bin = atob(res.stdout.trim());
|
||||
const arr = new Uint8Array(bin.length);
|
||||
for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i);
|
||||
const url = URL.createObjectURL(new Blob([arr], { 'type': 'application/gzip' }));
|
||||
const a = E('a', { 'href': url, 'download': 'daede-config-' + stamp() + '.tar.gz' });
|
||||
document.body.appendChild(a); a.click(); document.body.removeChild(a);
|
||||
setTimeout(function() { URL.revokeObjectURL(url); }, 1000);
|
||||
}).catch(function() {}).finally(function() {
|
||||
exportBtn.disabled = false; exportBtn.textContent = orig;
|
||||
});
|
||||
});
|
||||
|
||||
importBtn.addEventListener('click', function() { fileInput.click(); });
|
||||
fileInput.addEventListener('change', function(ev) {
|
||||
const file = ev.target.files && ev.target.files[0];
|
||||
if (!file) return;
|
||||
if (!confirm(_('Import overwrites the current daede config and restarts the backend. Continue?'))) {
|
||||
fileInput.value = ''; return;
|
||||
}
|
||||
const reader = new FileReader();
|
||||
reader.onload = function(e) {
|
||||
const b64 = String(e.target.result).split(',')[1] || '';
|
||||
fs.write('/tmp/daede-import.b64', b64).then(function() {
|
||||
return runJob('config-backup.sh', 'import', importBtn, '/tmp/luci-app-daede.backup.log');
|
||||
}).catch(function() {}).finally(function() { fileInput.value = ''; });
|
||||
};
|
||||
reader.readAsDataURL(file);
|
||||
});
|
||||
|
||||
const refresh = function() {
|
||||
const probes = [
|
||||
probeFile(DATA_PATHS.geoip),
|
||||
@@ -309,16 +380,113 @@ return view.extend({
|
||||
poll.add(refresh);
|
||||
refresh();
|
||||
|
||||
// === Geo data source (preset / custom URL + auto-update) ===
|
||||
const geoSettings = (function() {
|
||||
const gi0 = uci.get('daede', 'config', 'geoip_url') || '';
|
||||
const gs0 = uci.get('daede', 'config', 'geosite_url') || '';
|
||||
const auto0 = uci.get('daede', 'config', 'geo_auto') === '1';
|
||||
const freq0 = uci.get('daede', 'config', 'geo_auto_freq') || 'daily';
|
||||
const preset0 = currentPreset(gi0, gs0);
|
||||
|
||||
const presetSel = E('select', {}, [
|
||||
E('option', { 'value': 'loyalsoldier' }, 'Loyalsoldier'),
|
||||
E('option', { 'value': 'v2fly' }, 'v2fly'),
|
||||
E('option', { 'value': 'custom' }, _('Custom'))
|
||||
]);
|
||||
presetSel.value = preset0;
|
||||
|
||||
const giInput = E('input', { 'type': 'text', 'placeholder': 'https://…/geoip.dat' });
|
||||
const gsInput = E('input', { 'type': 'text', 'placeholder': 'https://…/geosite.dat' });
|
||||
giInput.value = preset0 === 'custom' ? gi0 : '';
|
||||
gsInput.value = preset0 === 'custom' ? gs0 : '';
|
||||
|
||||
const customRows = E('div', {}, [
|
||||
E('div', { 'class': 'dd-geo-row' }, [ E('label', {}, 'GeoIP URL'), giInput ]),
|
||||
E('div', { 'class': 'dd-geo-row' }, [ E('label', {}, 'GeoSite URL'), gsInput ])
|
||||
]);
|
||||
const syncCustom = function() {
|
||||
customRows.style.display = presetSel.value === 'custom' ? '' : 'none';
|
||||
};
|
||||
presetSel.addEventListener('change', syncCustom);
|
||||
syncCustom();
|
||||
|
||||
const autoCb = E('input', { 'type': 'checkbox' });
|
||||
autoCb.checked = auto0;
|
||||
const freqSel = E('select', {}, [
|
||||
E('option', { 'value': 'daily' }, _('Daily')),
|
||||
E('option', { 'value': 'weekly' }, _('Weekly'))
|
||||
]);
|
||||
freqSel.value = freq0;
|
||||
|
||||
const saveBtn = E('button', { 'class': 'dd-up-btn dd-up-btn-primary' }, _('Save'));
|
||||
saveBtn.addEventListener('click', function() {
|
||||
const p = presetSel.value;
|
||||
let gi = '', gs = '';
|
||||
if (p === 'v2fly') { gi = GEO_PRESETS.v2fly.geoip; gs = GEO_PRESETS.v2fly.geosite; }
|
||||
else if (p === 'custom') { gi = giInput.value.trim(); gs = gsInput.value.trim(); }
|
||||
uci.set('daede', 'config', 'geoip_url', gi);
|
||||
uci.set('daede', 'config', 'geosite_url', gs);
|
||||
uci.set('daede', 'config', 'geo_auto', autoCb.checked ? '1' : '0');
|
||||
uci.set('daede', 'config', 'geo_auto_freq', freqSel.value);
|
||||
const orig = saveBtn.textContent;
|
||||
saveBtn.disabled = true; saveBtn.textContent = '...';
|
||||
uci.save().then(function() { return uci.apply(); }).then(function() {
|
||||
return fs.exec('/usr/share/luci-app-daede/geo-cron.sh', [autoCb.checked ? 'enable' : 'disable']);
|
||||
}).then(function() {
|
||||
logPane.textContent = _('Geo data source saved.');
|
||||
logPane.classList.add('show');
|
||||
ui.changes.init();
|
||||
}).catch(function(e) {
|
||||
logPane.textContent = _('Save failed') + ': ' + (e && e.message ? e.message : e);
|
||||
logPane.classList.add('show');
|
||||
}).finally(function() {
|
||||
saveBtn.disabled = false; saveBtn.textContent = orig;
|
||||
});
|
||||
});
|
||||
|
||||
const adv = E('div', { 'class': 'dd-adv dd-closed' }, [
|
||||
E('div', { 'class': 'dd-adv-bar' }, [
|
||||
E('span', {}, _('Data Source')),
|
||||
E('span', { 'class': 'dd-adv-chevron' }, '›')
|
||||
]),
|
||||
E('div', { 'class': 'dd-adv-body' }, [
|
||||
E('div', { 'class': 'dd-geo-row' }, [ E('label', {}, _('Source')), presetSel ]),
|
||||
customRows,
|
||||
E('div', { 'class': 'dd-geo-row' }, [
|
||||
E('label', {}, _('Auto-update')),
|
||||
E('div', { 'class': 'dd-geo-chk' }, [ autoCb, freqSel ])
|
||||
]),
|
||||
E('div', { 'class': 'dd-geo-actions' }, [ saveBtn ])
|
||||
])
|
||||
]);
|
||||
adv.firstChild.addEventListener('click', function() {
|
||||
adv.classList.toggle('dd-closed');
|
||||
});
|
||||
return adv;
|
||||
})();
|
||||
|
||||
return E('div', { 'class': 'dd-up-wrap' }, [
|
||||
E('style', {}, CSS),
|
||||
E('div', { 'class': 'dd-card' }, [
|
||||
E('h4', { 'class': 'dd-card-title' }, _('Data Updates')),
|
||||
dataBody
|
||||
dataBody,
|
||||
geoSettings
|
||||
]),
|
||||
E('div', { 'class': 'dd-card' }, [
|
||||
E('h4', { 'class': 'dd-card-title' }, _('Package Updates')),
|
||||
pkgBody
|
||||
]),
|
||||
E('div', { 'class': 'dd-card' }, [
|
||||
E('h4', { 'class': 'dd-card-title' }, _('Config Backup')),
|
||||
E('div', { 'class': 'dd-up-row' }, [
|
||||
E('span', { 'class': 'dd-up-icon dd-up-new' }, '⤓'),
|
||||
E('span', { 'class': 'dd-up-name' }, _('dae + daed')),
|
||||
E('span', { 'class': 'dd-up-meta' }, _('Back up / restore the whole daede config (kernels excluded)')),
|
||||
exportBtn,
|
||||
importBtn
|
||||
]),
|
||||
fileInput
|
||||
]),
|
||||
(function() {
|
||||
const adv = E('div', { 'class': 'dd-adv dd-closed' }, [
|
||||
E('div', { 'class': 'dd-adv-bar' }, [
|
||||
|
||||
@@ -738,3 +738,56 @@ msgstr ""
|
||||
|
||||
msgid "Node group \"%s\" is available on %s. Select nodes above to update it."
|
||||
msgstr ""
|
||||
|
||||
msgid "Config Backup"
|
||||
msgstr ""
|
||||
|
||||
msgid "Export"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import"
|
||||
msgstr ""
|
||||
|
||||
msgid "dae + daed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Back up / restore the whole daede config (kernels excluded)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import overwrites the current daede config and restarts the backend. Continue?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Data Source"
|
||||
msgstr ""
|
||||
|
||||
msgid "Custom"
|
||||
msgstr ""
|
||||
|
||||
msgid "Auto-update"
|
||||
msgstr ""
|
||||
|
||||
msgid "Daily"
|
||||
msgstr ""
|
||||
|
||||
msgid "Weekly"
|
||||
msgstr ""
|
||||
|
||||
msgid "Save"
|
||||
msgstr ""
|
||||
|
||||
msgid "Geo data source saved."
|
||||
msgstr ""
|
||||
|
||||
msgid "Save failed"
|
||||
msgstr ""
|
||||
|
||||
msgid "latest version unknown"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete the daens netns?"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"%s is running. Deleting the daens netns now will break its networking until "
|
||||
"you restart it. Continue?"
|
||||
msgstr ""
|
||||
@@ -946,3 +946,53 @@ msgstr "将所选节点作为一个命名节点组导入,避免机场节点较
|
||||
|
||||
msgid "Node group \"%s\" is available on %s. Select nodes above to update it."
|
||||
msgstr "节点组“%s”已导入 %s。重新选择上方节点即可更新此组。"
|
||||
|
||||
msgid "Config Backup"
|
||||
msgstr "配置备份"
|
||||
|
||||
msgid "Export"
|
||||
msgstr "导出"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "导入"
|
||||
|
||||
msgid "Back up / restore the whole daede config (kernels excluded)"
|
||||
msgstr "备份 / 还原整个 daede 配置(不含内核)"
|
||||
|
||||
msgid "Import overwrites the current daede config and restarts the backend. Continue?"
|
||||
msgstr "导入会覆盖当前 daede 配置并重启后端,确定继续?"
|
||||
|
||||
msgid "Data Source"
|
||||
msgstr "数据源"
|
||||
|
||||
msgid "Custom"
|
||||
msgstr "自定义"
|
||||
|
||||
msgid "Auto-update"
|
||||
msgstr "自动更新"
|
||||
|
||||
msgid "Daily"
|
||||
msgstr "每天"
|
||||
|
||||
msgid "Weekly"
|
||||
msgstr "每周"
|
||||
|
||||
msgid "Save"
|
||||
msgstr "保存"
|
||||
|
||||
msgid "Geo data source saved."
|
||||
msgstr "数据源已保存。"
|
||||
|
||||
msgid "Save failed"
|
||||
msgstr "保存失败"
|
||||
|
||||
msgid "latest version unknown"
|
||||
msgstr "最新版本未知"
|
||||
|
||||
msgid "Delete the daens netns?"
|
||||
msgstr "删除 daens netns?"
|
||||
|
||||
msgid ""
|
||||
"%s is running. Deleting the daens netns now will break its networking until "
|
||||
"you restart it. Continue?"
|
||||
msgstr "%s 正在运行。现在删除 daens netns 会中断其网络,直到重启它。确定继续?"
|
||||
@@ -946,3 +946,53 @@ msgstr "将所选节点作为一个命名节点组导入,避免机场节点较
|
||||
|
||||
msgid "Node group \"%s\" is available on %s. Select nodes above to update it."
|
||||
msgstr "节点组“%s”已导入 %s。重新选择上方节点即可更新此组。"
|
||||
|
||||
msgid "Config Backup"
|
||||
msgstr "配置备份"
|
||||
|
||||
msgid "Export"
|
||||
msgstr "导出"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "导入"
|
||||
|
||||
msgid "Back up / restore the whole daede config (kernels excluded)"
|
||||
msgstr "备份 / 还原整个 daede 配置(不含内核)"
|
||||
|
||||
msgid "Import overwrites the current daede config and restarts the backend. Continue?"
|
||||
msgstr "导入会覆盖当前 daede 配置并重启后端,确定继续?"
|
||||
|
||||
msgid "Data Source"
|
||||
msgstr "数据源"
|
||||
|
||||
msgid "Custom"
|
||||
msgstr "自定义"
|
||||
|
||||
msgid "Auto-update"
|
||||
msgstr "自动更新"
|
||||
|
||||
msgid "Daily"
|
||||
msgstr "每天"
|
||||
|
||||
msgid "Weekly"
|
||||
msgstr "每周"
|
||||
|
||||
msgid "Save"
|
||||
msgstr "保存"
|
||||
|
||||
msgid "Geo data source saved."
|
||||
msgstr "数据源已保存。"
|
||||
|
||||
msgid "Save failed"
|
||||
msgstr "保存失败"
|
||||
|
||||
msgid "latest version unknown"
|
||||
msgstr "最新版本未知"
|
||||
|
||||
msgid "Delete the daens netns?"
|
||||
msgstr "删除 daens netns?"
|
||||
|
||||
msgid ""
|
||||
"%s is running. Deleting the daens netns now will break its networking until "
|
||||
"you restart it. Continue?"
|
||||
msgstr "%s 正在运行。现在删除 daens netns 会中断其网络,直到重启它。确定继续?"
|
||||
@@ -0,0 +1,71 @@
|
||||
#!/bin/sh
|
||||
# config-backup.sh export|import — back up/restore the whole daede config
|
||||
# (dae + daed + active backend). export: prints base64(tar.gz) to stdout.
|
||||
# import: decodes /tmp/daede-import.b64, validates, restores, restarts backend.
|
||||
set -eu
|
||||
|
||||
ACTION="${1:-}"
|
||||
LOG="/tmp/luci-app-daede.backup.log"
|
||||
IMPORT_B64="/tmp/daede-import.b64"
|
||||
MAX_TAR=184320 # 180 KiB tar.gz -> ~240 KiB base64, under the ubus limit
|
||||
|
||||
# relative paths (no leading /) so tar entries match the extraction whitelist
|
||||
WHITELIST="etc/config/dae etc/config/daed etc/config/daede etc/dae/config.dae etc/daed/wing.db"
|
||||
|
||||
b64enc() { ucode -e 'let f=require("fs"); print(b64enc(f.open(ARGV[0],"r").read("all")));' -- "$1"; }
|
||||
b64dec() { ucode -e 'let f=require("fs"); let r=b64dec(trim(f.open(ARGV[0],"r").read("all"))); if(!r)exit(1); let o=f.open(ARGV[1],"w"); o.write(r); o.close();' -- "$1" "$2"; }
|
||||
|
||||
case "$ACTION" in
|
||||
export)
|
||||
exist=""
|
||||
for p in $WHITELIST; do [ -e "/$p" ] && exist="$exist $p"; done
|
||||
[ -n "$exist" ] || { echo "no config to back up" >&2; exit 1; }
|
||||
tmp="$(mktemp)"
|
||||
( cd / && tar -czf "$tmp" $exist ) 2>/dev/null || { rm -f "$tmp"; echo "tar failed" >&2; exit 1; }
|
||||
if [ "$(wc -c < "$tmp")" -gt "$MAX_TAR" ]; then
|
||||
rm -f "$tmp"; echo "config too large; use System Backup instead" >&2; exit 2
|
||||
fi
|
||||
b64enc "$tmp"
|
||||
rm -f "$tmp"
|
||||
;;
|
||||
|
||||
import)
|
||||
[ -f "$IMPORT_B64" ] || { echo "no upload found" >&2; exit 1; }
|
||||
(
|
||||
exec >"$LOG" 2>&1
|
||||
echo "$(date '+%F %T') begin import"
|
||||
rc=0
|
||||
tmp="$(mktemp)"
|
||||
if ! b64dec "$IMPORT_B64" "$tmp"; then
|
||||
echo "decode failed"; rc=1
|
||||
elif ! gzip -t "$tmp" 2>/dev/null; then
|
||||
echo "not a valid backup archive"; rc=1
|
||||
else
|
||||
# reject any entry outside the whitelist (path-traversal guard)
|
||||
bad="$(tar -tzf "$tmp" 2>/dev/null | grep -vxE 'etc/config/dae|etc/config/daed|etc/config/daede|etc/dae/config\.dae|etc/daed/wing\.db' | head -1)"
|
||||
if [ -n "$bad" ]; then
|
||||
echo "rejected: unexpected entry '$bad'"; rc=1
|
||||
else
|
||||
ab="$(uci -q get daede.config.active_backend || echo dae)"
|
||||
[ -x "/etc/init.d/$ab" ] && /etc/init.d/"$ab" stop 2>/dev/null || true
|
||||
if ( cd / && tar -xzf "$tmp" ); then
|
||||
echo "restored config"
|
||||
else
|
||||
echo "extract failed"; rc=1
|
||||
fi
|
||||
ab="$(uci -q get daede.config.active_backend || echo "$ab")"
|
||||
[ -x "/etc/init.d/$ab" ] && { /etc/init.d/"$ab" enabled || /etc/init.d/"$ab" enable; /etc/init.d/"$ab" restart 2>/dev/null || /etc/init.d/"$ab" start 2>/dev/null; } || true
|
||||
fi
|
||||
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)"
|
||||
) </dev/null >/dev/null 2>&1 &
|
||||
echo "started in background, see $LOG"
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "usage: $0 export|import" >&2
|
||||
exit 64
|
||||
;;
|
||||
esac
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/bin/sh
|
||||
# geo-cron.sh enable|disable
|
||||
# Manage the geo auto-update crontab entry. enable reads the schedule from
|
||||
# daede.config.geo_auto_freq (daily|weekly); both actions are idempotent.
|
||||
|
||||
ACTION="$1"
|
||||
CRONTAB="/etc/crontabs/root"
|
||||
TAG="# luci-app-daede geo-update"
|
||||
SCRIPT="/usr/share/luci-app-daede/update-geo.sh"
|
||||
|
||||
# Drop any previous daede geo entry (tag line + its command line).
|
||||
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" ]; then
|
||||
case "$(uci -q get daede.config.geo_auto_freq)" in
|
||||
weekly) sched="17 4 * * 0" ;; # Sunday 04:17
|
||||
*) sched="17 4 * * *" ;; # every day 04:17
|
||||
esac
|
||||
mkdir -p /etc/crontabs
|
||||
{
|
||||
echo "$TAG"
|
||||
echo "$sched $SCRIPT geoip; $SCRIPT geosite"
|
||||
} >> "$CRONTAB"
|
||||
/etc/init.d/cron enable >/dev/null 2>&1
|
||||
fi
|
||||
|
||||
/etc/init.d/cron restart >/dev/null 2>&1
|
||||
exit 0
|
||||
@@ -5,13 +5,18 @@
|
||||
# in /tmp prevents concurrent runs.
|
||||
|
||||
TYPE="$1"
|
||||
# Default source: Loyalsoldier/v2ray-rules-dat — daily-built, China-optimized,
|
||||
# ships both geoip.dat and geosite.dat. Users can override per-type via
|
||||
# daede.config.geoip_url / geosite_url (empty falls back to the default below).
|
||||
case "$TYPE" in
|
||||
geoip)
|
||||
URL="https://github.com/v2fly/geoip/releases/latest/download/geoip.dat"
|
||||
DEF_URL="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat"
|
||||
URL="$(uci -q get daede.config.geoip_url)"
|
||||
DEST="/usr/share/v2ray/geoip.dat"
|
||||
;;
|
||||
geosite)
|
||||
URL="https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat"
|
||||
DEF_URL="https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"
|
||||
URL="$(uci -q get daede.config.geosite_url)"
|
||||
DEST="/usr/share/v2ray/geosite.dat"
|
||||
;;
|
||||
*)
|
||||
@@ -19,6 +24,7 @@ case "$TYPE" in
|
||||
exit 64
|
||||
;;
|
||||
esac
|
||||
[ -n "$URL" ] || URL="$DEF_URL"
|
||||
|
||||
LOCK="/tmp/luci-app-daede.${TYPE}.lock"
|
||||
LOG="/tmp/luci-app-daede.${TYPE}.log"
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
"/tmp/luci-app-daede.pkg-dae.log": [ "read" ],
|
||||
"/tmp/luci-app-daede.pkg-daed.log": [ "read" ],
|
||||
"/tmp/luci-app-daede.pkg-luci-app-daede.log": [ "read" ],
|
||||
"/tmp/luci-app-daede.backup.log": [ "read" ],
|
||||
"/bin/pidof dae": [ "exec" ],
|
||||
"/bin/pidof daed": [ "exec" ],
|
||||
"/usr/bin/dae validate -c /tmp/dae-validate.dae": [ "exec" ],
|
||||
@@ -28,7 +29,8 @@
|
||||
"/usr/share/luci-app-daede/pkg-info.sh daed": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/pkg-info.sh luci-app-daede": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/refresh-index.sh": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/proxy-check.sh": [ "exec" ]
|
||||
"/usr/share/luci-app-daede/proxy-check.sh": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/config-backup.sh export": [ "exec" ]
|
||||
},
|
||||
"ubus": {
|
||||
"service": [ "list" ]
|
||||
@@ -39,6 +41,8 @@
|
||||
"file": {
|
||||
"/etc/dae/config.dae": [ "write" ],
|
||||
"/tmp/dae-validate.dae": [ "write" ],
|
||||
"/tmp/daede-import.b64": [ "write" ],
|
||||
"/usr/share/luci-app-daede/config-backup.sh import": [ "exec" ],
|
||||
"/etc/config/daede": [ "write" ],
|
||||
"/var/log/dae/dae.log": [ "write" ],
|
||||
"/var/log/daed/daed.log": [ "write" ],
|
||||
@@ -63,6 +67,8 @@
|
||||
"/sbin/ip netns del daens": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/update-geo.sh geoip": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/update-geo.sh geosite": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/geo-cron.sh enable": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/geo-cron.sh disable": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/update-pkg.sh dae": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/update-pkg.sh daed": [ "exec" ],
|
||||
"/usr/share/luci-app-daede/update-pkg.sh luci-app-daede": [ "exec" ],
|
||||
|
||||
Reference in new issue
Block a user