Single Go binary with five commands: - build: podman build locally with registry tags + git version - push: podman push to MCR - deploy: SSH pull/stop/rm/run on target node - cert renew: issue TLS cert from Metacrypt via REST API - status: show container status on a node Config-driven via TOML service registry describing images, Dockerfiles, container configs per node. Shells out to podman for container operations and ssh for remote access. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
65 lines
1.7 KiB
Go
65 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
// run executes a local command, streaming stdout/stderr to os.Stdout/os.Stderr.
|
|
func run(name string, args ...string) error {
|
|
fmt.Printf(">>> %s %s\n", name, strings.Join(args, " "))
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
// runIn executes a local command in a specific directory.
|
|
func runIn(dir string, name string, args ...string) error {
|
|
fmt.Printf(">>> (in %s) %s %s\n", dir, name, strings.Join(args, " "))
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Dir = dir
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
// runOutput executes a local command and returns stdout as a string.
|
|
func runOutput(dir string, name string, args ...string) (string, error) {
|
|
fmt.Printf(">>> %s %s\n", name, strings.Join(args, " "))
|
|
cmd := exec.Command(name, args...)
|
|
cmd.Dir = dir
|
|
cmd.Stderr = os.Stderr
|
|
var buf bytes.Buffer
|
|
cmd.Stdout = &buf
|
|
if err := cmd.Run(); err != nil {
|
|
return "", err
|
|
}
|
|
return strings.TrimSpace(buf.String()), nil
|
|
}
|
|
|
|
// sshRun executes a command on a remote host via SSH.
|
|
func sshRun(host string, command string) error {
|
|
fmt.Printf(">>> ssh %s %s\n", host, command)
|
|
cmd := exec.Command("ssh", host, command)
|
|
cmd.Stdout = os.Stdout
|
|
cmd.Stderr = os.Stderr
|
|
return cmd.Run()
|
|
}
|
|
|
|
// sshOutput executes a command on a remote host and returns stdout.
|
|
func sshOutput(host string, command string) (string, error) {
|
|
fmt.Printf(">>> ssh %s %s\n", host, command)
|
|
cmd := exec.Command("ssh", host, command)
|
|
cmd.Stderr = os.Stderr
|
|
var buf bytes.Buffer
|
|
cmd.Stdout = &buf
|
|
if err := cmd.Run(); err != nil {
|
|
return "", err
|
|
}
|
|
return strings.TrimSpace(buf.String()), nil
|
|
}
|