diff --git a/cmd/dist/comp/_hakurei b/cmd/dist/comp/_hakurei index 11424612..6580878c 100644 --- a/cmd/dist/comp/_hakurei +++ b/cmd/dist/comp/_hakurei @@ -36,6 +36,11 @@ _hakurei_show() { 'files:files:__hakurei_files' } +_hakurei_kill() { + _alternative \ + 'instances:domains:__hakurei_instances' +} + __hakurei_files() { _files -g "*.(json|hakurei)" return $? @@ -60,6 +65,7 @@ __hakurei_instances() { "run:Load and start container from configuration file" "exec:Configure and start a permissive container" "show:Show live or local instance configuration" + "kill:Terminate an active instance" "ps:List active instances" "version:Display version information" "license:Show full license text" diff --git a/cmd/hakurei/command.go b/cmd/hakurei/command.go index 12bf027a..374d521c 100644 --- a/cmd/hakurei/command.go +++ b/cmd/hakurei/command.go @@ -11,6 +11,7 @@ import ( "os/user" "strconv" "sync" + "syscall" "time" "hakurei.app/check" @@ -372,6 +373,23 @@ func buildCommand(ctx context.Context, msg message.Msg, early *earlyHardeningErr Flag(&flagNoStore, "no-store", command.BoolFlag(false), "Do not attempt to match from active instances") } + c.NewCommand("kill", "Terminate an active instance", func(args []string) error { + if len(args) != 1 { + log.Fatal("kill requires 1 argument") + } + + var sc hst.Paths + env.CopyPaths().Copy(&sc, new(outcome.Hsu).MustID(nil)) + entry := tryIdentifier(msg, args[0], outcome.NewStore(&sc)) + if entry == nil { + log.Fatalf("%q does not match any active instance", args[0]) + } + if err := syscall.Kill(entry.PID, syscall.SIGTERM); err != nil { + log.Fatalf("cannot terminate %s: %v", entry.ID.String(), err) + } + return errSuccess + }) + { var flagShort bool c.NewCommand("ps", "List active instances", func(args []string) error { diff --git a/cmd/hakurei/command_test.go b/cmd/hakurei/command_test.go index 61374cd8..059e18b1 100644 --- a/cmd/hakurei/command_test.go +++ b/cmd/hakurei/command_test.go @@ -25,6 +25,7 @@ commands: run Load and start container from configuration file exec Configure and start a permissive container show Show live or local instance configuration + kill Terminate an active instance ps List active instances version Display version information license Show full license text