fix: generate web panel certs per build and clean up mqtt env flags

Этот коммит содержится в:
Jared Dohrman
2026-04-09 15:19:46 +10:00
родитель 238e19d9b7
Коммит ca63ea923a
4 изменённых файлов: 95 добавлений и 14 удалений
+1
Просмотреть файл
@@ -17,3 +17,4 @@ compile_commands.json
.venv/ .venv/
venv/ venv/
platformio.local.ini platformio.local.ini
src/helpers/mqtt/WebPanelCert.h
+77
Просмотреть файл
@@ -0,0 +1,77 @@
Import("env")
from pathlib import Path
import subprocess
import tempfile
def render_pem_array(name, pem_text):
lines = []
for chunk in pem_text.splitlines(keepends=True):
escaped = chunk.replace("\\", "\\\\").replace('"', '\\"').replace("\n", "\\n")
lines.append(f' "{escaped}"')
joined = "\n".join(lines) if lines else ' ""'
return f"static const char {name}[] =\n{joined};\n"
project_dir = Path(env["PROJECT_DIR"])
header_path = project_dir / "src/helpers/mqtt/WebPanelCert.h"
if header_path.exists():
existing = header_path.read_text()
if "AUTO-GENERATED BY generate_web_panel_cert.py" in existing and "kServerKeyPem" in existing:
Return()
with tempfile.TemporaryDirectory() as tmp:
tmp_path = Path(tmp)
key_path = tmp_path / "web-panel-key.pem"
cert_path = tmp_path / "web-panel-cert.pem"
try:
subprocess.run(
["openssl", "ecparam", "-name", "prime256v1", "-genkey", "-noout", "-out", str(key_path)],
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
)
subprocess.run(
[
"openssl",
"req",
"-new",
"-x509",
"-key",
str(key_path),
"-out",
str(cert_path),
"-days",
"3650",
"-subj",
"/CN=meshcore-local",
],
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
)
except FileNotFoundError as exc:
raise RuntimeError("openssl is required to generate the web panel certificate header") from exc
except subprocess.CalledProcessError as exc:
raise RuntimeError(
f"openssl failed while generating the web panel certificate header: {exc.stderr.strip()}"
) from exc
cert_pem = cert_path.read_text()
key_pem = key_path.read_text()
header_path.parent.mkdir(parents=True, exist_ok=True)
header_path.write_text(
"#pragma once\n\n"
"// AUTO-GENERATED BY generate_web_panel_cert.py. DO NOT COMMIT.\n\n"
"namespace mqtt_web_panel_cert {\n\n"
f"{render_pem_array('kServerCertPem', cert_pem)}\n"
f"{render_pem_array('kServerKeyPem', key_pem)}"
"}\n",
encoding="utf-8",
)
+3 -1
Просмотреть файл
@@ -58,7 +58,9 @@ build_src_filter =
extends = arduino_base extends = arduino_base
platform = platformio/espressif32@6.11.0 platform = platformio/espressif32@6.11.0
monitor_filters = esp32_exception_decoder monitor_filters = esp32_exception_decoder
extra_scripts = merge-bin.py extra_scripts =
pre:arch/esp32/extra_scripts/generate_web_panel_cert.py
merge-bin.py
build_flags = ${arduino_base.build_flags} build_flags = ${arduino_base.build_flags}
-D ESP32_PLATFORM -D ESP32_PLATFORM
; -D ESP32_CPU_FREQ=80 ; change it to your need ; -D ESP32_CPU_FREQ=80 ; change it to your need
+14 -13
Просмотреть файл
@@ -1,25 +1,26 @@
#pragma once #pragma once
// AUTO-GENERATED BY generate_web_panel_cert.py. DO NOT COMMIT.
namespace mqtt_web_panel_cert { namespace mqtt_web_panel_cert {
static const char kServerCertPem[] = static const char kServerCertPem[] =
"-----BEGIN CERTIFICATE-----\n" "-----BEGIN CERTIFICATE-----\n"
"MIIBiDCCAS2gAwIBAgIUYPagAbDjmNMHx+sqAC5qvOnlywIwCgYIKoZIzj0EAwIw\n" "MIIBiDCCAS2gAwIBAgIUFysjM9xosI98WhPpK1doyLOAkgYwCgYIKoZIzj0EAwIw\n"
"GTEXMBUGA1UEAwwObWVzaGNvcmUtbG9jYWwwHhcNMjYwNDA5MDE0MjAzWhcNMzYw\n" "GTEXMBUGA1UEAwwObWVzaGNvcmUtbG9jYWwwHhcNMjYwNDA5MDUxODQ4WhcNMzYw\n"
"NDA2MDE0MjAzWjAZMRcwFQYDVQQDDA5tZXNoY29yZS1sb2NhbDBZMBMGByqGSM49\n" "NDA2MDUxODQ4WjAZMRcwFQYDVQQDDA5tZXNoY29yZS1sb2NhbDBZMBMGByqGSM49\n"
"AgEGCCqGSM49AwEHA0IABJWLgQ/4sDJKykqR9a5brDLR9RikwoZ/6n1Od38rbfzV\n" "AgEGCCqGSM49AwEHA0IABBpVegwc/kZDjVtHXnl0iYbD2vdes7nLztlyRDylcfOD\n"
"ykP2LJIdrxU6zS1gzLk33klycB7AWFL1W7klStdiSpmjUzBRMB0GA1UdDgQWBBSk\n" "GoR9hopoc9NernvGJLUFP/+PsjIsfEGmVrmPESnShsWjUzBRMB0GA1UdDgQWBBTi\n"
"dpP2r+UPriHT+hXLiyFdjkFgmTAfBgNVHSMEGDAWgBSkdpP2r+UPriHT+hXLiyFd\n" "oWH5V8BvTj9Kla8ki8SHb2vdSTAfBgNVHSMEGDAWgBTioWH5V8BvTj9Kla8ki8SH\n"
"jkFgmTAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0kAMEYCIQCWS5ZRbON4\n" "b2vdSTAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0kAMEYCIQDjNde/RApq\n"
"71RrwcogEzGuQTNdkbtkRc+517nZ63ZOawIhAPwSy/0yMyhqAoOMpVnhIb+w995f\n" "jx/FYar9+qMMxHeBMrSiOBozTFpcmFr7RgIhAMdVESr6P2urGsxzbYirwURj5H1F\n"
"zH4nApL2Q2U0KI2l\n" "8eej1APpWRRZvvP0\n"
"-----END CERTIFICATE-----\n"; "-----END CERTIFICATE-----\n";
static const char kServerKeyPem[] = static const char kServerKeyPem[] =
"-----BEGIN EC PRIVATE KEY-----\n" "-----BEGIN EC PRIVATE KEY-----\n"
"MHcCAQEEIGX71nLSiA8qUJXuiZRNzaGizNbMqgOxALSPd/HzfzWAoAoGCCqGSM49\n" "MHcCAQEEIPQxD+WYeE2tQja5AVrOgDUHAKJ7TYfELqU55Npb7mJ1oAoGCCqGSM49\n"
"AwEHoUQDQgAElYuBD/iwMkrKSpH1rlusMtH1GKTChn/qfU53fytt/NXKQ/Yskh2v\n" "AwEHoUQDQgAEGlV6DBz+RkONW0deeXSJhsPa916zucvO2XJEPKVx84MahH2Gimhz\n"
"FTrNLWDMuTfeSXJwHsBYUvVbuSVK12JKmQ==\n" "016ue8YktQU//4+yMix8QaZWuY8RKdKGxQ==\n"
"-----END EC PRIVATE KEY-----\n"; "-----END EC PRIVATE KEY-----\n";
} }