Sync 2026-06-17 04:40:21

This commit is contained in:
github-actions[bot] 2026-06-17 04:40:21 +08:00
parent 9bd05f312f
commit 81f1fa4be3
6 changed files with 249 additions and 76 deletions

View File

@ -1,17 +1,12 @@
# SPDX-License-Identifier: GPL-3.0-only
#
# Copyright (C) 2022 ImmortalWrt.org
include $(TOPDIR)/rules.mk
PKG_NAME:=vlmcsd
PKG_RELEASE:=1
PKG_VERSION:=svn1113
PKG_RELEASE:=2
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/Wind4/vlmcsd.git
PKG_SOURCE_DATE:=2020-03-30
PKG_SOURCE_VERSION:=70e03572b254688b8c3557f898e7ebd765d29ae1
PKG_MIRROR_HASH:=skip
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/Wind4/vlmcsd/tar.gz/$(PKG_VERSION)?
PKG_HASH:=skip
PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE
@ -22,17 +17,33 @@ PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/vlmcsd
SECTION:=net
CATEGORY:=Network
TITLE:=A KMS Emulator in C
URL:=https://github.com/Wind4/vlmcsd
DEPENDS:=+libpthread
USERID:=vlmcsd:vlmcsd
SECTION:=net
CATEGORY:=Network
TITLE:=vlmcsd for OpenWRT
URL:=http://forums.mydigitallife.info/threads/50234
DEPENDS:=+libpthread
endef
define Package/vlmcsd/description
KMS Emulator in C (currently runs on Linux including Android, FreeBSD,
Solaris, Minix, Mac OS, iOS, Windows with or without Cygwin)
vlmcsd is a KMS Emulator in C.
endef
define Build/Prepare
$(call Build/Prepare/Default)
rm $(PKG_BUILD_DIR)/GNUmakefile
endef
define Package/vlmcsd/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/vlmcsd $(1)/usr/bin/vlmcsd
$(INSTALL_DIR) $(1)/etc
$(INSTALL_BIN) ./files/vlmcsd.ini $(1)/etc/vlmcsd.ini
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/vlmcsd.config $(1)/etc/config/vlmcsd
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/vlmcsd.init $(1)/etc/init.d/vlmcsd
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_BIN) ./files/40-vlmcsd $(1)/etc/uci-defaults/40-vlmcsd
endef
define Package/vlmcsd/conffiles
@ -40,20 +51,16 @@ define Package/vlmcsd/conffiles
/etc/vlmcsd.ini
endef
MAKE_FLAGS += \
CC="$(TARGET_CC_NOCACHE)" \
VLMCSD_VERSION="$(PKG_VERSION)"
define Package/vlmcsd/postinst-pkg
#!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] && exit 0
define Package/vlmcsd/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/bin/vlmcsd $(1)/usr/bin/vlmcsd
enabled="$$(uci -q get vlmcsd.config.enabled 2>/dev/null)"
if [ "$$enabled" = "1" ] && [ -x /etc/init.d/vlmcsd ]; then
/etc/init.d/vlmcsd enable >/dev/null 2>&1 || true
fi
$(INSTALL_DIR) $(1)/etc
$(INSTALL_BIN) ./files/vlmcsd.ini $(1)/etc/vlmcsd.ini
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_BIN) ./files/vlmcsd.conf $(1)/etc/config/vlmcsd
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/vlmcsd.init $(1)/etc/init.d/vlmcsd
exit 0
endef
$(eval $(call BuildPackage,vlmcsd))

42
vlmcsd/files/40-vlmcsd Normal file
View File

@ -0,0 +1,42 @@
#!/bin/sh
changed=0
if ! uci -q get vlmcsd.config >/dev/null 2>&1; then
uci -q batch <<'EOF'
set vlmcsd.config=vlmcsd
set vlmcsd.config.enabled='0'
set vlmcsd.config.auto_activate='1'
set vlmcsd.config.internet_access='0'
EOF
changed=1
fi
if ! uci -q get vlmcsd.config.enabled >/dev/null 2>&1; then
uci -q set vlmcsd.config.enabled='0'
changed=1
fi
if ! uci -q get vlmcsd.config.auto_activate >/dev/null 2>&1; then
autoactivate="$(uci -q get vlmcsd.config.autoactivate)"
if [ -n "$autoactivate" ]; then
uci -q set vlmcsd.config.auto_activate="$autoactivate"
else
uci -q set vlmcsd.config.auto_activate='1'
fi
changed=1
fi
if uci -q get vlmcsd.config.autoactivate >/dev/null 2>&1; then
uci -q delete vlmcsd.config.autoactivate
changed=1
fi
if ! uci -q get vlmcsd.config.internet_access >/dev/null 2>&1; then
uci -q set vlmcsd.config.internet_access='0'
changed=1
fi
[ "$changed" -eq 1 ] && uci commit vlmcsd
exit 0

View File

@ -1,4 +1,4 @@
config vlmcsd 'config'
option enabled '0'
option auto_activate '0'
option auto_activate '1'
option internet_access '0'

27
vlmcsd/files/vlmcsd.ini Executable file → Normal file
View File

@ -16,6 +16,15 @@
#ePID/HwId设置为Windows中国政府版 (Enterprise G/GN) 显式
;WinChinaGov = 06401-03858-000-555555-03-1033-17763.0000-2822018 / 01 02 03 04 05 06 07 08
#使用自定义TCP端口
;Port = 1688
#监听所有IPv4地址默认端口1688
;Listen = 0.0.0.0:1688
#监听所有IPv6地址默认端口1688
;Listen = [::]:1688
#程序启动时随机ePIDs只有那些未显式指定的
;RandomizationLevel = 1
@ -31,6 +40,12 @@
#每次请求后立即断开客户端
;DisconnectClientsImmediately = yes
#写一个pid文件包含vlmcsd的进程ID的文件
;PidFile = /var/run/vlmcsd.pid
#写日志到/var/log/vlmcsd.log
;LogFile = /var/log/vlmcsd.log
#创建详细日志
;LogVerbose = true
@ -40,8 +55,20 @@
#设置更新间隔7天
;RenewalInterval = 7d
#运行程序的用户为vlmcsduser
;user = vlmcsduser
#运行程序的组为vlmcsdgroup
;group = vlmcsdgroup
#禁用或启用RPC的NDR64传输语法默认启用
;UseNDR64 = true
#禁用或启用RPC的绑定时间特性协商默认启用
;UseBTFN = true
#Windows 10/ Windows 11 KMS 安装激活密钥
#Windows 10/11 ProW269N-WFGWX-YVC9B-4J6C9-T83GX
#Windows 10/11 EnterpriseNPPR9-FWDCX-D2C8J-H872K-2YT43
#Windows 10/11 Pro for WorkstationsNRG8B-VKK3Q-CXVCJ-9G2XF-6Q84J

152
vlmcsd/files/vlmcsd.init Executable file → Normal file
View File

@ -1,57 +1,121 @@
#!/bin/sh /etc/rc.common
START=99
USE_PROCD=1
START=90
STOP=10
DNSMASQ_UCI_CONFIG="$(uci -q show "dhcp.@dnsmasq[0]" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')"
if [ -f "/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG" ];then
DNSMASQ_VLMCSD="$(awk -F '=' '/^conf-dir=/ {print $2}' "/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG")/dnsmasq-vlmcsd.conf"
else
DNSMASQ_VLMCSD="/tmp/dnsmasq.d/dnsmasq-vlmcsd.conf"
fi
NAME="vlmcsd"
CONF="$NAME"
PROG="/usr/bin/vlmcsd"
INI_FILE="/etc/vlmcsd.ini"
KMS_PORT="1688"
DHCP_SECTION="$NAME"
normalize_bool() {
case "$1" in
1|on|true|yes|enabled)
return 0
;;
*)
return 1
;;
esac
}
config_get_bool_compat() {
local __var="$1"
local section="$2"
local option="$3"
local default="${4:-0}"
local legacy_option="$5"
local value
config_get value "$section" "$option"
if [ -z "$value" ] && [ -n "$legacy_option" ]; then
config_get value "$section" "$legacy_option"
fi
if normalize_bool "${value:-$default}"; then
eval "$__var=1"
else
eval "$__var=0"
fi
}
reload_dnsmasq() {
[ -x /etc/init.d/dnsmasq ] || return 0
/etc/init.d/dnsmasq reload >/dev/null 2>&1 || \
/etc/init.d/dnsmasq restart >/dev/null 2>&1 || true
}
sync_dns_srv() {
local enabled="$1"
local before after hostname domain srv target
before="$(uci -q show "dhcp.${DHCP_SECTION}" 2>/dev/null)"
uci -q delete "dhcp.${DHCP_SECTION}"
if [ "$enabled" = "1" ]; then
hostname="$(uci -q get system.@system[0].hostname)"
domain="$(uci -q get dhcp.@dnsmasq[0].domain)"
[ -n "$hostname" ] || hostname="OpenWrt"
srv="_vlmcs._tcp"
target="$hostname"
if [ -n "$domain" ]; then
srv="${srv}.${domain}"
target="${target}.${domain}"
fi
uci -q set "dhcp.${DHCP_SECTION}=srvhost"
uci -q set "dhcp.${DHCP_SECTION}.srv=${srv}"
uci -q set "dhcp.${DHCP_SECTION}.target=${target}"
uci -q set "dhcp.${DHCP_SECTION}.port=${KMS_PORT}"
fi
after="$(uci -q show "dhcp.${DHCP_SECTION}" 2>/dev/null)"
[ "$before" = "$after" ] && return 0
uci -q commit dhcp
reload_dnsmasq
}
start_service() {
local enabled auto_activate internet_access
config_load "vlmcsd"
config_get_bool enabled "config" "enabled" "0"
config_get_bool auto_activate "config" "auto_activate" "0"
config_get_bool internet_access "config" "internet_access" "0"
config_load "$CONF"
config_get_bool_compat enabled config enabled 0
config_get_bool_compat auto_activate config auto_activate 1 autoactivate
config_get_bool_compat internet_access config internet_access 0
[ "$enabled" -eq "1" ] || return 1
if [ "$auto_activate" -eq "1" ];then
hostname="$(uci get system.@system[0].hostname)"
echo "srv-host=_vlmcs._tcp,$hostname,1688,0,100" > "$DNSMASQ_VLMCSD"
/etc/init.d/dnsmasq restart 2>"/dev/null"
if [ "$enabled" -ne 1 ]; then
sync_dns_srv 0
return 1
fi
procd_open_instance "vlmcsd"
procd_set_param command /usr/bin/vlmcsd
procd_append_param command -D
procd_append_param command -i "/etc/vlmcsd.ini"
procd_append_param command -l syslog
procd_append_param command -L "0.0.0.0:1688"
procd_append_param command -L "[::]:1688"
[ -x "$PROG" ] || return 1
procd_set_param file "/etc/vlmcsd.ini"
sync_dns_srv "$auto_activate"
procd_open_instance "$NAME"
procd_set_param command "$PROG" -D -i "$INI_FILE" -L "0.0.0.0:${KMS_PORT}"
procd_set_param file "$INI_FILE"
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
procd_set_param user vlmcsd
procd_set_param group vlmcsd
procd_add_jail vlmcsd ronly log
procd_add_jail_mount "/etc/vlmcsd.ini"
if [ "$internet_access" -eq "1" ];then
if [ "$internet_access" -eq 1 ]; then
procd_open_data
json_add_array firewall
json_add_object ""
json_add_string type rule
json_add_string name "Allow-vlmcsd-tcp"
json_add_string proto "tcp"
json_add_string src "*"
json_add_string dest_port "1688"
json_add_string target "ACCEPT"
json_add_string type rule
json_add_string name "Allow-vlmcsd"
json_add_string proto "tcp"
json_add_string src "*"
json_add_string dest_port "$KMS_PORT"
json_add_string target "ACCEPT"
json_close_object
json_close_array
procd_close_data
@ -61,15 +125,13 @@ start_service() {
}
stop_service() {
rm -f "$DNSMASQ_VLMCSD"
/etc/init.d/dnsmasq restart 2>"/dev/null"
}
reload_service() {
stop
start
sync_dns_srv 0
}
service_triggers() {
procd_add_reload_trigger vlmcsd
procd_add_reload_trigger "$CONF" dhcp system
}
reload_service() {
restart
}

35
vlmcsd/src/Makefile Normal file
View File

@ -0,0 +1,35 @@
SRCDIR := src
BINDIR := bin
OBJDIR := build
TARGETS := $(BINDIR)/vlmcs $(BINDIR)/vlmcsd
.PHONY: all
all: $(BINDIR) $(TARGETS)
$(BINDIR)/vlmcs: $(OBJDIR)/vlmcs.o $(OBJDIR)/kmsdata-full.o $(OBJDIR)/crypto.o \
$(OBJDIR)/kms.o $(OBJDIR)/endian.o $(OBJDIR)/output.o \
$(OBJDIR)/shared_globals.o $(OBJDIR)/helpers.o \
$(OBJDIR)/network.o $(OBJDIR)/rpc.o \
$(OBJDIR)/crypto_internal.o $(OBJDIR)/dns_srv.o
$(CC) $(LDFLAGS) -o $@ $^
$(BINDIR)/vlmcsd: $(OBJDIR)/vlmcsd.o $(OBJDIR)/kmsdata.o $(OBJDIR)/crypto.o \
$(OBJDIR)/kms.o $(OBJDIR)/endian.o $(OBJDIR)/output.o \
$(OBJDIR)/shared_globals.o $(OBJDIR)/helpers.o \
$(OBJDIR)/network.o $(OBJDIR)/rpc.o \
$(OBJDIR)/crypto_internal.o
$(CC) $(LDFLAGS) -o $@ $^
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
$(CC) $(CFLAGS) -c $< -o $@
$(OBJDIR):
@mkdir -p $(OBJDIR)
$(BINDIR):
@mkdir -p $(BINDIR)
.PHONY: clean
clean:
@rm -rf $(OBJDIR) $(BINDIR)