diff --git a/ddns-go/Makefile b/ddns-go/Makefile
index a985fa38..03ad6864 100644
--- a/ddns-go/Makefile
+++ b/ddns-go/Makefile
@@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=ddns-go
-PKG_VERSION:=6.17.3
+PKG_VERSION:=6.17.4
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)?
-PKG_HASH:=8d12594cd7a8b77effb068181b1a6d0a378e6321b5e4c3ec438e415de5fe4039
+PKG_HASH:=80f3816d95933949ce7306b988b2612d91b95c6992af8e956378628fde19b615
PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE
diff --git a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
index 951a26e0..cedae0be 100755
--- a/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
+++ b/luci-app-ssr-plus/root/etc/init.d/shadowsocksr
@@ -1529,107 +1529,107 @@ get_name() {
gen_config_file() { #server1 type2 code3 local_port4 socks_port5 chain6 threads5
local server="$1"
local type="$2"
- local mode="$3"
+ local code="$3"
local local_port="$4"
local socks_port="$5"
local chain="$6"
local tmp_port
local ss_protocol
- case "$mode" in
+ case "$code" in
1)
- config_file=$tcp_config_file
+ config_file="$tcp_config_file"
chain_config_file=$(echo "${config_file}" | sed 's/ssrplus\//ssrplus\/chain-/')
;;
2)
- config_file=$udp_config_file
+ config_file="$udp_config_file"
chain_config_file=$(echo "${config_file}" | sed 's/ssrplus\//ssrplus\/chain-/')
;;
3)
if [ -n "$tmp_local_port" ]; then
- tmp_port=$tmp_local_port
+ tmp_port="$tmp_local_port"
else
- tmp_port=$tmp_shunt_local_port
+ tmp_port="$tmp_shunt_local_port"
fi
- config_file=$shunt_config_file
+ config_file="$shunt_config_file"
chain_config_file=$(echo "${config_file}" | sed 's/ssrplus\//ssrplus\/chain-/')
;;
4)
ss_protocol="socks"
- config_file=$local_config_file
+ config_file="$local_config_file"
chain_config_file=$(echo "${config_file}" | sed 's/ssrplus\//ssrplus\/chain-/')
;;
esac
case "$type" in
ss | ssr)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$local_port" "${ss_protocol:-redir}" >"$config_file"
- if [ "$mode" = "3" ]; then
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$tmp_port" socks >"$shunt_dns_config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $local_port ${ss_protocol:-redir} >"$config_file"
+ if [ "$code" = "3" ]; then
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $tmp_port socks >"$shunt_dns_config_file"
fi
;;
v2ray)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$local_port" "$socks_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $local_port $socks_port >"$config_file"
;;
trojan)
- case "$mode" in
+ case "$code" in
1)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" nat "$local_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server nat $local_port >"$config_file"
;;
2)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" client "$local_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server client $local_port >"$config_file"
;;
3)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" nat "$local_port" >"$config_file"
- lua /usr/share/shadowsocksr/gen_config.lua "$server" client "$tmp_port" >"$shunt_dns_config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server nat $local_port >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server client $tmp_port >"$shunt_dns_config_file"
;;
4)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" client "$local_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server client $local_port >"$config_file"
;;
esac
;;
naiveproxy)
- case "$mode" in
+ case "$code" in
1)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" redir "$local_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server redir $local_port >"$config_file"
;;
3)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" redir "$local_port" >"$config_file"
- lua /usr/share/shadowsocksr/gen_config.lua "$server" socks "$tmp_port" >"$shunt_dns_config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server redir $local_port >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server socks $tmp_port >"$shunt_dns_config_file"
;;
4)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" socks "$local_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server socks $local_port >"$config_file"
;;
esac
;;
hysteria2)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$local_port" "$socks_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $local_port $socks_port >"$config_file"
;;
tuic)
- case "$mode" in
+ case "$code" in
1|2|4)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$local_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $local_port >"$config_file"
;;
3)
if [ -z "$chain" ]; then
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$local_port" >"$shunt_dns_config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $local_port >"$shunt_dns_config_file"
else
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$local_port" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $local_port >"$config_file"
fi
;;
esac
;;
shadowtls)
- case "$mode" in
+ case "$code" in
1|2|4)
if [ -z "$chain" ]; then
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$type" "$local_port" >"$chain_config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $type $local_port >"$chain_config_file"
else
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$local_port" "$socks_port" "$chain" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $local_port $socks_port $chain >"$config_file"
fi
;;
3)
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$type" "$local_port" >"$chain_config_file"
- lua /usr/share/shadowsocksr/gen_config.lua "$server" "$mode" "$local_port" "$socks_port" "$chain" >"$config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $type $local_port >"$chain_config_file"
+ lua /usr/share/shadowsocksr/gen_config.lua $server $mode $local_port $socks_port $chain >"$config_file"
;;
esac
;;
diff --git a/luci-app-uugamebooster/Makefile b/luci-app-uugamebooster/Makefile
new file mode 100644
index 00000000..4a132d5c
--- /dev/null
+++ b/luci-app-uugamebooster/Makefile
@@ -0,0 +1,9 @@
+include $(TOPDIR)/rules.mk
+
+LUCI_TITLE:=LuCI support for UUgamebooster
+LUCI_DEPENDS:=+uugamebooster
+LUCI_PKGARCH:=all
+
+include $(TOPDIR)/feeds/luci/luci.mk
+
+# call BuildPackage - OpenWrt buildroot signature
diff --git a/luci-app-uugamebooster/htdocs/luci-static/resources/view/uugamebooster.js b/luci-app-uugamebooster/htdocs/luci-static/resources/view/uugamebooster.js
new file mode 100644
index 00000000..da7092cc
--- /dev/null
+++ b/luci-app-uugamebooster/htdocs/luci-static/resources/view/uugamebooster.js
@@ -0,0 +1,74 @@
+'use strict';
+'require form';
+'require view';
+'require poll';
+'require ui';
+'require rpc';
+
+var callServiceList = rpc.declare({
+ object: 'service',
+ method: 'list',
+ params: ['name'],
+ expect: { '': {} }
+});
+
+function getServiceStatus() {
+ return L.resolveDefault(callServiceList('uugamebooster'), {}).then(function(res) {
+ var instances = res['uugamebooster'] && res['uugamebooster']['instances'];
+ if (instances) {
+ for (var key in instances) {
+ if (instances[key] && instances[key].running)
+ return true;
+ }
+ }
+ return false;
+ });
+}
+
+return view.extend({
+ render: function() {
+ var m, s, o;
+
+ m = new form.Map('uugamebooster', _('UU Game Accelerator'), _('A Paid Game Acceleration service'));
+
+ s = m.section(form.GridSection, '_status', _('Status'));
+ s.render = function() {
+ return E('div', { class: 'cbi-section' }, [
+ E('p', { id: 'uugamebooster_status' }, _('Collecting data...'))
+ ]);
+ };
+
+ s = m.section(form.TypedSection, 'uugamebooster', _('Settings'));
+ s.anonymous = true;
+ s.addremove = false;
+
+ o = s.option(form.Flag, 'enabled', _('Enable'));
+ o.default = '0';
+ o.rmempty = false;
+
+ s = m.section(form.GridSection, '_qrcode', _('QR Code'));
+ s.render = function() {
+ return E('div', { class: 'cbi-section' }, [
+ E('p', { id: 'uugamebooster_qcode' }, [
+ E('img', { src: '/uugamebooster/uuios.png', height: '300' }),
+ E('img', { src: '/uugamebooster/uuandriod.png', height: '300' })
+ ])
+ ]);
+ };
+
+ poll.add(function() {
+ return getServiceStatus().then(function(running) {
+ var node = document.getElementById('uugamebooster_status');
+ if (node) {
+ if (running) {
+ node.innerHTML = 'UU GameAcc ' + _('RUNNING') + '';
+ } else {
+ node.innerHTML = 'UU GameAcc ' + _('NOT RUNNING') + '';
+ }
+ }
+ });
+ }, 3);
+
+ return m.render();
+ }
+});
diff --git a/luci-app-uugamebooster/po/zh_Hans/uugamebooster.po b/luci-app-uugamebooster/po/zh_Hans/uugamebooster.po
new file mode 100644
index 00000000..84464967
--- /dev/null
+++ b/luci-app-uugamebooster/po/zh_Hans/uugamebooster.po
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language: zh_Hans\n"
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:24
+msgid "Enable"
+msgstr "启用"
+
+#: root/usr/share/luci/menu.d/luci-app-uugamebooster.json:3
+msgid "UU GameAcc"
+msgstr "UU游戏加速器"
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:11
+msgid "UU Game Accelerator"
+msgstr "UU游戏加速器"
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:11
+msgid "A Paid Game Acceleration service"
+msgstr "一个付费主机游戏加速器 (开启服务后,使用手机APP绑定路由器并指定加速主机)"
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:13
+msgid "Status"
+msgstr "状态"
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:16
+msgid "Collecting data..."
+msgstr "正在收集数据..."
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:20
+msgid "Settings"
+msgstr "设置"
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:28
+msgid "QR Code"
+msgstr "二维码"
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:44
+msgid "RUNNING"
+msgstr "运行中"
+
+#: htdocs/luci-static/resources/view/uugamebooster.js:46
+msgid "NOT RUNNING"
+msgstr "未运行"
diff --git a/luci-app-uugamebooster/root/usr/share/luci/menu.d/luci-app-uugamebooster.json b/luci-app-uugamebooster/root/usr/share/luci/menu.d/luci-app-uugamebooster.json
new file mode 100644
index 00000000..e66370b9
--- /dev/null
+++ b/luci-app-uugamebooster/root/usr/share/luci/menu.d/luci-app-uugamebooster.json
@@ -0,0 +1,13 @@
+{
+ "admin/services/uugamebooster": {
+ "title": "UU GameAcc",
+ "action": {
+ "type": "view",
+ "path": "uugamebooster"
+ },
+ "depends": {
+ "acl": [ "luci-app-uugamebooster" ],
+ "uci": { "uugamebooster": true }
+ }
+ }
+}
diff --git a/luci-app-uugamebooster/root/usr/share/rpcd/acl.d/luci-app-uugamebooster.json b/luci-app-uugamebooster/root/usr/share/rpcd/acl.d/luci-app-uugamebooster.json
new file mode 100644
index 00000000..0c8766a9
--- /dev/null
+++ b/luci-app-uugamebooster/root/usr/share/rpcd/acl.d/luci-app-uugamebooster.json
@@ -0,0 +1,14 @@
+{
+ "luci-app-uugamebooster": {
+ "description": "Grant UCI access for luci-app-uugamebooster",
+ "read": {
+ "uci": [ "uugamebooster" ],
+ "ubus": {
+ "service": [ "list" ]
+ }
+ },
+ "write": {
+ "uci": [ "uugamebooster" ]
+ }
+ }
+}
diff --git a/luci-app-uugamebooster/root/www/uugamebooster/uuandriod.png b/luci-app-uugamebooster/root/www/uugamebooster/uuandriod.png
new file mode 100644
index 00000000..279b9f70
Binary files /dev/null and b/luci-app-uugamebooster/root/www/uugamebooster/uuandriod.png differ
diff --git a/luci-app-uugamebooster/root/www/uugamebooster/uuios.png b/luci-app-uugamebooster/root/www/uugamebooster/uuios.png
new file mode 100644
index 00000000..bce47ab9
Binary files /dev/null and b/luci-app-uugamebooster/root/www/uugamebooster/uuios.png differ
diff --git a/uugamebooster/Makefile b/uugamebooster/Makefile
new file mode 100644
index 00000000..b501e8be
--- /dev/null
+++ b/uugamebooster/Makefile
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: GPL-3.0-only
+#
+# Copyright (C) 2021 ImmortalWrt.org
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=uugamebooster
+PKG_VERSION:=14.0.6
+PKG_RELEASE:=1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(ARCH).tar.gz
+PKG_SOURCE_URL:=https://uurouter.gdl.netease.com/uuplugin/openwrt-$(ARCH)/v$(PKG_VERSION)/uu.tar.gz?
+ifeq ($(ARCH),aarch64)
+ PKG_HASH:=4fe6fcad525c525ad530af69f102d90c1189330e4e3c3183b577ddde27731e2a
+else ifeq ($(ARCH),arm)
+ PKG_HASH:=e8693a284d0a9445e73f8d2e9c3d330364cc6371d63c19da03f8e8c47f076caf
+else ifeq ($(ARCH),mipsel)
+ PKG_HASH:=6fd2497bfdcf228de050119f7f593547a0da3eca9c50baa6bf8d5da6e366c575
+else ifeq ($(ARCH),x86_64)
+ PKG_HASH:=1becd5ef81d257b22002f208cd303b04e421c7da4231523b7d82da2c7193b57f
+endif
+
+PKG_LICENSE:=Proprietary
+PKG_MAINTAINER:=Tianling Shen
+
+include $(INCLUDE_DIR)/package.mk
+
+STRIP:=true
+
+TAR_CMD=$(HOST_TAR) -C $(1)/ $(TAR_OPTIONS)
+
+define Package/uugamebooster
+ SECTION:=net
+ CATEGORY:=Network
+ DEPENDS:=@(aarch64||arm||mipsel||x86_64) +kmod-tun
+ TITLE:=NetEase UU Game Booster
+ URL:=https://uu.163.com
+endef
+
+define Package/uugamebooster/description
+ NetEase's UU Game Booster Accelerates Triple-A Gameplay and Market.
+endef
+
+define Build/Compile
+endef
+
+define Package/uugamebooster/conffiles
+/.uuplugin_uuid
+/usr/share/uugamebooster/uu.conf
+endef
+
+define Package/uugamebooster/install
+ $(INSTALL_DIR) $(1)/usr/bin
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/uuplugin $(1)/usr/bin/uugamebooster
+ $(INSTALL_BIN) $(PKG_BUILD_DIR)/xtables-nft-multi $(1)/usr/bin/xtables-nft-multi
+
+ $(INSTALL_DIR) $(1)/usr/share/uugamebooster
+ $(INSTALL_CONF) $(PKG_BUILD_DIR)/uu.conf $(1)/usr/share/uugamebooster/uu.conf
+
+ $(INSTALL_DIR) $(1)/etc/config $(1)/etc/init.d
+ $(INSTALL_CONF) $(CURDIR)/files/uugamebooster.config $(1)/etc/config/uugamebooster
+ $(INSTALL_BIN) $(CURDIR)/files/uugamebooster.init $(1)/etc/init.d/uugamebooster
+endef
+
+$(eval $(call BuildPackage,uugamebooster))
\ No newline at end of file
diff --git a/uugamebooster/files/uugamebooster.config b/uugamebooster/files/uugamebooster.config
new file mode 100644
index 00000000..b7343751
--- /dev/null
+++ b/uugamebooster/files/uugamebooster.config
@@ -0,0 +1,3 @@
+
+config uugamebooster 'config'
+ option enabled '0'
diff --git a/uugamebooster/files/uugamebooster.init b/uugamebooster/files/uugamebooster.init
new file mode 100644
index 00000000..704bac35
--- /dev/null
+++ b/uugamebooster/files/uugamebooster.init
@@ -0,0 +1,37 @@
+#!/bin/sh /etc/rc.common
+# Copyright (C) 2021 Tianling Shen
+
+USE_PROCD=1
+START=99
+
+CONF="uugamebooster"
+PROG="/usr/bin/uugamebooster"
+
+UU_CONF="/usr/share/uugamebooster/uu.conf"
+
+start_service() {
+ config_load "$CONF"
+ local enabled
+ config_get_bool enabled "config" "enabled" "0"
+ [ "$enabled" -eq "1" ] || return 1
+
+ procd_open_instance "$CONF"
+
+ procd_set_param command "$PROG" "$UU_CONF"
+
+ procd_set_param limits core="unlimited"
+ procd_set_param respawn
+ procd_set_param stdout 1
+ procd_set_param stderr 1
+
+ procd_close_instance
+}
+
+reload_service() {
+ stop
+ start
+}
+
+service_triggers() {
+ procd_add_reload_trigger "$CONF"
+}
\ No newline at end of file
diff --git a/uugamebooster/update.sh b/uugamebooster/update.sh
new file mode 100644
index 00000000..eb78790d
--- /dev/null
+++ b/uugamebooster/update.sh
@@ -0,0 +1,35 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-3.0-only
+#
+# Copyright (C) 2021 ImmortalWrt.org
+
+set -x
+
+export CURDIR="$(cd "$(dirname $0)"; pwd)"
+
+VERSION="$(curl -fsSL "https://router.uu.163.com/api/plugin?type=openwrt-aarch64" | jq -r ".url" | awk -F '/' '{print $6}' | tr -d 'v')" || exit 1
+PKG_VERSION="$(awk -F "PKG_VERSION:=" '{print $2}' "$CURDIR/Makefile" | xargs)"
+[ "$PKG_VERSION" != "$VERSION" ] || exit 0
+
+for ARCH in "aarch64" "arm" "mipsel" "x86_64"; do
+ FILE_INFO="$(curl -fsSL "https://router.uu.163.com/api/plugin?type=openwrt-$ARCH")"
+ FILE_MD5="$(echo "$FILE_INFO" | jq -r ".md5")"
+ FILE_VER="$(echo "$FILE_INFO" | jq -r ".url" | awk -F '/' '{print $6}' | tr -d 'v')"
+ if [ "$FILE_VER" != "$VERSION" ]; then
+ echo -e "Version mismatch. Expected version: $VERSION, got $FILE_VER."
+ exit 1
+ else
+ curl -fsSL "http://uurouter.gdl04.netease.com/uuplugin/openwrt-$ARCH/v$VERSION/uu.tar.gz" -o "$CURDIR/uu-$ARCH.tar.gz"
+ ACTUAL_MD5="$(md5sum "$CURDIR/uu-$ARCH.tar.gz" | awk '{print $1}')"
+ if [ "$ACTUAL_MD5" != "$FILE_MD5" ]; then
+ echo -e "HASH mismatch. Expected md5: $FILE_MD5, got $ACTUAL_MD5."
+ else
+ FILE_HASH="$(sha256sum "$CURDIR/uu-$ARCH.tar.gz" | awk '{print $1}')"
+ HASH_LINE="$(($(sed -n -e "/(\$(ARCH),$ARCH)/=" "$CURDIR/Makefile") + 1))"
+ sed -i "${HASH_LINE}s/PKG_HASH:=.*/PKG_HASH:=$FILE_HASH/" "$CURDIR/Makefile"
+ fi
+ rm -f "$CURDIR/uu-$ARCH.tar.gz"
+ fi
+done
+
+sed -i "s,PKG_VERSION:=.*,PKG_VERSION:=$VERSION,g" "$CURDIR/Makefile"
\ No newline at end of file
diff --git a/v2ray-geodata/Makefile b/v2ray-geodata/Makefile
index f75bf711..33043a4a 100644
--- a/v2ray-geodata/Makefile
+++ b/v2ray-geodata/Makefile
@@ -21,13 +21,13 @@ define Download/geoip
HASH:=b71d1999439dde2de2d2b6844a2befa50c50211ff739785c005ca7c230a17d6a
endef
-GEOSITE_VER:=20260730073441
+GEOSITE_VER:=20260730130613
GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER)
define Download/geosite
URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/
URL_FILE:=dlc.dat
FILE:=$(GEOSITE_FILE)
- HASH:=6fb4dfc07d7c92120b866848b8bd5aae7791bc55c32f0a6ca27b3cda2a1b53d3
+ HASH:=4b0a0308e3136813b265ce5ff1ff5c087c715a35df177a78f9c2245db1b1a4e1
endef
GEOSITE_IRAN_VER:=202607270122