mirror of
https://github.com/DeBrosOfficial/network.git
synced 2026-01-30 22:43:04 +00:00
112 lines
3.3 KiB
Go
112 lines
3.3 KiB
Go
package lifecycle
|
||
|
||
import (
|
||
"fmt"
|
||
"os"
|
||
"os/exec"
|
||
"time"
|
||
|
||
"github.com/DeBrosOfficial/network/pkg/cli/utils"
|
||
)
|
||
|
||
// HandleStart starts all production services
|
||
func HandleStart() {
|
||
if os.Geteuid() != 0 {
|
||
fmt.Fprintf(os.Stderr, "❌ Production commands must be run as root (use sudo)\n")
|
||
os.Exit(1)
|
||
}
|
||
|
||
fmt.Printf("Starting all DeBros production services...\n")
|
||
|
||
services := utils.GetProductionServices()
|
||
if len(services) == 0 {
|
||
fmt.Printf(" ⚠️ No DeBros services found\n")
|
||
return
|
||
}
|
||
|
||
// Reset failed state for all services before starting
|
||
// This helps with services that were previously in failed state
|
||
resetArgs := []string{"reset-failed"}
|
||
resetArgs = append(resetArgs, services...)
|
||
exec.Command("systemctl", resetArgs...).Run()
|
||
|
||
// Check which services are inactive and need to be started
|
||
inactive := make([]string, 0, len(services))
|
||
for _, svc := range services {
|
||
// Check if service is masked and unmask it
|
||
masked, err := utils.IsServiceMasked(svc)
|
||
if err == nil && masked {
|
||
fmt.Printf(" ⚠️ %s is masked, unmasking...\n", svc)
|
||
if err := exec.Command("systemctl", "unmask", svc).Run(); err != nil {
|
||
fmt.Printf(" ⚠️ Failed to unmask %s: %v\n", svc, err)
|
||
} else {
|
||
fmt.Printf(" ✓ Unmasked %s\n", svc)
|
||
}
|
||
}
|
||
|
||
active, err := utils.IsServiceActive(svc)
|
||
if err != nil {
|
||
fmt.Printf(" ⚠️ Unable to check %s: %v\n", svc, err)
|
||
continue
|
||
}
|
||
if active {
|
||
fmt.Printf(" ℹ️ %s already running\n", svc)
|
||
// Re-enable if disabled (in case it was stopped with 'orama prod stop')
|
||
enabled, err := utils.IsServiceEnabled(svc)
|
||
if err == nil && !enabled {
|
||
if err := exec.Command("systemctl", "enable", svc).Run(); err != nil {
|
||
fmt.Printf(" ⚠️ Failed to re-enable %s: %v\n", svc, err)
|
||
} else {
|
||
fmt.Printf(" ✓ Re-enabled %s (will auto-start on boot)\n", svc)
|
||
}
|
||
}
|
||
continue
|
||
}
|
||
inactive = append(inactive, svc)
|
||
}
|
||
|
||
if len(inactive) == 0 {
|
||
fmt.Printf("\n✅ All services already running\n")
|
||
return
|
||
}
|
||
|
||
// Check port availability for services we're about to start
|
||
ports, err := utils.CollectPortsForServices(inactive, false)
|
||
if err != nil {
|
||
fmt.Fprintf(os.Stderr, "❌ %v\n", err)
|
||
os.Exit(1)
|
||
}
|
||
if err := utils.EnsurePortsAvailable("prod start", ports); err != nil {
|
||
fmt.Fprintf(os.Stderr, "❌ %v\n", err)
|
||
os.Exit(1)
|
||
}
|
||
|
||
// Enable and start inactive services
|
||
for _, svc := range inactive {
|
||
// Re-enable the service first (in case it was disabled by 'orama prod stop')
|
||
enabled, err := utils.IsServiceEnabled(svc)
|
||
if err == nil && !enabled {
|
||
if err := exec.Command("systemctl", "enable", svc).Run(); err != nil {
|
||
fmt.Printf(" ⚠️ Failed to enable %s: %v\n", svc, err)
|
||
} else {
|
||
fmt.Printf(" ✓ Enabled %s (will auto-start on boot)\n", svc)
|
||
}
|
||
}
|
||
|
||
// Start the service
|
||
if err := exec.Command("systemctl", "start", svc).Run(); err != nil {
|
||
fmt.Printf(" ⚠️ Failed to start %s: %v\n", svc, err)
|
||
} else {
|
||
fmt.Printf(" ✓ Started %s\n", svc)
|
||
}
|
||
}
|
||
|
||
// Give services more time to fully initialize before verification
|
||
// Some services may need more time to start up, especially if they're
|
||
// waiting for dependencies or initializing databases
|
||
fmt.Printf(" ⏳ Waiting for services to initialize...\n")
|
||
time.Sleep(5 * time.Second)
|
||
|
||
fmt.Printf("\n✅ All services started\n")
|
||
}
|