[30388f42] Infrastructure Hardening: Repaired CE/Connector DB schema, fixed frontend styling build, implemented robust echo shield in worker v2.1.1, and integrated Lead Engine into gateway.
This commit is contained in:
89
scripts/validate_deployment.py
Normal file
89
scripts/validate_deployment.py
Normal file
@@ -0,0 +1,89 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
def check_path(path, description, context_dir="."):
|
||||
# Cleanup path string
|
||||
path = path.strip().strip('"').strip("'")
|
||||
|
||||
# Ignore internal docker volumes or absolute paths that might be inside container
|
||||
if not path.startswith("./") and not path.startswith("/") and not path.startswith(".."):
|
||||
# Assume named volume or config setting
|
||||
return True
|
||||
|
||||
# Split host:container mapping
|
||||
host_path_raw = path.split(":")[0]
|
||||
|
||||
# Resolve relative paths relative to CWD
|
||||
if host_path_raw.startswith("./"):
|
||||
host_path = os.path.join(os.getcwd(), host_path_raw[2:])
|
||||
elif host_path_raw.startswith("../"):
|
||||
host_path = os.path.abspath(host_path_raw)
|
||||
else:
|
||||
host_path = host_path_raw
|
||||
|
||||
if os.path.exists(host_path):
|
||||
print(f"✅ FOUND: {description} -> {host_path_raw}")
|
||||
return True
|
||||
else:
|
||||
print(f"❌ MISSING: {description} -> {host_path_raw}")
|
||||
return False
|
||||
|
||||
def validate_compose_text():
|
||||
print("--- 🚀 Starting Pre-Flight Check (Text-Based) ---")
|
||||
|
||||
if not os.path.exists("docker-compose.yml"):
|
||||
print("❌ CRITICAL: docker-compose.yml not found!")
|
||||
return
|
||||
|
||||
with open("docker-compose.yml", "r") as f:
|
||||
lines = f.readlines()
|
||||
|
||||
current_service = "Unknown"
|
||||
all_valid = True
|
||||
in_volumes = False
|
||||
|
||||
for line in lines:
|
||||
line = line.rstrip()
|
||||
clean_line = line.strip()
|
||||
|
||||
# Detect Service Block (heuristic)
|
||||
if line.startswith(" ") and not line.startswith(" ") and ":" in line and not clean_line.startswith("#"):
|
||||
current_service = clean_line.replace(":", "")
|
||||
print(f"\nScanning Service: [{current_service}]")
|
||||
in_volumes = False
|
||||
continue
|
||||
|
||||
# Check Context
|
||||
if "context:" in clean_line:
|
||||
path = clean_line.split("context:")[1].strip()
|
||||
if not check_path(path, f"Build Context ({current_service})"):
|
||||
all_valid = False
|
||||
|
||||
# Check Env File
|
||||
if clean_line.startswith("- .env"):
|
||||
if not check_path(".env", f"Env File ({current_service})"):
|
||||
all_valid = False
|
||||
|
||||
# Check Volumes Block Start
|
||||
if clean_line.startswith("volumes:"):
|
||||
in_volumes = True
|
||||
continue
|
||||
|
||||
# Check Volume Entries
|
||||
if in_volumes and clean_line.startswith("-") and ":" in clean_line:
|
||||
# Simple heuristic to stop reading volumes if indentation changes or new block starts
|
||||
if not line.startswith(" -"):
|
||||
in_volumes = False
|
||||
else:
|
||||
vol_path = clean_line[1:].strip() # Remove dash
|
||||
if not check_path(vol_path, f"Volume ({current_service})"):
|
||||
all_valid = False
|
||||
|
||||
print("\n--- 🏁 Result ---")
|
||||
if all_valid:
|
||||
print("✅ READY FOR TAKEOFF: All referenced files and directories exist.")
|
||||
else:
|
||||
print("❌ ABORT: Missing files detected. Migration would fail.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
validate_compose_text()
|
||||
Reference in New Issue
Block a user