prvng_core/scripts/manage-ports.nu

289 lines
9.1 KiB
Plaintext
Raw Normal View History

#!/usr/bin/env nu
# Port Management Script for Provisioning Platform
# Centralizes port configuration and updates across all services
const DEFAULT_PORTS = {
orchestrator: 9090,
control_center: 9080,
api_gateway: 9083,
mcp_server: 9082,
oci_registry: 5000,
coredns: 5353,
gitea: 3000,
frontend: 3001,
surrealdb: 8000,
redis: 6379,
postgresql: 5432
}
# Show current port configuration
export def "main show" [] {
print "📊 Current Port Configuration\n"
let config = load_current_config
$config | each {|service|
print $" ($service.name | fill -a right -c ' ' -w 20): ($service.port) \(($service.status)\)"
}
}
# Check if ports are in use
export def "main check" [] {
print "🔍 Checking port availability\n"
for service in ($DEFAULT_PORTS | transpose key value) {
let port = $service.value
let in_use = (is_port_in_use $port)
if $in_use {
let process = (get_process_on_port $port)
print $" ⚠️ ($service.key | fill -a right -c ' ' -w 20): Port ($port) IN USE by ($process)"
} else {
print $" ✅ ($service.key | fill -a right -c ' ' -w 20): Port ($port) available"
}
}
}
# Update port configuration across all files
export def "main update" [
service: string # Service name (orchestrator, control_center, etc)
new_port: int # New port number
--apply # Apply changes (default is dry-run)
] {
if $service not-in ($DEFAULT_PORTS | columns) {
error make {msg: $"Unknown service: ($service). Available: ($DEFAULT_PORTS | columns | str join ', ')"}
}
let old_port = ($DEFAULT_PORTS | get $service)
print $"📝 Updating ($service) port: ($old_port) → ($new_port)\n"
# Get files to update
let files = (get_files_for_service $service)
if ($files | is-empty) {
print " No configuration files found for this service"
return
}
print $" Found ($files | length) files to update:\n"
for file in $files {
let changes = (preview_changes $file $old_port $new_port)
if ($changes | length) > 0 {
print $" 📄 ($file)"
print $" Changes: ($changes | length) line\(s\)"
if $apply {
update_file $file $old_port $new_port $service
print " ✅ Applied"
} else {
print " ⏭️ Dry-run \(use --apply to apply\)"
}
}
}
if not $apply {
print $"\n💡 Run with --apply to apply changes"
} else {
print $"\n✅ Port updated. Remember to rebuild and restart the service!"
}
}
# Verify port configuration is consistent
export def "main verify" [] {
print "🔎 Verifying port configuration consistency\n"
let issues = []
for service in ($DEFAULT_PORTS | transpose key value) {
let service_name = $service.key
let expected_port = $service.value
let files = (get_files_for_service $service_name)
for file in $files {
if ($file | path exists) {
let content = (open $file)
let found_ports = (extract_ports_from_file $file $service_name)
for port in $found_ports {
if $port != $expected_port {
print $" ⚠️ ($service_name) in ($file): Found port ($port), expected ($expected_port)"
}
}
}
}
}
print "\n✅ Verification complete"
}
# Migrate from old ports to new ports
export def "main migrate" [
--orchestrator: int = 9090 # New orchestrator port
--control_center: int = 9080 # New control center port
--apply # Apply changes
] {
print "🔄 Port Migration Tool\n"
print "Migration plan:"
print $" Orchestrator: 8080 → ($orchestrator)"
print $" Control Center: 8081 → ($control_center)"
print ""
if not $apply {
print "⚠️ DRY RUN MODE - No changes will be made"
print " Use --apply to apply changes\n"
}
# Orchestrator
if $orchestrator != 8080 {
main update orchestrator $orchestrator --apply=$apply
}
# Control Center
if $control_center != 8081 {
main update control_center $control_center --apply=$apply
}
if $apply {
print "\n✅ Migration complete!"
print "\n📋 Next steps:"
print " 1. Rebuild services: cd provisioning/platform/orchestrator && cargo build --release"
print " 2. Rebuild services: cd provisioning/platform/control-center && cargo build --release"
print " 3. Restart services"
}
}
# Helper: Load current configuration
def load_current_config [] {
[
{name: "orchestrator", port: (get_port_from_file "provisioning/platform/orchestrator/config.defaults.toml" "port"), status: "configured"},
{name: "control_center", port: (get_port_from_file "provisioning/platform/control-center/config.defaults.toml" "port"), status: "configured"},
{name: "oci_registry", port: 5000, status: "static"},
{name: "coredns", port: 5353, status: "static"},
{name: "gitea", port: 3000, status: "static"},
{name: "surrealdb", port: 8000, status: "static"}
]
}
# Helper: Check if port is in use
def is_port_in_use [port: int] {
let result = (do { lsof -i $":($port)" | complete } | get exit_code)
$result == 0
}
# Helper: Get process using port
def get_process_on_port [port: int] {
try {
let output = (lsof -i $":($port)" | lines | get 1 | split row -r '\s+')
$"($output.0) \(PID: ($output.1)\)"
} catch {
"unknown"
}
}
# Helper: Get files for a service
def get_files_for_service [service: string] {
let base = "/Users/Akasha/project-provisioning"
match $service {
"orchestrator" => [
$"($base)/provisioning/platform/orchestrator/src/lib.rs",
$"($base)/provisioning/platform/orchestrator/config.defaults.toml",
$"($base)/provisioning/platform/orchestrator/scripts/start-orchestrator.nu"
],
"control_center" => [
$"($base)/provisioning/platform/control-center/src/simple_config.rs",
$"($base)/provisioning/platform/control-center/config.defaults.toml"
],
_ => []
}
}
# Helper: Preview changes in a file
def preview_changes [file: string, old_port: int, new_port: int] {
if not ($file | path exists) {
return []
}
let content = (open $file)
let lines = ($content | lines)
$lines | enumerate | where {|it|
($it.item | str contains $"($old_port)")
} | get index
}
# Helper: Update file
def update_file [file: string, old_port: int, new_port: int, service: string] {
let content = (open $file)
# Different update strategies based on file type
let updated = if ($file | str ends-with ".rs") {
# Rust file - careful replacement
$content | str replace -a $"port = ($old_port)" $"port = ($new_port)"
| str replace -a $"default_value = \"($old_port)\"" $"default_value = \"($new_port)\""
} else if ($file | str ends-with ".toml") {
# TOML file
$content | str replace -a $"port = ($old_port)" $"port = ($new_port)"
} else if ($file | str ends-with ".nu") {
# Nushell file
$content | str replace -a $"= ($old_port)" $"= ($new_port)"
| str replace -a $": int = ($old_port)" $": int = ($new_port)"
} else {
$content
}
$updated | save -f $file
}
# Helper: Get port from TOML file
def get_port_from_file [file: string, key: string] {
try {
let full_path = $"/Users/Akasha/project-provisioning/($file)"
if ($full_path | path exists) {
let content = (open $full_path)
let match = ($content | lines | find -r $"($key)\\s*=\\s*(\\d+)" | first)
if ($match | is-empty) {
return 0
}
($match | parse -r $"($key)\\s*=\\s*(?<port>\\d+)" | get port.0 | into int)
} else {
0
}
} catch {
0
}
}
# Helper: Extract ports from file for service
def extract_ports_from_file [file: string, service: string] {
try {
let content = (open $file)
let matches = ($content | lines | find -r '\d{4,5}' | parse -r '(?<port>\d{4,5})')
$matches | get port | into int | uniq
} catch {
[]
}
}
# Main help
export def main [] {
print "Port Management for Provisioning Platform\n"
print "Usage:"
print " manage-ports.nu show - Show current port configuration"
print " manage-ports.nu check - Check if ports are available"
print " manage-ports.nu update <service> <port> [--apply] - Update service port"
print " manage-ports.nu verify - Verify configuration consistency"
print " manage-ports.nu migrate [--apply] - Migrate from old to new ports"
print ""
print "Examples:"
print " manage-ports.nu check"
print " manage-ports.nu update orchestrator 9090 --apply"
print " manage-ports.nu migrate --orchestrator 9090 --control_center 9080 --apply"
}