package restore import ( "context" "fmt" "strings" ) // runServices starts restored services func (p *Pipeline) runServices(ctx context.Context) error { // Start WireGuard interfaces if err := p.startWireGuard(ctx); err != nil { // WireGuard is optional, log but don't fail if p.Verbose { fmt.Printf(" WireGuard: %v\n", err) } } // Start Docker if err := p.startDocker(ctx); err != nil { return fmt.Errorf("failed to start Docker: %w", err) } return nil } // startWireGuard enables and starts WireGuard interfaces func (p *Pipeline) startWireGuard(ctx context.Context) error { // Check if WireGuard configs exist checkCmd := "ls /etc/wireguard/*.conf 2>/dev/null | head -5" output, err := p.remoteCmdOutput(ctx, checkCmd) if err != nil || strings.TrimSpace(output) == "" { return fmt.Errorf("no WireGuard configs found") } // Get interface names configs := strings.Split(strings.TrimSpace(output), "\n") for _, conf := range configs { if conf == "" { continue } // Extract interface name from path (e.g., /etc/wireguard/wg0.conf -> wg0) parts := strings.Split(conf, "/") filename := parts[len(parts)-1] iface := strings.TrimSuffix(filename, ".conf") if p.Verbose { fmt.Printf(" Starting WireGuard interface: %s\n", iface) } // Enable and start enableCmd := fmt.Sprintf("systemctl enable wg-quick@%s", iface) startCmd := fmt.Sprintf("systemctl start wg-quick@%s", iface) p.remoteCmd(ctx, enableCmd) if err := p.remoteCmd(ctx, startCmd); err != nil { return fmt.Errorf("failed to start %s: %w", iface, err) } } return nil }