fix: generate web panel certs per build and clean up mqtt env flags
Этот коммит содержится в:
@@ -17,3 +17,4 @@ compile_commands.json
|
|||||||
.venv/
|
.venv/
|
||||||
venv/
|
venv/
|
||||||
platformio.local.ini
|
platformio.local.ini
|
||||||
|
src/helpers/mqtt/WebPanelCert.h
|
||||||
|
|||||||
@@ -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",
|
||||||
|
)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user