package cli
import (
"context"
"fmt"
"io"
"os"
"os/signal"
"syscall"
"text/tabwriter"
cmd "github.com/openeuler/Conch/internal/cli/cmd"
"github.com/openeuler/Conch/internal/version"
)
func printHelp(out io.Writer) {
fmt.Fprintln(out, "conch - Conch command-line tool")
fmt.Fprintln(out, "")
fmt.Fprintln(out, "Usage:")
fmt.Fprintln(out, " conch <command> [options]")
fmt.Fprintln(out, "")
fmt.Fprintln(out, "Commands:")
tw := tabwriter.NewWriter(out, 0, 0, 2, ' ', 0)
fmt.Fprintln(tw, " image\tPull, push, unpack, list, or remove images.")
fmt.Fprintln(tw, " sandbox\tCreate, checkpoint, or control sandboxes from Template Names.")
fmt.Fprintln(tw, " template\tBuild, list, inspect, or remove templates.")
fmt.Fprintln(tw, " debug\tLow-level inspection and repair commands.")
_ = tw.Flush()
fmt.Fprintln(out, "")
fmt.Fprintln(out, "Run 'conch <command> --help' for command-specific usage.")
}
func Run(args []string) int {
if len(args) == 1 && (args[0] == "-v" || args[0] == "--version") {
fmt.Fprintln(os.Stdout, version.String())
return 0
}
if len(args) == 1 && (args[0] == "-h" || args[0] == "--help") {
printHelp(os.Stdout)
return 0
}
if len(args) < 1 {
printHelp(os.Stderr)
return 2
}
sub := args[0]
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer cancel()
var err error
switch sub {
case "image":
err = cmd.RunImage(ctx, args[1:])
case "sandbox":
err = cmd.RunSandbox(ctx, args[1:])
case "template":
err = cmd.RunTemplate(ctx, args[1:])
case "debug":
err = cmd.RunDebug(ctx, args[1:])
default:
fmt.Fprintf(os.Stderr, "unknown command %q\n", sub)
printHelp(os.Stderr)
return 2
}
if err != nil {
fmt.Fprintln(os.Stderr, err)
return 1
}
return 0
}