mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-26 18:12:51 +08:00
🐤 Sync 2026-10-03 17:31:57
This commit is contained in:
1 parent
875c9f2ba9
commit
b63935e763
219 files changed
+9704
-670
No files matched your search
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=aliyundrive-webdav
|
||||
PKG_VERSION:=2.3.3
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_SOURCE_PROTO:=git
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
|
||||
@@ -95,7 +95,3 @@ start_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "aliyundrive-webdav"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -39,7 +39,3 @@ stop_service() {
|
||||
killall -q clouddrive
|
||||
[ -d "$mount_point" ] && fusermount -u "$mount_point"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
+1
-1
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=dae
|
||||
PKG_VERSION:=2026.09.24
|
||||
PKG_RELEASE:=48
|
||||
PKG_RELEASE:=49
|
||||
|
||||
PKG_SOURCE:=dae-src-2026.09.24-17135da7c881.tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/dae-src
|
||||
|
||||
@@ -67,7 +67,3 @@ service_triggers() {
|
||||
hot_reload() {
|
||||
/etc/init.d/dae running && "$PROG" reload "$(cat /var/run/dae.pid)"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
+1
-1
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=daed
|
||||
PKG_VERSION:=2026.09.24
|
||||
PKG_RELEASE:=59
|
||||
PKG_RELEASE:=60
|
||||
|
||||
PKG_SOURCE:=daed-src-2026.09.24-527bb166b1ae.tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-daede/releases/download/daed-src
|
||||
|
||||
@@ -81,7 +81,3 @@ stop_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "$CONF"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
+1
-1
@@ -12,7 +12,7 @@ PKG_ARCH_FAIL2BANOP:=$(ARCH)
|
||||
PKG_NAME:=fail2banop
|
||||
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
|
||||
PKG_SOURCE_DATE:=1.0.1
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
ARCH_HEXCODE:=
|
||||
ifeq ($(ARCH),x86_64)
|
||||
ARCH_HEXCODE=8664
|
||||
|
||||
@@ -35,7 +35,3 @@ service_triggers() {
|
||||
procd_add_reload_trigger "$NAME"
|
||||
}
|
||||
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
+1
-1
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=floatip
|
||||
PKG_VERSION:=1.1.0
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
PKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>
|
||||
|
||||
include $(INCLUDE_DIR)/package.mk
|
||||
|
||||
@@ -76,7 +76,3 @@ service_stopped() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "network" "floatip"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
+1
-1
@@ -11,7 +11,7 @@ PKG_ARCH_ghttpd:=$(ARCH)
|
||||
|
||||
PKG_NAME:=ghttpd
|
||||
PKG_VERSION:=0.0.5
|
||||
PKG_RELEASE:=6
|
||||
PKG_RELEASE:=7
|
||||
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://github.com/Carseason/openwrt-packages/releases/download/prebuilt/
|
||||
PKG_HASH:=skip
|
||||
|
||||
@@ -48,7 +48,3 @@ stop_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "ghttpd"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
+2
-2
@@ -6,8 +6,8 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=gowebdav
|
||||
PKG_VERSION:=5.16.1
|
||||
PKG_RELEASE:=23
|
||||
PKG_VERSION:=5.17.0
|
||||
PKG_RELEASE:=24
|
||||
|
||||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
|
||||
PKG_SOURCE_URL:=https://codeload.github.com/hacdias/webdav/tar.gz/v$(PKG_VERSION)?
|
||||
|
||||
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=HomeRedirect
|
||||
PKG_VERSION:=2.0
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
PKG_DATE:=20260930
|
||||
|
||||
PKG_MAINTAINER:=xiaoqingfeng <xiaoqingfengatgm@gmail.com>
|
||||
|
||||
@@ -151,7 +151,3 @@ stop_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "homeredirect"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -12,7 +12,7 @@ PKG_ARCH_ISTOREENHANCE:=$(ARCH)
|
||||
PKG_NAME:=istoreenhance
|
||||
# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable
|
||||
PKG_SOURCE_DATE:=0.8.1
|
||||
PKG_RELEASE:=10
|
||||
PKG_RELEASE:=11
|
||||
ARCH_HEXCODE:=
|
||||
ifeq ($(ARCH),x86_64)
|
||||
ARCH_HEXCODE=8664
|
||||
|
||||
@@ -70,7 +70,3 @@ disabled_mirrors() {
|
||||
service_stopped() {
|
||||
disabled_mirrors
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
+1
-1
@@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=kismet
|
||||
PKG_VERSION:=2016-07-R1
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
|
||||
PKG_LICENSE:=LGPLv2.1
|
||||
PKG_CPE_ID:=cpe:/a:kismet:kismet
|
||||
|
||||
@@ -25,10 +25,6 @@ stop_service() {
|
||||
service_stop "${PROG}"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "${NAME}"
|
||||
}
|
||||
@@ -25,10 +25,6 @@ stop_service() {
|
||||
service_stop "${PROG}"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "${NAME}"
|
||||
}
|
||||
@@ -111,7 +111,3 @@ stop_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "$NAME"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -248,7 +248,3 @@ index 4712913..1383834 100755
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -266,7 +266,3 @@ service_triggers() {
|
||||
procd_add_raw_trigger 'interface.*.up' 5000 /etc/init.d/adguardhome restart
|
||||
fi
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -107,7 +107,3 @@ elif [ -z "$OLD_CONFIG_NEW_OPT_FILE" ] && [ "$OLD_CONFIG_FILE" != "$NEW_CONFIG_F
|
||||
else
|
||||
echo "AdGuard Home config is in its default path '$NEW_CONFIG_FILE'"
|
||||
fi
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -11,7 +11,7 @@ LUCI_DEPENDS:=+luci-compat +curl
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
PKG_VERSION:=1.8.9
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
|
||||
define Package/$(PKG_NAME)/conffiles
|
||||
/etc/config/advancedplus
|
||||
|
||||
@@ -151,7 +151,3 @@ reload() {
|
||||
restart
|
||||
}
|
||||
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -22,11 +22,11 @@ PKG_NAME:=luci-app-amlogic
|
||||
# DD = day (01 = 1st)
|
||||
# NN = daily release sequence (01 = first release of the day, 02 = second, ...)
|
||||
# Example below: 26.10.0101 = October 1, 2026, 1st release of the day
|
||||
PKG_VERSION:=26.10.0101
|
||||
PKG_VERSION:=26.10.0301
|
||||
# PKG_RELEASE marks the LuCI variant; onekey-install.sh relies on it (do NOT bump)
|
||||
# 1 = Lua version (lua branch) → tag: 26.10.0101
|
||||
# 2 = JS version (main branch) → tag: 26.10.0101-js
|
||||
PKG_RELEASE:=19
|
||||
PKG_RELEASE:=20
|
||||
|
||||
PKG_LICENSE:=GPL-2.0 License
|
||||
PKG_MAINTAINER:=ophub <https://github.com/ophub/luci-app-amlogic>
|
||||
|
||||
@@ -54,14 +54,14 @@ return view.extend({
|
||||
const repo = o.option(form.Value, 'amlogic_firmware_repo',
|
||||
_('OpenWrt download repository:'),
|
||||
_('Set the OpenWrt files download repository on github.com in [Online Download Update].'));
|
||||
repo.default = 'https://github.com/breakingbadboy/OpenWrt';
|
||||
repo.default = 'https://github.com/ophub/amlogic-s9xxx-openwrt';
|
||||
repo.rmempty = false;
|
||||
|
||||
// 3. Tags keyword
|
||||
const tag = o.option(form.Value, 'amlogic_firmware_tag',
|
||||
_('OpenWrt download tags keyword:'),
|
||||
_('Set the OpenWrt files download tags keyword for github.com in [Online Download Update].'));
|
||||
tag.default = 'ARMv8';
|
||||
tag.default = 'OpenWrt_lede_';
|
||||
tag.rmempty = false;
|
||||
|
||||
// 4. File suffix
|
||||
@@ -76,15 +76,14 @@ return view.extend({
|
||||
const kpath = o.option(form.ListValue, 'amlogic_kernel_path',
|
||||
_('Kernel download repository:'),
|
||||
_('Set the kernel files download repository on github.com in [Online Download Update].'));
|
||||
kpath.value('https://github.com/breakingbadboy/OpenWrt');
|
||||
kpath.value('https://github.com/ophub/kernel');
|
||||
kpath.default = 'https://github.com/breakingbadboy/OpenWrt';
|
||||
kpath.default = 'https://github.com/ophub/kernel';
|
||||
kpath.rmempty = false;
|
||||
|
||||
// 6. Kernel tags; available tags depend on the selected kernel repo.
|
||||
// Default is auto-derived from kernel_release suffixes (-rk3588/-rk35xx).
|
||||
const currentKpath = uci.get('amlogic', 'config', 'amlogic_kernel_path') ||
|
||||
'https://github.com/breakingbadboy/OpenWrt';
|
||||
'https://github.com/ophub/kernel';
|
||||
const knownTags = {
|
||||
kernel_rk3588: 'kernel_rk3588 [Rockchip RK3588 Kernel]',
|
||||
kernel_rk35xx: 'kernel_rk35xx [Rockchip RK35xx Kernel]',
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
|
||||
config amlogic 'config'
|
||||
option enable '1'
|
||||
option amlogic_firmware_repo 'https://github.com/breakingbadboy/OpenWrt'
|
||||
option amlogic_firmware_tag 'ARMv8'
|
||||
option amlogic_firmware_repo 'https://github.com/ophub/amlogic-s9xxx-openwrt'
|
||||
option amlogic_firmware_tag 'OpenWrt_lede_'
|
||||
option amlogic_firmware_suffix '.img.gz'
|
||||
option amlogic_kernel_path 'https://github.com/ophub/kernel'
|
||||
option amlogic_kernel_tags ''
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_VERSION:=1.0.5-r20241208
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
PKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>
|
||||
|
||||
LUCI_TITLE:=Easy Access AP / Modem
|
||||
|
||||
@@ -206,7 +206,3 @@ stop_service() {
|
||||
clean_config
|
||||
/etc/init.d/network reload
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -42,7 +42,3 @@ stop_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "$CONF"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
LUCI_NAME:=luci-app-change-mac
|
||||
PKG_VERSION:=0.3.9
|
||||
#PKG_RELEASE:=1
|
||||
#PKG_RELEASE:=2
|
||||
|
||||
LUCI_TITLE:=LuCI for MAC address randomizer
|
||||
LUCI_DEPENDS:=+bash +rgmac +getopt
|
||||
|
||||
@@ -102,10 +102,6 @@ restart() {
|
||||
start
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "$CONFIG_NAME"
|
||||
}
|
||||
@@ -185,7 +185,3 @@ stop_service() {
|
||||
config_load chinadns-ng
|
||||
config_foreach destroy_chnroute_ipset chinadns-ng
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-clashoo
|
||||
PKG_VERSION:=1.31.0
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
PKG_MAINTAINER:=kenzok8
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
|
||||
@@ -2024,7 +2024,3 @@ return view.extend({
|
||||
handleSave: null,
|
||||
handleReset: null
|
||||
});
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -4709,7 +4709,3 @@ return { success: false, message: '还原失败: ' + e };
|
||||
};
|
||||
|
||||
return { 'luci.clashoo': methods };
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk
|
||||
PKG_NAME:=luci-app-cpe
|
||||
#软件包版本
|
||||
PKG_VERSION:=5.0.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
#真正编译当前软件包的目录
|
||||
PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
|
||||
@@ -101,7 +101,3 @@ stop_service()
|
||||
echo "quectel-CM has stoped."
|
||||
}
|
||||
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-daed
|
||||
PKG_VERSION:=1.4
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
|
||||
LUCI_TITLE:=LuCI Support for DAED
|
||||
LUCI_DEPENDS:=+daed +zoneinfo-asia +luci-compat
|
||||
|
||||
@@ -87,7 +87,3 @@ stop_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "$CONF"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-daede
|
||||
PKG_VERSION:=1.15
|
||||
PKG_RELEASE:=48
|
||||
PKG_RELEASE:=49
|
||||
PKG_MAINTAINER:=kenzok8
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
|
||||
@@ -107,7 +107,3 @@ if [ -f /etc/config/dae ]; then
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -10,7 +10,7 @@ LUCI_DESCRIPTION:=Manage Android modem and optimize network settings.
|
||||
|
||||
PKG_MAINTAINER:=Hilman Maulana <hilman0.0maulana@gmail.com>
|
||||
PKG_VERSION:=1.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
PKG_LICENSE:=Apache-2.0
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
@@ -298,7 +298,3 @@ else
|
||||
echo " stop Stop the service"
|
||||
echo " restart Restart the service"
|
||||
fi
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -10,7 +10,7 @@ LUCI_DESCRIPTION:=Manage Android modem and optimize network settings.
|
||||
|
||||
PKG_MAINTAINER:=Hilman Maulana <hilman0.0maulana@gmail.com>
|
||||
PKG_VERSION:=1.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
PKG_LICENSE:=Apache-2.0
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
@@ -298,7 +298,3 @@ else
|
||||
echo " stop Stop the service"
|
||||
echo " restart Restart the service"
|
||||
fi
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -18,7 +18,7 @@ LUCI_DEPENDS:=+ip-full +tc +nftables +bc +kmod-ifb
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
PKG_VERSION:=1.3.0
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
PKG_MAINTAINER:=sirpdboy <herboy2008@gmail.com>
|
||||
|
||||
define Build/Compile
|
||||
|
||||
@@ -52,7 +52,3 @@ stop_service(){
|
||||
eqosplus stop
|
||||
}
|
||||
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-flowproxy
|
||||
PKG_VERSION:=1.0.4
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
|
||||
LUCI_TITLE:=LuCI Support for FlowProxy Traffic Diversion
|
||||
LUCI_DEPENDS:=+luci-base +nftables +kmod-nft-core +ip-full
|
||||
|
||||
@@ -227,7 +227,4 @@ const methods = {
|
||||
clear_logs: { call: function() { try { writefile(LOG_FILE, ''); return { result: true }; } catch(e) { return { result: false }; } } }
|
||||
};
|
||||
|
||||
return { 'luci.flowproxy': methods };
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
return { 'luci.flowproxy': methods };
|
||||
@@ -9,7 +9,7 @@ include $(INCLUDE_DIR)/package.mk
|
||||
LLUCI_TITLE:=Luci for OpenFog Pear P2P CDN
|
||||
LUCI_PKGARCH:=all
|
||||
PKG_VERSION:=7
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
LUCI_DEPENDS:=+luci-compat +fogvdn +jq +lsblk
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
@@ -134,7 +134,3 @@ reload_servie()
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -78,7 +78,3 @@ stop_service()
|
||||
echo "quectel-CM has stoped."
|
||||
}
|
||||
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-gpioled
|
||||
PKG_VERSION:=1.0.1-20230809
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
PKG_MAINTAINER:=<https://github.com/animegasan>
|
||||
|
||||
LUCI_TITLE:=LuCI for GPIO LED
|
||||
|
||||
@@ -46,7 +46,3 @@ restart_service() {
|
||||
stop_service
|
||||
start_service
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -18,7 +18,7 @@ LUCI_DEPENDS:= \
|
||||
|
||||
PKG_NAME:=luci-app-homeproxy-pro
|
||||
PKG_VERSION:=28.10.1.14
|
||||
PKG_RELEASE:=17
|
||||
PKG_RELEASE:=18
|
||||
|
||||
LUCI_BASENAME:=homeproxy-pro
|
||||
|
||||
|
||||
@@ -264,7 +264,3 @@ hp_dnsmasq_remove_snippets() {
|
||||
/etc/init.d/dnsmasq restart >"/dev/null" 2>&1 \
|
||||
|| log "Warning: failed to restart dnsmasq after removing the homeproxy-pro snippets."
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -108,7 +108,3 @@ hp_firewall_teardown() {
|
||||
fw4 reload >"/dev/null" 2>&1 || true
|
||||
hp_restore_upnp_mappings
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -184,7 +184,3 @@ stop_service()
|
||||
{
|
||||
killall quectel-CM >/dev/null 2>&1
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-miniproxy
|
||||
PKG_VERSION:=4.2
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
PKG_LICENSE:=MIT
|
||||
PKG_LICENSE_FILES:=LICENSE
|
||||
|
||||
@@ -185,7 +185,3 @@ function start_ipv6_service() {
|
||||
enable_ipv4_tproxy
|
||||
enable_ipv6_tproxy
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -7,7 +7,7 @@ PKG_NAME:=luci-app-modem
|
||||
LUCI_TITLE:=LuCI support for Modem
|
||||
LUCI_PKGARCH:=all
|
||||
PKG_VERSION:=1.4.4
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
PKG_LICENSE:=GPLv3
|
||||
PKG_LINCESE_FILES:=LICENSE
|
||||
PKF_MAINTAINER:=Siriling <siriling@qq.com>
|
||||
|
||||
@@ -774,7 +774,3 @@ stop_service()
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-natter
|
||||
PKG_VERSION:=1.1
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
LUCI_TITLE:=LuCI Support for Natter
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
@@ -227,7 +227,3 @@ uci_get_by_type() {
|
||||
local ret=$(uci get natter.@$1[$2].$3 2>/dev/null)
|
||||
echo ${ret:=$4}
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -4,7 +4,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-natter2
|
||||
PKG_VERSION:=1.0
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
LUCI_TITLE:=LuCI Support for Natter v2.2.1
|
||||
LUCI_PKGARCH:=all
|
||||
|
||||
@@ -105,7 +105,4 @@ service_triggers() {
|
||||
uci_get_by_type() {
|
||||
local ret=$(uci get natter2.@$1[$2].$3 2>/dev/null)
|
||||
echo ${ret:=$4}
|
||||
}
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
|
||||
PKG_MAINTAINER:=nosignal <https://github.com/nosignals/neko>
|
||||
PKG_NAME:=luci-app-neko
|
||||
PKG_VERSION:=1.2.4-beta
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=3
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
|
||||
@@ -0,0 +1,455 @@
|
||||
<?php
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2024 Nosignal <https://github.com/nosignals>
|
||||
*
|
||||
* Contributors:
|
||||
* - bobbyunknown <https://github.com/bobbyunknown>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
include './cfg.php';
|
||||
include './devinfo.php';
|
||||
$str_cfg=substr($selected_config, strlen("$neko_dir/config")+1);
|
||||
$core_mode = exec("uci -q get neko.cfg.core_mode");
|
||||
|
||||
if(isset($_POST['neko'])){
|
||||
$dt = $_POST['neko'];
|
||||
if ($core_mode == 'mihomo') {
|
||||
if ($dt == 'start') shell_exec("$neko_dir/core/neko -s");
|
||||
if ($dt == 'disable') shell_exec("$neko_dir/core/neko -k");
|
||||
if ($dt == 'restart') shell_exec("$neko_dir/core/neko -r");
|
||||
if ($dt == 'clear') {
|
||||
shell_exec("echo 'Log cleared...' > $neko_dir/tmp/log.txt");
|
||||
shell_exec("echo 'Log cleared...' > $neko_dir/tmp/neko_log.txt");
|
||||
}
|
||||
} elseif ($core_mode == 'singbox') {
|
||||
if ($dt == 'start') shell_exec("$neko_dir/core/singbox -s");
|
||||
if ($dt == 'disable') shell_exec("$neko_dir/core/singbox -k");
|
||||
if ($dt == 'restart') shell_exec("$neko_dir/core/singbox -r");
|
||||
if ($dt == 'clear') {
|
||||
shell_exec("echo 'Log cleared...' > $neko_dir/tmp/log.txt");
|
||||
shell_exec("echo 'Log cleared...' > $neko_dir/tmp/singbox_log.txt");
|
||||
}
|
||||
}
|
||||
}
|
||||
$neko_status=exec("uci -q get neko.cfg.enabled");
|
||||
|
||||
if ($core_mode == 'mihomo') {
|
||||
$binary_log = "$neko_dir/tmp/mihomo_log.txt";
|
||||
} elseif ($core_mode == 'singbox') {
|
||||
$binary_log = "$neko_dir/tmp/singbox_log.txt";
|
||||
}
|
||||
|
||||
if ($core_mode == 'mihomo') {
|
||||
} elseif ($core_mode == 'singbox') {
|
||||
}
|
||||
?>
|
||||
<?php
|
||||
include './header.php';
|
||||
include './navbar.php';
|
||||
?>
|
||||
<div class="container p-3">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<i data-feather="home" class="feather-sm me-2"></i>
|
||||
<h5 class="card-title mb-0">Neko Home</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<!-- core mode -->
|
||||
<div class="card mb-4">
|
||||
|
||||
<div class="card-body p-3">
|
||||
<div class="d-flex align-items-center justify-content-center">
|
||||
<?php if($core_mode == 'mihomo'): ?>
|
||||
<i data-feather="box" class="feather-lg text-primary me-3" style="width: 32px; height: 32px;"></i>
|
||||
<?php else: ?>
|
||||
<i data-feather="cpu" class="feather-lg text-success me-3" style="width: 32px; height: 32px;"></i>
|
||||
<?php endif; ?>
|
||||
<div class="text-center">
|
||||
<div class="small text-muted mb-1">Active Core</div>
|
||||
<h5 class="mb-0 fw-bold <?php echo ($core_mode == 'mihomo') ? 'text-primary' : 'text-success'; ?>">
|
||||
<?php echo strtoupper($core_mode); ?>
|
||||
</h5>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- System Information Card -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<i data-feather="server" class="feather-sm me-2"></i>
|
||||
<h5 class="card-title mb-0">System Information</h5>
|
||||
</div>
|
||||
<div class="card-body p-0">
|
||||
<div class="list-group list-group-flush">
|
||||
<?php
|
||||
$show_ip = exec("uci -q get neko.cfg.show_ip");
|
||||
$show_isp = exec("uci -q get neko.cfg.show_isp");
|
||||
|
||||
if($show_ip == '1') {
|
||||
?>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center border-bottom">
|
||||
<div class="d-flex align-items-center">
|
||||
<i data-feather="globe" class="feather-sm me-2"></i>
|
||||
<span>IP Address</span>
|
||||
</div>
|
||||
<span id="ip-address">Loading...</span>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
if($show_isp == '1') {
|
||||
?>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center border-bottom">
|
||||
<div class="d-flex align-items-center">
|
||||
<i data-feather="wifi" class="feather-sm me-2"></i>
|
||||
<span>ISP</span>
|
||||
</div>
|
||||
<span id="isp-info">Loading...</span>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center border-bottom">
|
||||
<div class="d-flex align-items-center">
|
||||
<i data-feather="smartphone" class="feather-sm me-2"></i>
|
||||
<span>Devices</span>
|
||||
</div>
|
||||
<span><?php echo $devices ?></span>
|
||||
</div>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center border-bottom">
|
||||
<div class="d-flex align-items-center">
|
||||
<i data-feather="cpu" class="feather-sm me-2"></i>
|
||||
<span>RAM</span>
|
||||
</div>
|
||||
<span><?php echo "$ramUsage/$ramTotal MB" ?></span>
|
||||
</div>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center border-bottom">
|
||||
<div class="d-flex align-items-center">
|
||||
<i data-feather="hard-drive" class="feather-sm me-2"></i>
|
||||
<span>OS Version</span>
|
||||
</div>
|
||||
<span><?php echo $OSVer ?></span>
|
||||
</div>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center border-bottom">
|
||||
<div class="d-flex align-items-center">
|
||||
<i data-feather="code" class="feather-sm me-2"></i>
|
||||
<span>Kernel Version</span>
|
||||
</div>
|
||||
<span><?php echo $kernelv ?></span>
|
||||
</div>
|
||||
<div class="list-group-item d-flex justify-content-between align-items-center border-bottom">
|
||||
<div class="d-flex align-items-center">
|
||||
<i data-feather="clock" class="feather-sm me-2"></i>
|
||||
<span>Uptime</span>
|
||||
</div>
|
||||
<span><?php echo "$hours h $minutes m $seconds s"?></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Neko Status Card -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<i data-feather="box" class="feather-sm me-2"></i>
|
||||
<h5 class="card-title mb-0">Neko</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="mb-3">
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<i data-feather="activity" class="feather-sm me-2"></i>
|
||||
<span>Status</span>
|
||||
</div>
|
||||
<div class="d-grid">
|
||||
<div class="btn-group col" role="group">
|
||||
<?php
|
||||
if($neko_status==1) echo "<button type=\"button\" class=\"btn btn-success\">RUNNING</button>\n";
|
||||
else echo "<button type=\"button\" class=\"btn btn-outline-primary\">DISABLED</button>\n";
|
||||
echo "<button type=\"button\" class=\"btn btn-warning\">$str_cfg</button>\n";
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<i data-feather="toggle-right" class="feather-sm me-2"></i>
|
||||
<span>Control</span>
|
||||
</div>
|
||||
<form action="index.php" method="post">
|
||||
<div class="d-grid">
|
||||
<div class="btn-group col" role="group">
|
||||
<?php
|
||||
if ($core_mode == 'mihomo') {
|
||||
echo '<button type="submit" name="neko" value="start" class="btn btn' . ($neko_status == 1 ? '-outline' : '') . '-success ' . ($neko_status == 1 ? 'disabled' : '') . '">
|
||||
<i data-feather="play" class="feather-sm"></i> Enable Mihomo
|
||||
</button>';
|
||||
echo '<button type="submit" name="neko" value="disable" class="btn btn' . ($neko_status == 0 ? '-outline' : '') . '-primary ' . ($neko_status == 0 ? 'disabled' : '') . '">
|
||||
<i data-feather="stop-circle" class="feather-sm"></i> Disable Mihomo
|
||||
</button>';
|
||||
echo '<button type="submit" name="neko" value="restart" class="btn btn' . ($neko_status == 0 ? '-outline' : '') . '-warning ' . ($neko_status == 0 ? 'disabled' : '') . '">
|
||||
<i data-feather="refresh-cw" class="feather-sm"></i> Restart Mihomo
|
||||
</button>';
|
||||
} elseif ($core_mode == 'singbox') {
|
||||
echo '<button type="submit" name="neko" value="start" class="btn btn' . ($neko_status == 1 ? '-outline' : '') . '-success ' . ($neko_status == 1 ? 'disabled' : '') . '">
|
||||
<i data-feather="play" class="feather-sm"></i> Enable Singbox
|
||||
</button>';
|
||||
echo '<button type="submit" name="neko" value="disable" class="btn btn' . ($neko_status == 0 ? '-outline' : '') . '-primary ' . ($neko_status == 0 ? 'disabled' : '') . '">
|
||||
<i data-feather="stop-circle" class="feather-sm"></i> Disable Singbox
|
||||
</button>';
|
||||
echo '<button type="submit" name="neko" value="restart" class="btn btn' . ($neko_status == 0 ? '-outline' : '') . '-warning ' . ($neko_status == 0 ? 'disabled' : '') . '">
|
||||
<i data-feather="refresh-cw" class="feather-sm"></i> Restart Singbox
|
||||
</button>';
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="d-flex align-items-center mb-2">
|
||||
<i data-feather="settings" class="feather-sm me-2"></i>
|
||||
<span>Running Mode</span>
|
||||
</div>
|
||||
<input class="form-control text-center" name="mode" type="text" placeholder="<?php
|
||||
if ($core_mode == 'mihomo') {
|
||||
echo $neko_cfg['echanced']." | ".$neko_cfg['mode'];
|
||||
} else if ($core_mode == 'singbox') {
|
||||
echo "SING-BOX | TUN";
|
||||
}
|
||||
?>" disabled>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Statistics Card -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<i data-feather="bar-chart-2" class="feather-sm me-2"></i>
|
||||
<h5 class="card-title mb-0">Traffic Statistics</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<!-- Statistik di tengah -->
|
||||
<div class="row justify-content-center text-center mb-4">
|
||||
<div class="col-md-6 col-xl-4">
|
||||
<h2 class="mb-2"><span id="downtotal">-</span></h2>
|
||||
<div class="text-muted">Download</div>
|
||||
</div>
|
||||
<div class="col-md-6 col-xl-4">
|
||||
<h2 class="mb-2"><span id="uptotal">-</span></h2>
|
||||
<div class="text-muted">Upload</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Chart dengan ukuran yang lebih kecil -->
|
||||
<div class="chart" style="height: 150px;">
|
||||
<canvas id="trafficChart"></canvas>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Logs Card -->
|
||||
<div class="accordion mb-4">
|
||||
<div class="accordion-item">
|
||||
<div class="accordion-header" id="logsHeader">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#logsCollapse">
|
||||
<h5 class="mb-0">Neko Log</h5>
|
||||
</button>
|
||||
</div>
|
||||
<div id="logsCollapse" class="accordion-collapse collapse" data-bs-parent="#logsHeader">
|
||||
<div class="accordion-body">
|
||||
<textarea class="form-control mb-3" id="logs" rows="10" readonly></textarea>
|
||||
|
||||
<h5 class="mb-3">Binary Log</h5>
|
||||
<textarea class="form-control mb-3" id="bin_logs" rows="10" readonly></textarea>
|
||||
|
||||
<form action="index.php" method="post">
|
||||
<button type="submit" name="neko" value="clear" class="btn btn-primary w-100">
|
||||
Clear Log
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function formatBytes(bytes) {
|
||||
if (bytes < 1024000) return (bytes/1024).toFixed(1) + " KB";
|
||||
if (bytes < 1024000000) return (bytes/1024000).toFixed(1) + " MB";
|
||||
return (bytes/1024000000).toFixed(2) + " GB";
|
||||
}
|
||||
|
||||
|
||||
let labels = [];
|
||||
let downloadData = [];
|
||||
let uploadData = [];
|
||||
let trafficChart;
|
||||
|
||||
function initChart() {
|
||||
const ctx = document.getElementById('trafficChart');
|
||||
if (!ctx) return;
|
||||
|
||||
trafficChart = new Chart(ctx, {
|
||||
type: 'line',
|
||||
data: {
|
||||
labels: labels,
|
||||
datasets: [{
|
||||
label: 'Download',
|
||||
data: downloadData,
|
||||
borderColor: '#3B7DDD',
|
||||
borderWidth: 2,
|
||||
fill: false,
|
||||
tension: 0.3,
|
||||
pointRadius: 0
|
||||
}, {
|
||||
label: 'Upload',
|
||||
data: uploadData,
|
||||
borderColor: '#28A745',
|
||||
borderWidth: 2,
|
||||
fill: false,
|
||||
tension: 0.3,
|
||||
pointRadius: 0
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
maintainAspectRatio: false,
|
||||
plugins: {
|
||||
legend: {
|
||||
display: true,
|
||||
position: 'top'
|
||||
}
|
||||
},
|
||||
scales: {
|
||||
x: {
|
||||
grid: {
|
||||
display: false
|
||||
}
|
||||
},
|
||||
y: {
|
||||
beginAtZero: true,
|
||||
grid: {
|
||||
borderDash: [2, 2]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function updateLogs() {
|
||||
const logsCollapse = document.getElementById('logsCollapse');
|
||||
if (!logsCollapse.classList.contains('show')) return;
|
||||
|
||||
|
||||
fetch('./lib/log.php?data=neko')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
const logs = document.getElementById('logs');
|
||||
if (logs) {
|
||||
logs.value = data;
|
||||
logs.scrollTop = logs.scrollHeight;
|
||||
}
|
||||
});
|
||||
|
||||
fetch('./lib/log.php?data=bin')
|
||||
.then(response => response.text())
|
||||
.then(data => {
|
||||
const binLogs = document.getElementById('bin_logs');
|
||||
if (binLogs) {
|
||||
binLogs.value = data;
|
||||
binLogs.scrollTop = binLogs.scrollHeight;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function updateStats() {
|
||||
fetch('./lib/up.php')
|
||||
.then(response => response.text())
|
||||
.then(upResult => {
|
||||
const uptotal = document.getElementById('uptotal');
|
||||
if (uptotal) uptotal.textContent = upResult;
|
||||
|
||||
fetch('./lib/down.php')
|
||||
.then(response => response.text())
|
||||
.then(downResult => {
|
||||
const downtotal = document.getElementById('downtotal');
|
||||
if (downtotal) downtotal.textContent = downResult;
|
||||
|
||||
if (trafficChart) {
|
||||
const now = new Date();
|
||||
const timeStr = now.getHours() + ':' +
|
||||
String(now.getMinutes()).padStart(2, '0') + ':' +
|
||||
String(now.getSeconds()).padStart(2, '0');
|
||||
|
||||
labels.push(timeStr);
|
||||
downloadData.push(parseFloat(downResult));
|
||||
uploadData.push(parseFloat(upResult));
|
||||
|
||||
if (labels.length > 10) {
|
||||
labels.shift();
|
||||
downloadData.shift();
|
||||
uploadData.shift();
|
||||
}
|
||||
|
||||
trafficChart.update();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
initChart();
|
||||
|
||||
setInterval(updateLogs, 1000);
|
||||
|
||||
setInterval(updateStats, 1000);
|
||||
|
||||
document.getElementById('logsCollapse').addEventListener('shown.bs.collapse', updateLogs);
|
||||
});
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
<?php if($show_ip == '1' || $show_isp == '1') { ?>
|
||||
fetch('http://ip-api.com/json/')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
<?php if($show_ip == '1') { ?>
|
||||
document.getElementById('ip-address').textContent = data.query;
|
||||
<?php } ?>
|
||||
<?php if($show_isp == '1') { ?>
|
||||
document.getElementById('isp-info').textContent = data.isp;
|
||||
<?php } ?>
|
||||
})
|
||||
.catch(error => {
|
||||
<?php if($show_ip == '1') { ?>
|
||||
document.getElementById('ip-address').textContent = 'Failed to load';
|
||||
<?php } ?>
|
||||
<?php if($show_isp == '1') { ?>
|
||||
document.getElementById('isp-info').textContent = 'Failed to load';
|
||||
<?php } ?>
|
||||
});
|
||||
<?php } ?>
|
||||
});
|
||||
</script>
|
||||
<?php include './footer.php'; ?>
|
||||
@@ -0,0 +1,280 @@
|
||||
<?php
|
||||
/**
|
||||
* MIT License
|
||||
*
|
||||
* Copyright (c) 2024 Nosignal <https://github.com/nosignals>
|
||||
*
|
||||
* Contributors:
|
||||
* - bobbyunknown <https://github.com/bobbyunknown>
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
include './cfg.php';
|
||||
|
||||
$themeDir = "$neko_www/assets/theme";
|
||||
$arrFiles = array();
|
||||
$arrFiles = glob("$themeDir/*.css");
|
||||
|
||||
$neko_version = exec("opkg list-installed | grep luci-app-neko | cut -d ' - ' -f3");
|
||||
$neko_latest = exec("curl -m 5 -f -s https://raw.githubusercontent.com/nosignals/openwrt-neko/main/luci-app-neko/Makefile | grep PKG_VERSION: | cut -d= -f2");
|
||||
$stat = 0;
|
||||
if ($neko_version == $neko_latest){
|
||||
$stat = 0;
|
||||
}
|
||||
else {
|
||||
$stat = 1;
|
||||
}
|
||||
|
||||
for($x=0;$x<count($arrFiles);$x++) $arrFiles[$x] = substr($arrFiles[$x], strlen($themeDir)+1);
|
||||
|
||||
if(isset($_POST['themechange'])){
|
||||
$dt = $_POST['themechange'];
|
||||
shell_exec("uci set neko.cfg.theme='$dt' && uci commit neko");
|
||||
$neko_theme = $dt;
|
||||
}
|
||||
if(isset($_POST['fw'])){
|
||||
$dt = $_POST['fw'];
|
||||
if ($dt == 'enable') shell_exec("uci set neko.cfg.new_interface='1' && uci commit neko");
|
||||
if ($dt == 'disable') shell_exec("uci set neko.cfg.new_interface='0' && uci commit neko");
|
||||
}
|
||||
if(isset($_POST['neko'])){
|
||||
$dt = $_POST['neko'];
|
||||
if ($dt == 'update'){
|
||||
updateNeko();
|
||||
}
|
||||
}
|
||||
if(isset($_POST['core_mode'])){
|
||||
$dt = $_POST['core_mode'];
|
||||
shell_exec("uci set neko.cfg.core_mode='$dt' && uci commit neko");
|
||||
$core_mode = $dt;
|
||||
}
|
||||
if(isset($_POST['show_ip'])){
|
||||
$show_ip = $_POST['show_ip'];
|
||||
shell_exec("uci set neko.cfg.show_ip='$show_ip' && uci commit neko");
|
||||
}
|
||||
if(isset($_POST['show_isp'])){
|
||||
$show_isp = $_POST['show_isp'];
|
||||
shell_exec("uci set neko.cfg.show_isp='$show_isp' && uci commit neko");
|
||||
}
|
||||
if(isset($_POST['show_luci'])){
|
||||
$show_luci = $_POST['show_luci'];
|
||||
shell_exec("uci set neko.cfg.show_luci='$show_luci' && uci commit neko");
|
||||
}
|
||||
function updateNeko(){
|
||||
$neko_latest = exec("curl -m 5 -f -s https://raw.githubusercontent.com/nosignals/openwrt-neko/main/luci-app-neko/Makefile | grep PKG_VERSION: | cut -d= -f2");
|
||||
if(!empty($neko_latest)){
|
||||
$url_update = "https://github.com/nosignals/openwrt-neko/releases/download/luci-app-neko_".$neko_latest."/luci-app-neko_".$neko_latest."_all.ipk";
|
||||
$str_update = <<<EOF
|
||||
#/bin/bash
|
||||
wget -O /tmp/neko.ipk $url_update
|
||||
cd /tmp
|
||||
opkg remove luci-app-neko
|
||||
opkg install neko.ipk
|
||||
rm -r /tmp/neko.ipk
|
||||
EOF;
|
||||
echo "<h1>UPDATING NEKO TO VERSION ".$neko_latest."</br>";
|
||||
echo "DONT CLOSE THIS TAB</br></h1>";
|
||||
echo "if in 30s not showing notification, you can try again update";
|
||||
file_put_contents('/tmp/neko_update', $str_update);
|
||||
exec("chmod +x /tmp/neko_update");
|
||||
shell_exec("/tmp/neko_update");
|
||||
echo "<h1>Done Updating, Please reload this tab</h1>";
|
||||
shell_exec("rm /tmp/neko_update");
|
||||
}
|
||||
else{
|
||||
echo "<h1>Check your Internet Connection!!!.</h1>";
|
||||
}
|
||||
}
|
||||
$fwstatus=shell_exec("uci get neko.cfg.new_interface");
|
||||
?>
|
||||
<?php include './header.php'; ?>
|
||||
<?php include './navbar.php'; ?>
|
||||
<div class="container p-3">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<i data-feather="settings" class="feather-sm me-2"></i>
|
||||
<h5 class="card-title mb-0">Core Settings</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<?php
|
||||
$neko_status = exec("uci -q get neko.cfg.enabled");
|
||||
$current_core = exec("uci -q get neko.cfg.core_mode");
|
||||
?>
|
||||
<?php if($neko_status == '1'): ?>
|
||||
<div class="alert alert-info">
|
||||
<i data-feather="info" class="feather-sm me-2"></i>
|
||||
Core <?php echo strtoupper($current_core); ?> is currently running. Please stop the service first to change the core.
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<form action="settings.php" method="post">
|
||||
<div class="mb-3">
|
||||
<label for="core_mode" class="form-label">Select Core Mode:</label>
|
||||
<select name="core_mode" id="core_mode" class="form-select" <?php if($neko_status == '1') echo 'disabled'; ?>>
|
||||
<option value="mihomo" <?php if($current_core == 'mihomo') echo 'selected'; ?>>Core Mihomo</option>
|
||||
<option value="singbox" <?php if($current_core == 'singbox') echo 'selected'; ?>>Core Singbox</option>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary" <?php if($neko_status == '1') echo 'disabled'; ?>>Save</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container p-3">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<i data-feather="settings" class="feather-sm me-2"></i>
|
||||
<h5 class="card-title mb-0">Neko Settings</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<?php
|
||||
$show_ip = exec("uci -q get neko.cfg.show_ip");
|
||||
$show_isp = exec("uci -q get neko.cfg.show_isp");
|
||||
$show_luci = exec("uci -q get neko.cfg.show_luci");
|
||||
?>
|
||||
<form action="settings.php" method="post">
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Show IP Address:</label>
|
||||
<select name="show_ip" class="form-select">
|
||||
<option value="1" <?php if($show_ip == '1') echo 'selected'; ?>>Enable</option>
|
||||
<option value="0" <?php if($show_ip == '0') echo 'selected'; ?>>Disable</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Show ISP:</label>
|
||||
<select name="show_isp" class="form-select">
|
||||
<option value="1" <?php if($show_isp == '1') echo 'selected'; ?>>Enable</option>
|
||||
<option value="0" <?php if($show_isp == '0') echo 'selected'; ?>>Disable</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label class="form-label">Show Neko on LuCI:</label>
|
||||
<select name="show_luci" class="form-select">
|
||||
<option value="1" <?php if($show_luci == '1') echo 'selected'; ?>>Enable</option>
|
||||
<option value="0" <?php if($show_luci == '0') echo 'selected'; ?>>Disable</option>
|
||||
</select>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Save</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container p-3">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<i data-feather="info" class="feather-sm me-2"></i>
|
||||
<h5 class="card-title mb-0">Software Information</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<table class="table table-borderless mb-3">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="col-2">Auto Reload Firewall</td>
|
||||
<form action="settings.php" method="post">
|
||||
<td class="d-grid">
|
||||
<div class="btn-group col" role="group" aria-label="ctrl">
|
||||
<button type="submit" name="fw" value="enable" class="btn btn<?php if($fwstatus==1) echo "-outline" ?>-success <?php if($fwstatus==1) echo "disabled" ?> d-grid">Enable</button>
|
||||
<button type="submit" name="fw" value="disable" class="btn btn<?php if($fwstatus==0) echo "-outline" ?>-warning <?php if($fwstatus==0) echo "disabled" ?> d-grid">Disable</button>
|
||||
</div>
|
||||
</td>
|
||||
</form>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="col-1">Client Version</td>
|
||||
<td class="col-4">
|
||||
<div class="form-control text-center" id="cliver">-</div>
|
||||
</td>
|
||||
<td class="col-1">
|
||||
<form action="settings.php" method="post">
|
||||
<button type="submit" name="neko" value="update" class="btn btn-primary <?php if($stat==0) echo "disabled " ?>col-10">Update</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="col-1">Core Version</td>
|
||||
<td class="col-4">
|
||||
<div class="form-control text-center" id="corever">-</div>
|
||||
</td>
|
||||
<td class="col-1">
|
||||
<a class="btn btn-primary col-10" target="_blank" href="https://github.com/nosignals/openwrt-neko/releases">Update</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="container p-3">
|
||||
<div class="card">
|
||||
<div class="card-header d-flex align-items-center">
|
||||
<i data-feather="info" class="feather-sm me-2"></i>
|
||||
<h5 class="card-title mb-0">About</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="text-center">
|
||||
<h5 class="mb-3">NekoClash</h5>
|
||||
<p>NekoClash is a family friendly Clash Proxy tool, this tool makes it easy for users to use Clash Proxy, and User can modify your own Theme based Bootstrap, inspired by OpenClash Tools. NekoClash has writen by PHP, and BASH.</p>
|
||||
<p>This tool aims to make it easier to use Clash Proxy</p>
|
||||
<p>If you have questions or feedback about NekoClash you can contact me on the <span class="badge bg-indigo"><b>DBAI Discord Server</b></span> link below</p>
|
||||
|
||||
<h5 class="mb-3">External Links</h5>
|
||||
<div class="container mb-4">
|
||||
<div class="row g-3 justify-content-center">
|
||||
<div class="col-md-6">
|
||||
<div class="d-grid">
|
||||
<a class="btn btn-outline-info" target="_blank" href="https://discord.gg/vtV5QSq6D6">
|
||||
<i data-feather="message-circle" class="feather-sm me-2"></i>
|
||||
DBAI Discord
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="d-grid">
|
||||
<a class="btn btn-outline-info" target="_blank" href="https://github.com/nosignals">
|
||||
<i data-feather="github" class="feather-sm me-2"></i>
|
||||
Github
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="d-grid">
|
||||
<a class="btn btn-outline-info" target="_blank" href="https://www.facebook.com/groups/indowrt">
|
||||
<i data-feather="facebook" class="feather-sm me-2"></i>
|
||||
indoWRT Group
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="d-grid">
|
||||
<a class="btn btn-outline-info" target="_blank" href="https://github.com/MetaCubeX/mihomo">
|
||||
<i data-feather="box" class="feather-sm me-2"></i>
|
||||
Mihomo
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="mb-0">Please don't <b>CHANGE</b> or <b>REMOVE</b> this Credit!.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php include './footer.php'; ?>
|
||||
@@ -48,7 +48,3 @@ stop() {
|
||||
stop_service() {
|
||||
stop
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
|
||||
PKG_MAINTAINER:=Thaolga <https://github.com/Thaolga/luci-app-nekobox>
|
||||
PKG_NAME:=luci-app-nekobox
|
||||
PKG_VERSION:=2.0.9
|
||||
PKG_RELEASE:=4
|
||||
PKG_RELEASE:=6
|
||||
|
||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -48,7 +48,3 @@ stop() {
|
||||
$BIN -k
|
||||
fi
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -10,7 +10,7 @@ LUCI_DEPENDS:=+netdata
|
||||
|
||||
PKG_NAME:=luci-app-netdata
|
||||
PKG_VERSION:=2.0.4
|
||||
PKG_RELEASE:=4
|
||||
PKG_RELEASE:=5
|
||||
PKG_LICENSE:=GPL-3.0
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
@@ -99,7 +99,3 @@ stop_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger 'netdata'
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -142,7 +142,3 @@ stop_service() {
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "netwiz"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -15,7 +15,7 @@ LUCI_TITLE:=Nezha Agent is the client version 2 of the Nezha Panel.
|
||||
LUCI_DEPENDS:=+nezha-agentv1
|
||||
LUCI_PKGARCH:=all
|
||||
PKG_VERSION:=30.0
|
||||
PKG_RELEASE:=2
|
||||
PKG_RELEASE:=3
|
||||
PKG_MAINTAINER:=<https://github.com/2018nuoyan/openwrt_nezha/>
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
@@ -98,7 +98,3 @@ service_triggers() {
|
||||
# 触发服务重载
|
||||
procd_add_reload_trigger "nezha-agent"
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -7,7 +7,7 @@ LUCI_TITLE:=LuCI support for NPS Client(NPC)
|
||||
LUCI_DEPENDS:=+npc
|
||||
LUCI_PKGARCH:=all
|
||||
PKG_VERSION:=1.3
|
||||
PKG_RELEASE:=1
|
||||
PKG_RELEASE:=2
|
||||
|
||||
include $(TOPDIR)/feeds/luci/luci.mk
|
||||
|
||||
|
||||
@@ -65,7 +65,3 @@ uci_get_by_type() {
|
||||
local ret=$(uci get npc.@$1[$2].$3 2>/dev/null)
|
||||
echo ${ret:=$4}
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-open-box
|
||||
PKG_VERSION:=0.1.280
|
||||
PKG_RELEASE:=5
|
||||
PKG_RELEASE:=6
|
||||
|
||||
PKG_MAINTAINER:=liandu2024
|
||||
PKG_LICENSE:=GPL-3.0-or-later
|
||||
|
||||
@@ -90,7 +90,3 @@ status() {
|
||||
echo "openbox is not running"
|
||||
return 1
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -89,10 +89,6 @@ status() {
|
||||
return 1
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "openbox"
|
||||
}
|
||||
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-passwall
|
||||
PKG_VERSION:=26.10.1
|
||||
PKG_RELEASE:=307
|
||||
PKG_RELEASE:=308
|
||||
PKG_PO_VERSION:=$(PKG_VERSION)
|
||||
|
||||
PKG_CONFIG_DEPENDS:= \
|
||||
|
||||
@@ -185,7 +185,7 @@ end
|
||||
function exec_call(cmd)
|
||||
math.randomseed(os.time())
|
||||
local tag = "\x01__RC__" .. tostring(math.random(100000, 999999)) .. "\x01"
|
||||
local f = io.popen('(' .. cmd .. '); printf "\\n' .. tag .. '%d" "$?"')
|
||||
local f = io.popen('(' .. cmd .. ') 2>&1; printf "\\n' .. tag .. '%d" "$?"')
|
||||
local out = f:read("*a") or ""
|
||||
f:close()
|
||||
local rc = out:match(tag .. "(%d+)%s*$")
|
||||
|
||||
@@ -56,10 +56,9 @@ function geo_convert_srs(var)
|
||||
if not fs.access(output_srs_file) and bin then
|
||||
local cmd = string.format("%q -type %q -action convert -input %q -list %q -output %q -lowmem=true",
|
||||
bin, prefix, geo_path, rule_name, output_srs_file)
|
||||
sys.call(cmd)
|
||||
local status = fs.access(output_srs_file) and "success." or "failed!"
|
||||
if status == "failed!" then
|
||||
api.log(string.format(" - %s:%s 转换为srs格式:%s", prefix, rule_name, status))
|
||||
local code, out = api.exec_call(cmd)
|
||||
if code ~= 0 or not fs.access(output_srs_file) then
|
||||
api.log(string.format(" - %s:%s 转换为srs格式:%s [%s]", prefix, rule_name, "failed!", out))
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1985,7 +1984,7 @@ function gen_config(var)
|
||||
table.insert(dns.servers, {
|
||||
tag = fakedns_tag,
|
||||
type = "fakeip",
|
||||
inet4_range = "198.18.0.0/15",
|
||||
inet4_range = "198.18.0.0/16",
|
||||
inet6_range = "2001:2::/48",
|
||||
})
|
||||
|
||||
|
||||
@@ -1752,7 +1752,7 @@ function gen_config(var)
|
||||
if remote_dns_fake or inner_fakedns == "1" then
|
||||
fakedns = {}
|
||||
local fakedns4 = {
|
||||
ipPool = "198.18.0.0/15",
|
||||
ipPool = "198.18.0.0/16",
|
||||
poolSize = 65535
|
||||
}
|
||||
local fakedns6 = {
|
||||
|
||||
@@ -93,15 +93,13 @@ end
|
||||
local function get_geosite(list_arg, out_path)
|
||||
local geosite_path = api.uci_get_c("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
|
||||
geosite_path = geosite_path:match("^(.*)/") .. "/geosite.dat"
|
||||
if not is_file_nonzero(geosite_path) then return 1 end
|
||||
if not is_file_nonzero(geosite_path) then return 1, "File geosite.dat not found" end
|
||||
if not list_arg or list_arg == "" then return 1, "Site list cannot be empty" end
|
||||
if not out_path or out_path == "" then return 1, "Output path cannot be empty" end
|
||||
local bin = api.finded_com("geoview")
|
||||
if bin and list_arg and out_path then
|
||||
local cmd = string.format("%q -type geosite -append=true -input %q -list %q -output %q -lowmem=true",
|
||||
bin, geosite_path, list_arg, out_path)
|
||||
sys.call(cmd)
|
||||
return 0
|
||||
end
|
||||
return 1
|
||||
local cmd = string.format("%q -type geosite -append=true -input %q -list %q -output %q -lowmem=true",
|
||||
bin, geosite_path, list_arg, out_path)
|
||||
return api.exec_call(cmd)
|
||||
end
|
||||
|
||||
sys.call("mkdir -p %s" % FLAG_PATH)
|
||||
@@ -127,6 +125,9 @@ end
|
||||
--自定义规则组,后声明的组具有更高优先级
|
||||
--屏蔽列表
|
||||
local file_block_host = CACHE_RULES_PATH .. "/block_host"
|
||||
if not fs.access(file_block_host .. "_ok") then
|
||||
api.remove(file_block_host)
|
||||
end
|
||||
if USE_BLOCK_LIST == "1" and not fs.access(file_block_host) then
|
||||
local block_domain, lookup_block_domain = {}, {}
|
||||
local geosite_arg = ""
|
||||
@@ -152,13 +153,19 @@ if USE_BLOCK_LIST == "1" and not fs.access(file_block_host) then
|
||||
end
|
||||
f_out:close()
|
||||
end
|
||||
local success = true
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
if get_geosite(geosite_arg, file_block_host) == 0 then
|
||||
local code, out = get_geosite(geosite_arg, file_block_host)
|
||||
if code == 0 then
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)完成")
|
||||
else
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)失败!")
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)失败![" .. out .. "]")
|
||||
success = false
|
||||
end
|
||||
end
|
||||
if success and fs.access(file_block_host) then
|
||||
sys.call("touch " .. file_block_host .. "_ok")
|
||||
end
|
||||
end
|
||||
if USE_BLOCK_LIST == "1" and is_file_nonzero(file_block_host) then
|
||||
tmp_lines = {
|
||||
@@ -214,6 +221,9 @@ end
|
||||
|
||||
--直连(白名单)列表
|
||||
local file_direct_host = CACHE_RULES_PATH .. "/direct_host"
|
||||
if not fs.access(file_direct_host .. "_ok") then
|
||||
api.remove(file_direct_host)
|
||||
end
|
||||
if USE_DIRECT_LIST == "1" and not fs.access(file_direct_host) then
|
||||
local direct_domain, lookup_direct_domain = {}, {}
|
||||
local geosite_arg = ""
|
||||
@@ -239,13 +249,19 @@ if USE_DIRECT_LIST == "1" and not fs.access(file_direct_host) then
|
||||
end
|
||||
f_out:close()
|
||||
end
|
||||
local success = true
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
if get_geosite(geosite_arg, file_direct_host) == 0 then
|
||||
local code, out = get_geosite(geosite_arg, file_direct_host)
|
||||
if code == 0 then
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)完成")
|
||||
else
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)失败!")
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)失败![" .. out .. "]")
|
||||
success = false
|
||||
end
|
||||
end
|
||||
if success and fs.access(file_direct_host) then
|
||||
sys.call("touch " .. file_direct_host .. "_ok")
|
||||
end
|
||||
end
|
||||
if USE_DIRECT_LIST == "1" and is_file_nonzero(file_direct_host) then
|
||||
local sets = {
|
||||
@@ -264,6 +280,9 @@ end
|
||||
|
||||
--代理(黑名单)列表
|
||||
local file_proxy_host = CACHE_RULES_PATH .. "/proxy_host"
|
||||
if not fs.access(file_proxy_host .. "_ok") then
|
||||
api.remove(file_proxy_host)
|
||||
end
|
||||
if USE_PROXY_LIST == "1" and not fs.access(file_proxy_host) then
|
||||
local proxy_domain, lookup_proxy_domain = {}, {}
|
||||
local geosite_arg = ""
|
||||
@@ -289,13 +308,19 @@ if USE_PROXY_LIST == "1" and not fs.access(file_proxy_host) then
|
||||
end
|
||||
f_out:close()
|
||||
end
|
||||
local success = true
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
if get_geosite(geosite_arg, file_proxy_host) == 0 then
|
||||
local code, out = get_geosite(geosite_arg, file_proxy_host)
|
||||
if code == 0 then
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)完成")
|
||||
else
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)失败!")
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)失败![" .. out .. "]")
|
||||
success = false
|
||||
end
|
||||
end
|
||||
if success and fs.access(file_proxy_host) then
|
||||
sys.call("touch " .. file_proxy_host .. "_ok")
|
||||
end
|
||||
end
|
||||
if USE_PROXY_LIST == "1" and is_file_nonzero(file_proxy_host) then
|
||||
local sets = {
|
||||
@@ -480,20 +505,22 @@ if IS_SHUNT_NODE and not only_global then
|
||||
end
|
||||
|
||||
if not USE_CACHE and USE_GEOVIEW == "1" then
|
||||
local return_direct, return_proxy, return_black
|
||||
if geosite_direct_arg ~= "" then
|
||||
return_direct = get_geosite(geosite_direct_arg, shunt_direct_host_tmp)
|
||||
local ok = true
|
||||
local function resolve(arg, dest)
|
||||
if arg == "" then return end
|
||||
local code, out = get_geosite(arg, dest)
|
||||
if code ~= 0 then
|
||||
ok = false
|
||||
log(" - 解析[分流节点] Geosite 失败![" .. out .. "]")
|
||||
end
|
||||
end
|
||||
if geosite_proxy_arg ~= "" then
|
||||
return_proxy = get_geosite(geosite_proxy_arg, shunt_proxy_host)
|
||||
end
|
||||
if geosite_black_arg ~= "" then
|
||||
return_black = get_geosite(geosite_black_arg, shunt_black_host)
|
||||
end
|
||||
if return_direct == 0 and return_proxy == 0 and return_black == 0 then
|
||||
resolve(geosite_direct_arg, shunt_direct_host_tmp)
|
||||
resolve(geosite_proxy_arg, shunt_proxy_host)
|
||||
resolve(geosite_black_arg, shunt_black_host)
|
||||
if ok then
|
||||
log(" - 解析[分流节点] Geosite 完成")
|
||||
else
|
||||
log(" - 解析[分流节点] Geosite 失败!")
|
||||
api.remove(MD5_FILE)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -577,7 +604,7 @@ end
|
||||
--是否接受直连 DNS 空响应
|
||||
if DEFAULT_TAG == "none_noip" then table.insert(config_lines, "noip-as-chnip") end
|
||||
|
||||
if DEFAULT_TAG == nil or DEFAULT_TAG == "smart" or DEFAULT_TAG == "none_noip" then DEFAULT_TAG = "none" end
|
||||
if not DEFAULT_TAG or DEFAULT_TAG == "smart" or DEFAULT_TAG == "none_noip" then DEFAULT_TAG = "none" end
|
||||
|
||||
table.insert(config_lines, "default-tag " .. DEFAULT_TAG)
|
||||
|
||||
|
||||
@@ -321,16 +321,16 @@ function add_rule(var)
|
||||
local function foreach_geosite(list_arg, callback)
|
||||
local geosite_path = api.uci_get_c("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
|
||||
geosite_path = geosite_path:match("^(.*)/") .. "/geosite.dat"
|
||||
if not fs.access(geosite_path) then return end
|
||||
if not fs.access(geosite_path) then return 1, "File geosite.dat not found" end
|
||||
if not list_arg or list_arg == "" then return 1, "Site list cannot be empty" end
|
||||
local bin = api.finded_com("geoview")
|
||||
if not (bin and list_arg) then return end
|
||||
local cmd = string.format("%q -type geosite -action extract -input %q -list %q -lowmem=true", bin, geosite_path, list_arg)
|
||||
local pipe = io.popen(cmd)
|
||||
if not pipe then return end
|
||||
for line in pipe:lines() do
|
||||
if line ~= "" then callback(line) end
|
||||
local code, out = api.exec_call(cmd)
|
||||
if code ~= 0 then return code, out end
|
||||
for line in out:gmatch("[^\r\n]+") do
|
||||
callback(line)
|
||||
end
|
||||
pipe:close()
|
||||
return 0
|
||||
end
|
||||
|
||||
local function get_dns_config_key()
|
||||
@@ -405,6 +405,7 @@ function add_rule(var)
|
||||
|
||||
if not fs.access(CACHE_DNS_PATH) then
|
||||
fs.mkdir(CACHE_DNS_PATH)
|
||||
local GEO_SUCCESS = true
|
||||
|
||||
--屏蔽列表
|
||||
if USE_CHINADNS_NG == "0" and USE_BLOCK_LIST == "1" then
|
||||
@@ -425,10 +426,15 @@ function add_rule(var)
|
||||
f:close()
|
||||
end
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
foreach_geosite(geosite_arg, function(line)
|
||||
local code, out = foreach_geosite(geosite_arg, function(line)
|
||||
set_domain_address(line, "")
|
||||
end)
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)完成")
|
||||
if code == 0 then
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)完成")
|
||||
else
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)失败![" .. out .. "]")
|
||||
GEO_SUCCESS = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -503,12 +509,17 @@ function add_rule(var)
|
||||
log(string.format(" - 域名白名单(whitelist):%s", fwd_dns or "默认"))
|
||||
end
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
foreach_geosite(geosite_arg, function(line)
|
||||
local code, out = foreach_geosite(geosite_arg, function(line)
|
||||
add_excluded_domain(line)
|
||||
set_domain_dns(line, fwd_dns)
|
||||
set_domain_ipset(line, table.concat(sets, ","))
|
||||
end)
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)完成")
|
||||
if code == 0 then
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)完成")
|
||||
else
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)失败![" .. out .. "]")
|
||||
GEO_SUCCESS = false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -556,7 +567,7 @@ function add_rule(var)
|
||||
log(string.format(" - 代理域名表(blacklist):%s", fwd_dns or "默认"))
|
||||
end
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
foreach_geosite(geosite_arg, function(line)
|
||||
local code, out = foreach_geosite(geosite_arg, function(line)
|
||||
add_excluded_domain(line)
|
||||
if NO_PROXY_IPV6 == "1" then
|
||||
set_domain_address(line, "::")
|
||||
@@ -564,7 +575,12 @@ function add_rule(var)
|
||||
set_domain_dns(line, fwd_dns)
|
||||
set_domain_ipset(line, table.concat(sets, ","))
|
||||
end)
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)完成")
|
||||
if code == 0 then
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)完成")
|
||||
else
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)失败![" .. out .. "]")
|
||||
GEO_SUCCESS = false
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -698,12 +714,17 @@ function add_rule(var)
|
||||
end
|
||||
|
||||
if USE_GFW_LIST == "1" and CHN_LIST == "0" and USE_GEOVIEW == "1" and geosite_arg ~= "" then --仅GFW模式解析geosite
|
||||
foreach_geosite(geosite_arg, function(line)
|
||||
local code, out = foreach_geosite(geosite_arg, function(line)
|
||||
add_excluded_domain(line)
|
||||
set_domain_dns(line, fwd_dns)
|
||||
set_domain_ipset(line, table.concat(sets, ","))
|
||||
end)
|
||||
log(string.format(" - 解析分流规则(%s) Geosite 完成", s.remarks))
|
||||
if code == 0 then
|
||||
log(string.format(" - 解析分流规则(%s) Geosite 完成", s.remarks))
|
||||
else
|
||||
log(string.format(" - 解析分流规则(%s) Geosite 失败![" .. out .. "]", s.remarks))
|
||||
GEO_SUCCESS = false
|
||||
end
|
||||
end
|
||||
|
||||
log(string.format(" - Sing-Box/Xray分流规则(%s):%s", s.remarks, fwd_dns or "默认"))
|
||||
@@ -755,7 +776,8 @@ function add_rule(var)
|
||||
server_out:close()
|
||||
ipset_out:close()
|
||||
end
|
||||
|
||||
|
||||
if not GEO_SUCCESS then new_text = "" end
|
||||
local f_out = io.open(CACHE_TEXT_FILE, "a")
|
||||
f_out:write(new_text)
|
||||
f_out:close()
|
||||
|
||||
@@ -99,15 +99,13 @@ end
|
||||
local function get_geosite(list_arg, out_path)
|
||||
local geosite_path = api.uci_get_c("@global_rules[0]", "v2ray_location_asset") or "/usr/share/v2ray/"
|
||||
geosite_path = geosite_path:match("^(.*)/") .. "/geosite.dat"
|
||||
if not is_file_nonzero(geosite_path) then return 1 end
|
||||
if not is_file_nonzero(geosite_path) then return 1, "File geosite.dat not found" end
|
||||
if not list_arg or list_arg == "" then return 1, "Site list cannot be empty" end
|
||||
if not out_path or out_path == "" then return 1, "Output path cannot be empty" end
|
||||
local bin = api.finded_com("geoview")
|
||||
if bin and list_arg and out_path then
|
||||
local cmd = string.format("%q -type geosite -append=true -input %q -list %q -output %q -lowmem=true",
|
||||
bin, geosite_path, list_arg, out_path)
|
||||
sys.call(cmd)
|
||||
return 0
|
||||
end
|
||||
return 1
|
||||
local cmd = string.format("%q -type geosite -append=true -input %q -list %q -output %q -lowmem=true",
|
||||
bin, geosite_path, list_arg, out_path)
|
||||
return api.exec_call(cmd)
|
||||
end
|
||||
|
||||
sys.call("mkdir -p %s" % FLAG_PATH)
|
||||
@@ -285,6 +283,9 @@ end
|
||||
|
||||
--屏蔽列表
|
||||
local file_block_host = CACHE_RULES_PATH .. "/block_host"
|
||||
if not fs.access(file_block_host .. "_ok") then
|
||||
api.remove(file_block_host)
|
||||
end
|
||||
if USE_BLOCK_LIST == "1" and not fs.access(file_block_host) then
|
||||
local block_domain, lookup_block_domain = {}, {}
|
||||
local geosite_arg = ""
|
||||
@@ -310,13 +311,19 @@ if USE_BLOCK_LIST == "1" and not fs.access(file_block_host) then
|
||||
end
|
||||
f_out:close()
|
||||
end
|
||||
local success = true
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
if get_geosite(geosite_arg, file_block_host) == 0 then
|
||||
local code, out = get_geosite(geosite_arg, file_block_host)
|
||||
if code == 0 then
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)完成")
|
||||
else
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)失败!")
|
||||
log(" - 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)失败![" .. out .. "]")
|
||||
success = false
|
||||
end
|
||||
end
|
||||
if success and fs.access(file_block_host) then
|
||||
sys.call("touch " .. file_block_host .. "_ok")
|
||||
end
|
||||
end
|
||||
if USE_BLOCK_LIST == "1" and is_file_nonzero(file_block_host) then
|
||||
local domain_set_name = "psw-block"
|
||||
@@ -375,6 +382,9 @@ end
|
||||
|
||||
--直连(白名单)列表
|
||||
local file_direct_host = CACHE_RULES_PATH .. "/direct_host"
|
||||
if not fs.access(file_direct_host .. "_ok") then
|
||||
api.remove(file_direct_host)
|
||||
end
|
||||
if USE_DIRECT_LIST == "1" and not fs.access(file_direct_host) then
|
||||
local direct_domain, lookup_direct_domain = {}, {}
|
||||
local geosite_arg = ""
|
||||
@@ -400,13 +410,19 @@ if USE_DIRECT_LIST == "1" and not fs.access(file_direct_host) then
|
||||
end
|
||||
f_out:close()
|
||||
end
|
||||
local success = true
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
if get_geosite(geosite_arg, file_direct_host) == 0 then
|
||||
local code, out = get_geosite(geosite_arg, file_direct_host)
|
||||
if code == 0 then
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)完成")
|
||||
else
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)失败!")
|
||||
log(" - 解析[直连列表] Geosite 到域名白名单(whitelist)失败![" .. out .. "]")
|
||||
success = false
|
||||
end
|
||||
end
|
||||
if success and fs.access(file_direct_host) then
|
||||
sys.call("touch " .. file_direct_host .. "_ok")
|
||||
end
|
||||
end
|
||||
if USE_DIRECT_LIST == "1" and is_file_nonzero(file_direct_host) then
|
||||
local domain_set_name = "psw-directlist"
|
||||
@@ -427,6 +443,9 @@ end
|
||||
|
||||
--代理(黑名单)列表
|
||||
local file_proxy_host = CACHE_RULES_PATH .. "/proxy_host"
|
||||
if not fs.access(file_proxy_host .. "_ok") then
|
||||
api.remove(file_proxy_host)
|
||||
end
|
||||
if USE_PROXY_LIST == "1" and not fs.access(file_proxy_host) then
|
||||
local proxy_domain, lookup_proxy_domain = {}, {}
|
||||
local geosite_arg = ""
|
||||
@@ -452,13 +471,19 @@ if USE_PROXY_LIST == "1" and not fs.access(file_proxy_host) then
|
||||
end
|
||||
f_out:close()
|
||||
end
|
||||
local success = true
|
||||
if USE_GEOVIEW == "1" and geosite_arg ~= "" then
|
||||
if get_geosite(geosite_arg, file_proxy_host) == 0 then
|
||||
local code, out = get_geosite(geosite_arg, file_proxy_host)
|
||||
if code == 0 then
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)完成")
|
||||
else
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)失败!")
|
||||
log(" - 解析[代理列表] Geosite 到代理域名表(blacklist)失败![" .. out .. "]")
|
||||
success = false
|
||||
end
|
||||
end
|
||||
if success and fs.access(file_proxy_host) then
|
||||
sys.call("touch " .. file_proxy_host .. "_ok")
|
||||
end
|
||||
end
|
||||
if USE_PROXY_LIST == "1" and is_file_nonzero(file_proxy_host) then
|
||||
local domain_set_name = "psw-proxylist"
|
||||
@@ -647,20 +672,22 @@ if IS_SHUNT_NODE and not only_global then
|
||||
end
|
||||
|
||||
if not USE_CACHE and USE_GEOVIEW == "1" then
|
||||
local return_direct, return_proxy, return_black
|
||||
if geosite_direct_arg ~= "" then
|
||||
return_direct = get_geosite(geosite_direct_arg, shunt_direct_host)
|
||||
local ok = true
|
||||
local function resolve(arg, dest)
|
||||
if arg == "" then return end
|
||||
local code, out = get_geosite(arg, dest)
|
||||
if code ~= 0 then
|
||||
ok = false
|
||||
log(" - 解析[分流节点] Geosite 失败![" .. out .. "]")
|
||||
end
|
||||
end
|
||||
if geosite_proxy_arg ~= "" then
|
||||
return_proxy = get_geosite(geosite_proxy_arg, shunt_proxy_host)
|
||||
end
|
||||
if geosite_black_arg ~= "" then
|
||||
return_black = get_geosite(geosite_black_arg, shunt_black_host)
|
||||
end
|
||||
if return_direct == 0 and return_proxy == 0 and return_black == 0 then
|
||||
resolve(geosite_direct_arg, shunt_direct_host)
|
||||
resolve(geosite_proxy_arg, shunt_proxy_host)
|
||||
resolve(geosite_black_arg, shunt_black_host)
|
||||
if ok then
|
||||
log(" - 解析[分流节点] Geosite 完成")
|
||||
else
|
||||
log(" - 解析[分流节点] Geosite 失败!")
|
||||
api.remove(MD5_FILE)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ ip6t_m="$ip6t -t mangle -w"
|
||||
[ -z "$ip6t" ] || [ -z "$(lsmod | grep 'ip6table_nat')" ] && ip6t_n="eval #$ip6t_n"
|
||||
[ -z "$ip6t" ] || [ -z "$(lsmod | grep 'ip6table_mangle')" ] && ip6t_m="eval #$ip6t_m"
|
||||
FWI=$(uci -q get firewall.passwall.path 2>/dev/null)
|
||||
FAKE_IP="198.18.0.0/15"
|
||||
FAKE_IP="198.18.0.0/16"
|
||||
FAKE_IP_6="2001:2::/48"
|
||||
|
||||
USE_GEOVIEW=0
|
||||
|
||||
@@ -46,7 +46,7 @@ NFTSET_SHUNT6_STATIC="${NFTSET_SHUNT6}_static"
|
||||
FWMARK="0x50535731"
|
||||
|
||||
FWI=$(uci -q get firewall.passwall.path 2>/dev/null)
|
||||
FAKE_IP="198.18.0.0/15"
|
||||
FAKE_IP="198.18.0.0/16"
|
||||
FAKE_IP_6="2001:2::/48"
|
||||
|
||||
USE_GEOVIEW=0
|
||||
@@ -1637,7 +1637,3 @@ start)
|
||||
;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
|
||||
|
||||
PKG_NAME:=luci-app-passwall2
|
||||
PKG_VERSION:=26.10.1
|
||||
PKG_RELEASE:=134
|
||||
PKG_RELEASE:=135
|
||||
PKG_PO_VERSION:=$(PKG_VERSION)
|
||||
|
||||
PKG_CONFIG_DEPENDS:= \
|
||||
|
||||
@@ -215,7 +215,7 @@ end
|
||||
function exec_call(cmd)
|
||||
math.randomseed(os.time())
|
||||
local tag = "\x01__RC__" .. tostring(math.random(100000, 999999)) .. "\x01"
|
||||
local f = io.popen('(' .. cmd .. '); printf "\\n' .. tag .. '%d" "$?"')
|
||||
local f = io.popen('(' .. cmd .. ') 2>&1; printf "\\n' .. tag .. '%d" "$?"')
|
||||
local out = f:read("*a") or ""
|
||||
f:close()
|
||||
local rc = out:match(tag .. "(%d+)%s*$")
|
||||
|
||||
@@ -55,10 +55,9 @@ function geo_convert_srs(var)
|
||||
if not fs.access(output_srs_file) and bin then
|
||||
local cmd = string.format("%q -type %q -action convert -input %q -list %q -output %q -lowmem=true",
|
||||
bin, prefix, geo_path, rule_name, output_srs_file)
|
||||
sys.call(cmd)
|
||||
local status = fs.access(output_srs_file) and "success." or "failed!"
|
||||
if status == "failed!" then
|
||||
api.log(0, string.format(" - %s:%s convert to srs %s", prefix, rule_name, status))
|
||||
local code, out = api.exec_call(cmd)
|
||||
if code ~= 0 or not fs.access(output_srs_file) then
|
||||
api.log(0, string.format(" - %s:%s convert to srs %s [%s]", prefix, rule_name, "failed!", out))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1025,7 +1025,3 @@ start)
|
||||
;;
|
||||
*) ;;
|
||||
esac
|
||||
|
||||
reload_service() {
|
||||
restart
|
||||
}
|
||||
Loaded 100 of 219 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user