🐤 Sync 2026-10-03 17:31:57

This commit is contained in:
github-actions[bot] committed 2026-10-03 17:31:57 +08:00
1 parent 875c9f2ba9
commit b63935e763
219 files changed
+9704 -670

No files matched your search

+1 -1
View File
@@ -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
}
-4
View File
@@ -39,7 +39,3 @@ stop_service() {
killall -q clouddrive
[ -d "$mount_point" ] && fusermount -u "$mount_point"
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
-4
View File
@@ -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
View File
@@ -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
-4
View File
@@ -81,7 +81,3 @@ stop_service() {
service_triggers() {
procd_add_reload_trigger "$CONF"
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
-4
View File
@@ -35,7 +35,3 @@ service_triggers() {
procd_add_reload_trigger "$NAME"
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
-4
View File
@@ -76,7 +76,3 @@ service_stopped() {
service_triggers() {
procd_add_reload_trigger "network" "floatip"
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
-4
View File
@@ -48,7 +48,3 @@ stop_service() {
service_triggers() {
procd_add_reload_trigger "ghttpd"
}
reload_service() {
restart
}
+2 -2
View File
@@ -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)?
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
-4
View File
@@ -70,7 +70,3 @@ disabled_mirrors() {
service_stopped() {
disabled_mirrors
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
-4
View File
@@ -25,10 +25,6 @@ stop_service() {
service_stop "${PROG}"
}
reload_service() {
restart
}
service_triggers() {
procd_add_reload_trigger "${NAME}"
}
-4
View File
@@ -25,10 +25,6 @@ stop_service() {
service_stop "${PROG}"
}
reload_service() {
restart
}
service_triggers() {
procd_add_reload_trigger "${NAME}"
}
-4
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+2 -2
View File
@@ -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]',
+2 -2
View File
@@ -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 ''
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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)
-4
View File
@@ -101,7 +101,3 @@ stop_service()
echo "quectel-CM has stoped."
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
-4
View File
@@ -87,7 +87,3 @@ stop_service() {
service_triggers() {
procd_add_reload_trigger "$CONF"
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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 };
+1 -1
View File
@@ -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
-4
View File
@@ -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
}
+1 -1
View File
@@ -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
-4
View File
@@ -46,7 +46,3 @@ restart_service() {
stop_service
start_service
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
-4
View File
@@ -185,7 +185,3 @@ function start_ipv6_service() {
enable_ipv4_tproxy
enable_ipv6_tproxy
}
reload_service() {
restart
}
+1 -1
View File
@@ -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>
-4
View File
@@ -774,7 +774,3 @@ stop_service()
esac
done
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
-4
View File
@@ -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
}
+1 -1
View File
@@ -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
+1 -4
View File
@@ -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
}
}
+1 -1
View File
@@ -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)
+455
View File
@@ -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'; ?>
+280
View File
@@ -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'; ?>
-4
View File
@@ -48,7 +48,3 @@ stop() {
stop_service() {
stop
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
-4
View File
@@ -48,7 +48,3 @@ stop() {
$BIN -k
fi
}
reload_service() {
restart
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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
-4
View File
@@ -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
}
+1 -1
View File
@@ -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"
}
+1 -1
View File
@@ -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:= \
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -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:= \
+1 -1
View File
@@ -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