ENGINE: Cutover Pains and Fixes

This commit is contained in:
2025-11-01 04:44:23 -06:00
parent b815592639
commit 02eae72c0d
7 changed files with 1866 additions and 29 deletions

View File

@@ -233,31 +233,31 @@ function Ensure-EngineWebInterface {
[string]$ProjectRoot
)
$engineSource = Join-Path $ProjectRoot 'Engine\web-interface'
$legacySource = Join-Path $ProjectRoot 'Data\Server\WebUI'
$engineDestination = Join-Path $ProjectRoot 'Engine\web-interface'
$engineStageSource = Join-Path $ProjectRoot 'Data\Engine\web-interface'
if (-not (Test-Path $legacySource)) {
return
if (-not (Test-Path $engineStageSource)) {
throw "Engine web interface source missing at '$engineStageSource'."
}
$enginePackage = Join-Path $engineSource 'package.json'
$engineSrcDir = Join-Path $engineSource 'src'
$enginePackage = Join-Path $engineDestination 'package.json'
$engineSrcDir = Join-Path $engineDestination 'src'
if ((Test-Path $enginePackage) -and (Test-Path $engineSrcDir)) {
return
}
if (-not (Test-Path $engineSource)) {
New-Item -Path $engineSource -ItemType Directory -Force | Out-Null
if (-not (Test-Path $engineDestination)) {
New-Item -Path $engineDestination -ItemType Directory -Force | Out-Null
}
$preserve = @('.gitignore','README.md')
Get-ChildItem -Path $engineSource -Force | Where-Object { $preserve -notcontains $_.Name } |
Get-ChildItem -Path $engineDestination -Force | Where-Object { $preserve -notcontains $_.Name } |
Remove-Item -Recurse -Force -ErrorAction SilentlyContinue
Copy-Item (Join-Path $legacySource '*') $engineSource -Recurse -Force
Copy-Item (Join-Path $engineStageSource '*') $engineDestination -Recurse -Force
if (-not (Test-Path $enginePackage)) {
throw "Failed to stage Engine web interface into '$engineSource'."
throw "Failed to stage Engine web interface into '$engineDestination' from '$engineStageSource'."
}
}
@@ -1415,7 +1415,7 @@ switch ($choice) {
$dataSource = "Data"
$engineSource = "$dataSource\Engine"
$engineDataDestination = "$venvFolder\Data\Engine"
$webUIFallbackSource = "$dataSource\Server\web-interface"
$webUIFallbackSource = "$dataSource\Engine\web-interface"
$webUIDestination = "$venvFolder\web-interface"
$venvPython = Join-Path $venvFolder 'Scripts\python.exe'
$engineSourceAbsolute = Join-Path $scriptDir $engineSource

View File

@@ -332,20 +332,20 @@ PY
ensure_engine_webui_source() {
local engineSource="Engine/web-interface"
local legacySource="Data/Server/WebUI"
if [[ -d "${engineSource}/src" && -f "${engineSource}/package.json" ]]; then
return 0
fi
if [[ ! -d "$legacySource" ]]; then
echo "${RED}Legacy WebUI source '$legacySource' not found.${RESET}" >&2
local stageSource="Data/Engine/web-interface"
if [[ ! -d "$stageSource" ]]; then
echo "${RED}Engine web interface source '$stageSource' not found.${RESET}" >&2
return 1
fi
mkdir -p "$engineSource"
find "$engineSource" -mindepth 1 -maxdepth 1 \
! -name '.gitignore' ! -name 'README.md' -exec rm -rf {} +
cp -a "$legacySource/." "$engineSource/"
cp -a "$stageSource/." "$engineSource/"
if [[ ! -f "${engineSource}/package.json" ]]; then
echo "${RED}Failed to stage Engine web interface into '$engineSource'.${RESET}" >&2
echo "${RED}Failed to stage Engine web interface into '$engineSource' from '$stageSource'.${RESET}" >&2
return 1
fi
}

View File

@@ -15,7 +15,7 @@
"name": "server_url",
"label": "Borealis Server URL",
"type": "string",
"default": "http://localhost:5000",
"default": "https://localhost:5000",
"required": true,
"description": "URL of where the agent is going to reach-out to moving forward."
}

View File

@@ -77,11 +77,11 @@ def _stage_web_interface_assets(logger: Optional[logging.Logger] = None, *, forc
project_root = _project_root()
engine_web_root = project_root / "Engine" / "web-interface"
legacy_source = project_root / "Data" / "Server" / "WebUI"
stage_source = project_root / "Data" / "Engine" / "web-interface"
if not legacy_source.is_dir():
if not stage_source.is_dir():
raise RuntimeError(
f"Engine web interface source missing: {legacy_source}"
f"Engine web interface source missing: {stage_source}"
)
index_path = engine_web_root / "index.html"
@@ -92,14 +92,14 @@ def _stage_web_interface_assets(logger: Optional[logging.Logger] = None, *, forc
if engine_web_root.exists():
shutil.rmtree(engine_web_root)
shutil.copytree(legacy_source, engine_web_root)
shutil.copytree(stage_source, engine_web_root)
if not index_path.is_file():
raise RuntimeError(
f"Engine web interface staging failed; missing {index_path}"
)
logger.info("Engine web interface staged from %s to %s", legacy_source, engine_web_root)
logger.info("Engine web interface staged from %s to %s", stage_source, engine_web_root)
return engine_web_root

File diff suppressed because it is too large Load Diff

View File

@@ -19,8 +19,8 @@ from __future__ import annotations
from typing import TYPE_CHECKING, Any
try: # pragma: no cover - legacy module import guard
import job_scheduler as legacy_job_scheduler # type: ignore
try: # pragma: no cover - Engine-local legacy scheduler shim
from . import legacy_job_scheduler # type: ignore
except Exception as exc: # pragma: no cover - runtime guard
legacy_job_scheduler = None # type: ignore
_SCHEDULER_IMPORT_ERROR = exc
@@ -36,8 +36,8 @@ if TYPE_CHECKING: # pragma: no cover - typing aide
def _raise_scheduler_import() -> None:
if _SCHEDULER_IMPORT_ERROR is not None:
raise RuntimeError(
"Legacy job scheduler module could not be imported; ensure Data/Server/job_scheduler.py "
"remains available during the Engine migration."
"Legacy job scheduler module could not be imported; ensure "
"Data/Engine/services/API/scheduled_jobs/legacy_job_scheduler.py remains available."
) from _SCHEDULER_IMPORT_ERROR
@@ -79,4 +79,3 @@ def register_management(app: "Flask", adapters: "EngineServiceAdapters") -> None
"""Ensure scheduled job routes are registered via the legacy scheduler."""
ensure_scheduler(app, adapters)

View File

@@ -1,4 +1,4 @@
![Borealis Logo](Data/Server/WebUI/public/Borealis_Logo_Full.png)
![Borealis Logo](Data/Engine/web-interface/public/Borealis_Logo_Full.png)
Borealis is a remote management platform with a simple, visual automation layer, enabling you to leverage scripts, Ansible playbooks, and advanced nodegraph-based automation workflows. I originally created Borealis to work towards consolidating the core functionality of several standalone automation platforms in my homelab, such as TacticalRMM, Ansible AWX, SemaphoreUI, and a few others.