🚀 Sync 2026-11-12 14:17:53

This commit is contained in:
github-actions[bot] committed 2026-11-12 14:17:53 +08:00
1 parent 5738bba487
commit 399ff19ad9
16 files changed
+230 -51

No files matched your search

+2 -2
View File
@@ -6,13 +6,13 @@ PKG_UPSTREAM_TAG:=v$(PKG_UPSTREAM_VERSION)
PKG_SHORT_SHA:=3f27ef3
PKG_VERSION:=2026.11.04.$(PKG_UPSTREAM_VERSION)
PKG_RELEASE:=28
PKG_RELEASE:=29
PKG_SOURCE:=$(PKG_NAME)-stable-$(PKG_UPSTREAM_TAG)-$(PKG_SHORT_SHA).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-stable-$(PKG_UPSTREAM_TAG)-$(PKG_SHORT_SHA)
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_SOURCE_SUBDIR)
PKG_SOURCE_URL:=https://github.com/kenzok8/openwrt-clashoo/releases/download/mihomo-src
PKG_SOURCE_VERSION:=afda9f677ba3fe1e6150936e01569c273f91af2d
PKG_SOURCE_VERSION:=9c2b2fb5a0056be386050e68dbfa12f99ad81416
PKG_HASH:=skip
PKG_BUILD_VERSION:=$(PKG_UPSTREAM_TAG)
+2 -2
View File
@@ -1,8 +1,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=fan2go
PKG_VERSION:=0.15.0
PKG_RELEASE:=6
PKG_VERSION:=0.16.0
PKG_RELEASE:=7
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/markusressel/fan2go/tar.gz/$(PKG_VERSION)?
+138
View File
@@ -0,0 +1,138 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=libopenssl-gost
PKG_VERSION:=3.0.5
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/gost-engine/engine.git
PKG_SOURCE_VERSION:=af2b7e69e855572202420ffc36bae06ccd70796b
PKG_MAINTAINER:=
PKG_LICENSE:=Apache-2.0
PKG_LICENSE_FILES:=LICENSE
PKG_BUILD_DEPENDS:=openssl
PKG_BUILD_PARALLEL:=1
PKG_INSTALL:=1
include $(INCLUDE_DIR)/package.mk
include $(INCLUDE_DIR)/cmake.mk
CMAKE_OPTIONS += \
-DCMAKE_BUILD_TYPE=Release \
-DOPENSSL_ROOT_DIR=$(STAGING_DIR)/usr \
-DOPENSSL_ENGINES_DIR=/usr/lib/engines-3 \
-DGOST_BUILD_ENGINE=ON \
-DGOST_BUILD_STATIC_ENGINE=OFF \
-DGOST_BUILD_PROVIDER=ON \
-DGOST_BUILD_TESTS=OFF \
-DADDCARRY_U64_EXITCODE:STRING=0 \
-DRELAXED_ALIGNMENT_EXITCODE:STRING=0
define Package/libopenssl-gost-engine
SECTION:=libs
CATEGORY:=Libraries
TITLE:=OpenSSL GOST Engine
URL:=https://github.com/gost-engine/engine
DEPENDS:=+libopenssl
endef
define Package/libopenssl-gost-engine/description
GOST cryptographic algorithms implementation
for OpenSSL 3.x ENGINE interface.
endef
define Package/libopenssl-gost-provider
SECTION:=libs
CATEGORY:=Libraries
TITLE:=OpenSSL GOST Provider
URL:=https://github.com/gost-engine/engine
DEPENDS:=+libopenssl
endef
define Package/libopenssl-gost-provider/description
GOST cryptographic algorithms implementation
for OpenSSL 3.x provider interface.
endef
define Package/gost-utils
SECTION:=utils
CATEGORY:=Utilities
DEPENDS:=+libopenssl-gost-engine
TITLE+= GOST utilities
endef
define Package/libopenssl-gost-engine/install
$(INSTALL_DIR) $(1)/usr/lib/engines-3 \
$(1)/etc/ssl/modules.cnf.d \
$(1)/etc/uci-defaults
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/engines-3/gost.so \
$(1)/usr/lib/engines-3/
$(INSTALL_DATA) ./files/gost.cnf $(1)/etc/ssl/modules.cnf.d/
$(INSTALL_BIN) ./files/gost-engine.defaults \
$(1)/etc/uci-defaults/90-libopenssl-gost-engine
endef
define Package/libopenssl-gost-engine/postinst
#!/bin/sh
[ -s $${IPKG_INSTROOT}/lib/functions.sh ] || exit 0
. $${IPKG_INSTROOT}/lib/functions.sh
default_postinst $$0 $$@
[ -n "$${IPKG_INSTROOT}" ] || /etc/init.d/openssl restart >/dev/null 2>&1
exit 0
endef
define Package/libopenssl-gost-engine/prerm
#!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] || {
uci -q delete openssl.gost
uci commit openssl
/etc/init.d/openssl restart >/dev/null 2>&1
}
exit 0
endef
define Package/libopenssl-gost-provider/install
$(INSTALL_DIR) $(1)/usr/lib/ossl-modules \
$(1)/etc/ssl/modules.cnf.d \
$(1)/etc/uci-defaults
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/ossl-modules/gostprov.so \
$(1)/usr/lib/ossl-modules/
$(INSTALL_DATA) ./files/gostprov.cnf $(1)/etc/ssl/modules.cnf.d/
$(INSTALL_BIN) ./files/gost-provider.defaults \
$(1)/etc/uci-defaults/90-libopenssl-gost-provider
endef
define Package/gost-utils/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/gost12sum \
$(PKG_INSTALL_DIR)/usr/bin/gostsum \
$(1)/usr/bin/
endef
define Package/libopenssl-gost-provider/postinst
#!/bin/sh
[ -s $${IPKG_INSTROOT}/lib/functions.sh ] || exit 0
. $${IPKG_INSTROOT}/lib/functions.sh
default_postinst $$0 $$@
[ -n "$${IPKG_INSTROOT}" ] || /etc/init.d/openssl restart >/dev/null 2>&1
exit 0
endef
define Package/libopenssl-gost-provider/prerm
#!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] || {
uci -q delete openssl.gostprov
uci commit openssl
/etc/init.d/openssl restart >/dev/null 2>&1
}
exit 0
endef
$(eval $(call BuildPackage,libopenssl-gost-engine))
$(eval $(call BuildPackage,libopenssl-gost-provider))
$(eval $(call BuildPackage,gost-utils))
@@ -0,0 +1,10 @@
#!/bin/sh
touch /etc/config/openssl
uci -q get openssl.gost >/dev/null && exit 0
uci set openssl.gost=engine
uci set openssl.gost.enabled='1'
uci commit openssl
exit 0
@@ -0,0 +1,10 @@
#!/bin/sh
touch /etc/config/openssl
uci -q get openssl.gostprov >/dev/null && exit 0
uci set openssl.gostprov=provider
uci set openssl.gostprov.enabled='1'
uci commit openssl
exit 0
+5
View File
@@ -0,0 +1,5 @@
[gost_sect]
engine_id = gost
dynamic_path = /usr/lib/engines-3/gost.so
default_algorithms = ALL
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
+2
View File
@@ -0,0 +1,2 @@
[gostprov_sect]
activate = 1
@@ -0,0 +1,13 @@
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -288,7 +288,9 @@
if(GOST_BUILD_PROVIDER)
include(provider)
endif()
-include(tests)
+if(GOST_BUILD_TESTS)
+ include(tests)
+endif()
if(NOT MSVC)
add_executable(sign benchmark/sign.c)
@@ -827,13 +827,16 @@ function renderListeners(s, uciconfig, isClient) {
o.modalonly = true;
// common part
const initVlessEncryptionOption = function(o, key, load_callback = v => v) {
const initVlessEncryptionOption = function(o, key,
load_callback = (k, inst) => inst[k],
onchange_callback = (k, v, inst) => inst.setKey(k, v)
) {
o.load = function(section_id) {
return load_callback(new VlessEncryption(uci.get(uciconfig, section_id, 'vless_encryption_hmpayload'))[key]);
return load_callback(key, new VlessEncryption(uci.get(uciconfig, section_id, 'vless_encryption_hmpayload')));
}
o.onchange = function(ev, section_id, value) {
let UIEl = this.section.getUIElement(section_id, 'vless_encryption_hmpayload');
let newpayload = new VlessEncryption(UIEl.getValue()).setKey(key, value);
let newpayload = onchange_callback(key, value, new VlessEncryption(UIEl.getValue()));
UIEl.setValue(newpayload.toString());
@@ -979,7 +982,7 @@ function renderListeners(s, uciconfig, isClient) {
return node;
}
initVlessEncryptionOption(o, 'keypairs',
(keypairs) => JSON.stringify(keypairs, null, 2)
(k, inst) => JSON.stringify(inst[k], null, 2)
);
const keypairs_onchange = o.onchange;
o.onchange = function() {};
@@ -490,10 +490,10 @@ function flagToBool(flag) {
function renderPayload(s, total, uciconfig) {
// common payload
let initPayload = function(o, n, key, uciconfig) {
o.load = L.bind(function(n, key, uciconfig, section_id) {
let initPayload = function(o, n, key) {
o.load = function(section_id) {
return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayload(n)[key];
}, o, n, key, uciconfig);
}
o.onchange = function(ev, section_id, value) {
let UIEl = this.section.getUIElement(section_id, 'entry');
@@ -507,11 +507,11 @@ function renderPayload(s, total, uciconfig) {
o.rmempty = false;
o.modalonly = true;
}
let initDynamicPayload = function(o, n, key, uciconfig) {
let initDynamicPayload = function(o, n, key) {
o.allowduplicates = true;
o.load = L.bind(function(n, key, uciconfig, section_id) {
o.load = function(section_id) {
return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayloads().slice(n).map(e => e[key] ?? '');
}, o, n, key, uciconfig);
}
o.validate = function(section_id, value) {
value = this.formvalue(section_id);
let UIEl = this.section.getUIElement(section_id, 'entry');
@@ -548,7 +548,7 @@ function renderPayload(s, total, uciconfig) {
if (n < hm.rules_logical_payload_count[key].low)
o.depends('type', key);
})
initPayload(o, n, 'type', uciconfig);
initPayload(o, n, 'type');
o.onchange = function(ev, section_id, value) {
let UIEl = this.section.getUIElement(section_id, 'entry');
@@ -570,7 +570,7 @@ function renderPayload(s, total, uciconfig) {
o.depends(Object.fromEntries([[prefix + 'type', /\bGEO(SITE|IP)\b/]]));
o.depends(Object.fromEntries([[prefix + 'type', /\bASN\b/]]));
o.depends(Object.fromEntries([[prefix + 'type', /\bPROCESS\b/]]));
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o = s.option(form.Value, prefix + 'ip', _('Factor') + ` ${n+1}`);
o.datatype = 'cidr';
@@ -580,7 +580,7 @@ function renderPayload(s, total, uciconfig) {
}
o.depends(Object.fromEntries([[prefix + 'type', /\bCIDR6?\b/]]));
o.depends(Object.fromEntries([[prefix + 'type', /\bIP-SUFFIX\b/]]));
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o = s.option(form.Value, prefix + 'port', _('Factor') + ` ${n+1}`);
//o.datatype = 'or(port, portrange)'; // ⬇️ migrated to validate
@@ -588,7 +588,7 @@ function renderPayload(s, total, uciconfig) {
if (n === 0)
o.depends({type: /\bPORT\b/});
o.depends(Object.fromEntries([[prefix + 'type', /\bPORT\b/]]));
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
// if validate is already defined in initPayload
const port_old_validate = o.validate;
o.validate = function(section_id, value) {
@@ -608,7 +608,7 @@ function renderPayload(s, total, uciconfig) {
if (n === 0)
o.depends('type', 'IN-TYPE');
o.depends(prefix + 'type', 'IN-TYPE');
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o.load = L.bind(function(n, key, uciconfig, section_id) {
return (new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayload(n)[key] || '')
.split('/');
@@ -627,7 +627,7 @@ function renderPayload(s, total, uciconfig) {
if (n === 0)
o.depends('type', 'IN-NAME');
o.depends(prefix + 'type', 'IN-NAME');
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o.load = L.bind(function(n, key, uciconfig, section_id) {
hm.loadLabel.call(this, [
['', _('-- Please choose --')],
@@ -641,7 +641,7 @@ function renderPayload(s, total, uciconfig) {
if (n === 0)
o.depends('type', 'REMATCH-NAME');
o.depends(prefix + 'type', 'REMATCH-NAME');
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o.load = L.bind(function(n, key, uciconfig, section_id) {
hm.loadLabel.call(this, [
['', _('-- Please choose --')],
@@ -656,7 +656,7 @@ function renderPayload(s, total, uciconfig) {
if (n === 0)
o.depends('type', 'UID');
o.depends(prefix + 'type', 'UID');
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o = s.option(form.ListValue, prefix + 'l4', _('Factor') + ` ${n+1}`);
o.value('udp', _('UDP'));
@@ -664,20 +664,20 @@ function renderPayload(s, total, uciconfig) {
if (n === 0)
o.depends('type', 'NETWORK');
o.depends(prefix + 'type', 'NETWORK');
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o = s.option(form.Value, prefix + 'dscp', _('Factor') + ` ${n+1}`);
o.datatype = 'and(uinteger, range(0, 63))';
if (n === 0)
o.depends('type', 'DSCP');
o.depends(prefix + 'type', 'DSCP');
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o = s.option(form.ListValue, prefix + 'rule_set', _('Factor') + ` ${n+1}`);
if (n === 0)
o.depends('type', 'RULE-SET');
o.depends(prefix + 'type', 'RULE-SET');
initPayload(o, n, 'factor', uciconfig);
initPayload(o, n, 'factor');
o.load = L.bind(function(n, key, uciconfig, section_id) {
hm.loadLabel.call(this, hm.loadLabelValues(this.config, 'ruleset'), section_id);
@@ -687,7 +687,7 @@ function renderPayload(s, total, uciconfig) {
o = s.option(form.Flag, prefix + 'NOT', _('NOT') + ` ${n+1}`);
o.default = o.disabled;
o.depends(Object.fromEntries([[prefix + 'type', /.+/]]));
initPayload(o, n, 'deny', uciconfig);
initPayload(o, n, 'deny');
o.load = L.bind(function(n, key, uciconfig, section_id) {
return boolToFlag(new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayload(n)[key] ? true : false);
}, o, n, 'deny', uciconfig);
@@ -721,7 +721,7 @@ function renderPayload(s, total, uciconfig) {
extenbox[n].forEach((type) => {
o.depends('type', type);
})
initDynamicPayload(o, n, 'type', uciconfig);
initDynamicPayload(o, n, 'type');
o.validate = function(section_id, value) {
value = this.formvalue(section_id);
let UIEl = this.section.getUIElement(section_id, 'entry');
@@ -744,7 +744,7 @@ function renderPayload(s, total, uciconfig) {
extenbox[n].forEach((type) => {
o.depends(Object.fromEntries([['type', type], [prefix + 'type', /.+/]]));
})
initDynamicPayload(o, n, 'factor', uciconfig);
initDynamicPayload(o, n, 'factor');
o.load = L.bind(function(n, key, uciconfig, section_id) {
hm.loadLabel.call(this, [
...hm.inbound_type.map(e => [e, _('IN-TYPE')]), // Multi-values are not supported
@@ -765,7 +765,7 @@ function renderPayload(s, total, uciconfig) {
extenbox[n].forEach((type) => {
o.depends(Object.fromEntries([['type', type], [prefix + 'type', /.+/]]));
})
initDynamicPayload(o, n, 'deny', uciconfig);
initDynamicPayload(o, n, 'deny');
o.load = L.bind(function(n, key, uciconfig, section_id) {
return new RulesEntry(uci.get(uciconfig, section_id, 'entry')).getPayloads().slice(n).map(e => boolToFlag(e[key] ? true : false));
}, o, n, 'deny', uciconfig);
+4 -4
View File
@@ -1,14 +1,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=mihomo-alpha
PKG_VERSION:=2026.08.16
PKG_RELEASE:=20
PKG_VERSION:=2026.11.11
PKG_RELEASE:=21
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git
PKG_SOURCE_VERSION:=ac017cdd246ce8bd547653d927e7bf77d7ee73d5
PKG_SOURCE_VERSION:=0455d0d28c4526937380505153e65a843d8612e8
PKG_MIRROR_HASH:=skip
PKG_LICENSE:=GPL3.0+
@@ -18,7 +18,7 @@ PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_VERSION:=alpha-ac017cd
PKG_BUILD_VERSION:=alpha-0455d0d
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_TIME:=$(shell date -u -Iseconds)
+4 -4
View File
@@ -1,14 +1,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=mihomo-meta
PKG_VERSION:=1.19.32
PKG_RELEASE:=16
PKG_VERSION:=1.19.34
PKG_RELEASE:=17
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git
PKG_SOURCE_VERSION:=v1.19.32
PKG_SOURCE_VERSION:=v1.19.34
PKG_MIRROR_HASH:=skip
PKG_LICENSE:=GPL3.0+
@@ -18,7 +18,7 @@ PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_VERSION:=v1.19.32
PKG_BUILD_VERSION:=v1.19.34
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_TIME:=$(shell date -u -Iseconds)
+2 -2
View File
@@ -14,8 +14,8 @@ MISE_HASH_x86_64:=3832f39c325e343f81fe3d92b2447c5d1a5eea1bc85092bb7b6c2580622264
MISE_HASH_aarch64:=06186cfbfe947049b21d58575fb0ea800cc26ed1375f20f4b678cb3a9d679437
PKG_NAME:=mise
PKG_VERSION:=2026.11.6
PKG_RELEASE:=55
PKG_VERSION:=2026.11.7
PKG_RELEASE:=56
PKG_SOURCE:=$(PKG_NAME)-v$(PKG_VERSION)-linux-$(MISE_ARCH)-musl.tar.gz
PKG_SOURCE_URL:=https://github.com/jdx/mise/releases/download/v$(PKG_VERSION)/
PKG_HASH:=skip
+2 -2
View File
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=smartdns
PKG_VERSION:=48.5_rc1
PKG_RELEASE:=10
PKG_RELEASE:=11
PKG_SOURCE_VERSION:=320061d07c3d559a2fa734b2b4bc2891c86f4422
PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz
@@ -108,7 +108,7 @@ endef
define Build/Compile/smartdns-ui
cargo install --force --locked bindgen-cli
CARGO_BUILD_ARGS="$(if $(strip $(RUST_PKG_FEATURES)),--features "$(strip $(RUST_PKG_FEATURES))") --profile $(CARGO_PKG_PROFILE)"
+$(CARGO_PKG_VARS) CARGO_BUILD_ARGS="$(CARGO_BUILD_ARGS)" CC=$(TARGET_CC) \
+$(CARGO_PKG_VARS) CARGO_BUILD_ARGS="$(CARGO_BUILD_ARGS)" CC="$(TARGET_CC)" \
PATH="$$(PATH):$(CARGO_HOME)/bin" \
AWS_LC_SYS_CFLAGS="-O0" \
make -C $(PKG_BUILD_DIR)/plugin/smartdns-ui
+5 -7
View File
@@ -14,7 +14,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=v2raya
PKG_VERSION:=2.5.14
PKG_RELEASE:=6
PKG_RELEASE:=7
PKG_SOURCE:=v2rayA-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/v2rayA/v2rayA/tar.gz/v$(PKG_VERSION)?
@@ -141,14 +141,12 @@ define Build/Prepare
$(SED) '/if setting.DnsHijack == ""/,/}/ s/setting.DnsHijack = Yes/setting.DnsHijack = No/' \
$(PKG_BUILD_DIR)/db/configure/migrate_dns.go
# Router defaults: warn-level logging reduces flash writes, QUIC
# sniffing is pointless when the LAN QUIC block is in place, and the
# DNS cache is bounded for the case where a user enables the DNS
# module later.
# Router defaults: warn-level logging reduces flash writes and the DNS
# cache is bounded for the case where a user enables the DNS module
# later. QUIC sniffing stays enabled so HTTP/3 traffic still matches
# domain routing rules.
$(SED) 's/LogLevel: *"info"/LogLevel: "warn"/' \
$(PKG_BUILD_DIR)/db/configure/setting.go
$(SED) 's/InboundSniffing: *"http,tls,quic"/InboundSniffing: "http,tls"/' \
$(PKG_BUILD_DIR)/db/configure/setting.go
$(SED) 's/DnsCacheSize: *4096/DnsCacheSize: 1024/' \
$(PKG_BUILD_DIR)/db/configure/setting.go
$(SED) 's/DnsPrefetch: *true/DnsPrefetch: false/' \
+3 -3
View File
@@ -50,12 +50,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=wwand
PKG_VERSION:=1.9.0_pre13
PKG_RELEASE:=91
PKG_VERSION:=1.9.0_pre14
PKG_RELEASE:=92
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/ddimension/wwand.git
PKG_SOURCE_VERSION:=3416e85afc46948534527789d9462bfe3d45f0e2
PKG_SOURCE_VERSION:=4f3c54b1eeb65d898246545435ca2300e57ac30e
PKG_MIRROR_HASH:=skip
PKG_LICENSE:=GPL-2.0-only