🦄 Sync 2026-06-07 23:12:22

This commit is contained in:
github-actions[bot] committed 2026-06-07 23:12:22 +08:00
1 parent 303d13723b
commit c28f6e6a8d
16 files changed
+207 -1198

No files matched your search

+2 -2
View File
@@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=gecoosac
PKG_VERSION:=2.2.20251015
PKG_RELEASE:=4
PKG_RELEASE:=5
ifeq ($(ARCH),aarch64)
PKG_ARCH:=ac_linux_arm64
@@ -41,7 +41,7 @@ define Package/$(PKG_NAME)
CATEGORY:=Network
TITLE:=gecoosac server (version $(PKG_VERSION))
URL:=http://www.cnrouter.com/
DEPENDS:=@(aarch64||arm||i386||mips||mipsel||x86_64) +px5g-mbedtls
DEPENDS:=@(aarch64||arm||i386||mips||mipsel||x86_64) +openssl-util
endef
define Package/$(PKG_NAME)/conffiles
+123 -79
View File
@@ -16,6 +16,7 @@ DEFAULT_CRT_FILE=/etc/gecoosac/tls/gecoosac.crt
DEFAULT_KEY_FILE=/etc/gecoosac/tls/gecoosac.key
DEFAULT_PID_DIR=/var/run/
DEFAULT_LANG=zh
CERT_TIMEOUT=60
init_conf() {
config_load "gecoosac"
@@ -50,6 +51,122 @@ is_port() {
[ "$1" -ge 1 ] 2>/dev/null && [ "$1" -le 65535 ]
}
run_with_timeout() {
local timeout pid i
timeout="$1"
shift
"$@" >/dev/null 2>&1 &
pid="$!"
i=0
while kill -0 "$pid" >/dev/null 2>&1; do
if [ "$i" -ge "$timeout" ]; then
kill "$pid" >/dev/null 2>&1
sleep 1
kill -9 "$pid" >/dev/null 2>&1
wait "$pid" 2>/dev/null
return 1
fi
sleep 1
i=$((i + 1))
done
wait "$pid"
}
is_ipv4() {
local old_ifs part
old_ifs="$IFS"
IFS=.
set -- $1
IFS="$old_ifs"
[ "$#" -eq 4 ] || return 1
for part in "$@"; do
case "$part" in
""|*[!0-9]*) return 1 ;;
esac
[ "$part" -le 255 ] 2>/dev/null || return 1
done
return 0
}
cert_matches_san() {
local cert_file="$1"
local cert_host="$2"
local cert_ip="$3"
local san
[ -s "$cert_file" ] || return 1
san="$(openssl x509 -in "$cert_file" -noout -ext subjectAltName 2>/dev/null)" || return 1
echo "$san" | grep -F -q "DNS:${cert_host}" || return 1
[ -z "$cert_ip" ] || echo "$san" | grep -F -q "IP Address:${cert_ip}" || return 1
return 0
}
generate_default_cert() {
local cert_host cert_ip cert_cn cert_san tmp_crt tmp_key
if ! command -v openssl >/dev/null 2>&1; then
logger -t gecoosac "openssl is required to generate the default HTTPS certificate"
return 1
fi
cert_host="$(uci -q get system.@system[0].hostname)"
case "$cert_host" in
""|*[!A-Za-z0-9.-]*) cert_host="GecoosAC" ;;
esac
cert_ip="$(uci -q get network.lan.ipaddr)"
is_ipv4 "$cert_ip" || cert_ip=""
if [ -s "$DEFAULT_KEY_FILE" ] && cert_matches_san "$DEFAULT_CRT_FILE" "$cert_host" "$cert_ip"; then
return 0
fi
mkdir -p /etc/gecoosac/tls
cert_cn="${cert_ip:-$cert_host}"
cert_san="DNS:$cert_host"
[ -n "$cert_ip" ] && cert_san="${cert_san},IP:${cert_ip}"
tmp_crt="${DEFAULT_CRT_FILE}.tmp"
tmp_key="${DEFAULT_KEY_FILE}.tmp"
rm -f "$tmp_crt" "$tmp_key"
run_with_timeout "$CERT_TIMEOUT" openssl req \
-x509 \
-nodes \
-newkey ec \
-pkeyopt ec_paramgen_curve:prime256v1 \
-pkeyopt ec_param_enc:named_curve \
-sha256 \
-days 3650 \
-keyout "$tmp_key" \
-out "$tmp_crt" \
-subj "/CN=$cert_cn" \
-addext "basicConstraints=critical,CA:FALSE" \
-addext "keyUsage=digitalSignature" \
-addext "extendedKeyUsage=serverAuth" \
-addext "subjectAltName=$cert_san"
if [ -s "$tmp_crt" ] && [ -s "$tmp_key" ] && cert_matches_san "$tmp_crt" "$cert_host" "$cert_ip"; then
mv "$tmp_key" "$DEFAULT_KEY_FILE"
mv "$tmp_crt" "$DEFAULT_CRT_FILE"
chmod 600 "$DEFAULT_KEY_FILE"
chmod 644 "$DEFAULT_CRT_FILE"
return 0
fi
rm -f "$tmp_crt" "$tmp_key"
logger -t gecoosac "failed to generate default HTTPS certificate"
return 1
}
normalize_conf() {
is_abs_path "$upload_dir" || upload_dir="$DEFAULT_UPLOAD_DIR"
is_abs_path "$db_dir" || db_dir="$DEFAULT_DB_DIR"
@@ -75,81 +192,6 @@ ensure_dirs() {
mkdir -p "$upload_dir" "$db_dir" "$piddir" /etc/gecoosac/tls
}
generate_default_cert() {
local cert_host cert_ip cert_cn cert_san tmp_crt tmp_key
[ "$crt_file" = "$DEFAULT_CRT_FILE" ] || return 1
[ "$key_file" = "$DEFAULT_KEY_FILE" ] || return 1
if ! command -v px5g >/dev/null 2>&1; then
logger -t gecoosac "px5g is required to generate the default HTTPS certificate"
return 1
fi
cert_host="$(uci -q get system.@system[0].hostname)"
case "$cert_host" in
""|*[!A-Za-z0-9._-]*) cert_host="GecoosAC" ;;
esac
cert_ip="$(uci -q get network.lan.ipaddr)"
case "$cert_ip" in
""|*[!0-9.]*) cert_ip="" ;;
esac
cert_cn="${cert_ip:-$cert_host}"
cert_san="DNS:$cert_host"
[ -n "$cert_ip" ] && cert_san="${cert_san},IP:${cert_ip}"
tmp_crt="${crt_file}.tmp"
tmp_key="${key_file}.tmp"
rm -f "$tmp_crt" "$tmp_key"
px5g selfsigned \
-days 3650 \
-newkey rsa:2048 \
-keyout "$tmp_key" \
-out "$tmp_crt" \
-subj "/CN=$cert_cn" \
-addext "subjectAltName=$cert_san" \
-addext "extendedKeyUsage=serverAuth" >/dev/null 2>&1
if [ ! -r "$tmp_crt" ] || [ ! -r "$tmp_key" ]; then
rm -f "$tmp_crt" "$tmp_key"
px5g selfsigned \
-days 3650 \
-newkey rsa:2048 \
-keyout "$tmp_key" \
-out "$tmp_crt" \
-subj "/CN=$cert_cn" >/dev/null 2>&1
fi
if [ -r "$tmp_crt" ] && [ -r "$tmp_key" ]; then
mv "$tmp_key" "$key_file"
mv "$tmp_crt" "$crt_file"
else
rm -f "$tmp_crt" "$tmp_key"
fi
if [ ! -r "$crt_file" ] || [ ! -r "$key_file" ]; then
# Some older px5g builds only support writing directly to final paths.
rm -f "$crt_file" "$key_file"
px5g selfsigned \
-days 3650 \
-newkey rsa:2048 \
-keyout "$key_file" \
-out "$crt_file" \
-subj "/CN=$cert_cn" >/dev/null 2>&1
if [ ! -r "$crt_file" ] || [ ! -r "$key_file" ]; then
logger -t gecoosac "failed to generate default HTTPS certificate"
return 1
fi
fi
chmod 600 "$key_file"
chmod 644 "$crt_file"
return 0
}
start_service() {
init_conf
normalize_conf
@@ -163,11 +205,13 @@ start_service() {
ensure_dirs
if [ "$isonlyoneprot" = "0" ] && [ "$https" = "1" ]; then
if [ "$crt_file" = "$DEFAULT_CRT_FILE" ] && [ "$key_file" = "$DEFAULT_KEY_FILE" ]; then
generate_default_cert || return 1
fi
if [ ! -r "$crt_file" ] || [ ! -r "$key_file" ]; then
generate_default_cert || {
logger -t gecoosac "HTTPS is enabled but certificate or key file is missing"
return 1
}
logger -t gecoosac "HTTPS is enabled but certificate or key file is missing"
return 1
fi
fi
+24 -2
View File
@@ -1,6 +1,10 @@
#!/bin/sh
changed=0
DEFAULT_CRT_FILE=/etc/gecoosac/tls/gecoosac.crt
DEFAULT_KEY_FILE=/etc/gecoosac/tls/gecoosac.key
OLD_CRT_FILE=/etc/gecoosac/tls/1.crt
OLD_KEY_FILE=/etc/gecoosac/tls/1.key
ensure_section() {
uci -q get gecoosac.config >/dev/null && return 0
@@ -17,14 +21,32 @@ set_default() {
changed=1
}
migrate_legacy_cert_paths() {
local crt_file key_file
crt_file="$(uci -q get gecoosac.config.crt_file)"
key_file="$(uci -q get gecoosac.config.key_file)"
if [ "$crt_file" = "$OLD_CRT_FILE" ]; then
uci -q set "gecoosac.config.crt_file=${DEFAULT_CRT_FILE}"
changed=1
fi
if [ "$key_file" = "$OLD_KEY_FILE" ]; then
uci -q set "gecoosac.config.key_file=${DEFAULT_KEY_FILE}"
changed=1
fi
}
ensure_section
migrate_legacy_cert_paths
set_default enabled 0
set_default port 60650
set_default isonlyoneprot 1
set_default m_port 8080
set_default https 0
set_default crt_file /etc/gecoosac/tls/gecoosac.crt
set_default key_file /etc/gecoosac/tls/gecoosac.key
set_default crt_file "$DEFAULT_CRT_FILE"
set_default key_file "$DEFAULT_KEY_FILE"
set_default upload_dir /tmp/gecoosac/upload/
set_default db_dir /etc/gecoosac/
set_default piddir /var/run/