121 lines
2.4 KiB
Go
121 lines
2.4 KiB
Go
|
// Copyright 2024 Mikhail Klementev. All rights reserved.
|
||
|
// Use of this source code is governed by a AGPLv3 license
|
||
|
// (or later) that can be found in the LICENSE file.
|
||
|
|
||
|
package cmd
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/rs/zerolog/log"
|
||
|
|
||
|
"code.dumpstack.io/tools/out-of-tree/client"
|
||
|
"code.dumpstack.io/tools/out-of-tree/daemon"
|
||
|
)
|
||
|
|
||
|
type DaemonCmd struct {
|
||
|
Addr string `default:":63527"`
|
||
|
|
||
|
Serve DaemonServeCmd `cmd:"" help:"start daemon"`
|
||
|
|
||
|
Job DaemonJobCmd `cmd:"" aliases:"jobs" help:"manage jobs"`
|
||
|
Repo DaemonRepoCmd `cmd:"" aliases:"repos" help:"manage repositories"`
|
||
|
}
|
||
|
|
||
|
type DaemonServeCmd struct{}
|
||
|
|
||
|
func (cmd *DaemonServeCmd) Run(dm *DaemonCmd, g *Globals) (err error) {
|
||
|
d, err := daemon.Init(g.Config.Kernels)
|
||
|
if err != nil {
|
||
|
log.Fatal().Err(err).Msg("")
|
||
|
}
|
||
|
defer d.Kill()
|
||
|
|
||
|
go d.Daemon()
|
||
|
d.Listen(dm.Addr)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
type DaemonJobCmd struct {
|
||
|
List DaemonJobsListCmd `cmd:"" help:"list jobs"`
|
||
|
Status DaemonJobsStatusCmd `cmd:"" help:"show job status"`
|
||
|
Log DaemonJobsLogsCmd `cmd:"" help:"job logs"`
|
||
|
}
|
||
|
|
||
|
type DaemonJobsListCmd struct{}
|
||
|
|
||
|
func (cmd *DaemonJobsListCmd) Run(dm *DaemonCmd, g *Globals) (err error) {
|
||
|
c := client.Client{RemoteAddr: g.RemoteAddr}
|
||
|
jobs, err := c.Jobs()
|
||
|
if err != nil {
|
||
|
log.Error().Err(err).Msg("")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
b, err := json.MarshalIndent(jobs, "", " ")
|
||
|
if err != nil {
|
||
|
log.Error().Err(err).Msg("")
|
||
|
}
|
||
|
|
||
|
fmt.Println(string(b))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
type DaemonJobsStatusCmd struct {
|
||
|
UUID string `arg:""`
|
||
|
}
|
||
|
|
||
|
func (cmd *DaemonJobsStatusCmd) Run(dm *DaemonCmd, g *Globals) (err error) {
|
||
|
c := client.Client{RemoteAddr: g.RemoteAddr}
|
||
|
st, err := c.JobStatus(cmd.UUID)
|
||
|
if err != nil {
|
||
|
log.Error().Err(err).Msg("")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
fmt.Println(st)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
type DaemonJobsLogsCmd struct {
|
||
|
UUID string `arg:""`
|
||
|
}
|
||
|
|
||
|
func (cmd *DaemonJobsLogsCmd) Run(dm *DaemonCmd, g *Globals) (err error) {
|
||
|
c := client.Client{RemoteAddr: g.RemoteAddr}
|
||
|
logs, err := c.JobLogs(cmd.UUID)
|
||
|
if err != nil {
|
||
|
log.Error().Err(err).Msg("")
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for _, l := range logs {
|
||
|
log.Info().Msg(l.Name)
|
||
|
fmt.Println(l.Text)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
type DaemonRepoCmd struct {
|
||
|
List DaemonRepoListCmd `cmd:"" help:"list repos"`
|
||
|
}
|
||
|
|
||
|
type DaemonRepoListCmd struct{}
|
||
|
|
||
|
func (cmd *DaemonRepoListCmd) Run(dm *DaemonCmd, g *Globals) (err error) {
|
||
|
c := client.Client{RemoteAddr: g.RemoteAddr}
|
||
|
repos, err := c.Repos()
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
b, err := json.MarshalIndent(repos, "", " ")
|
||
|
if err != nil {
|
||
|
log.Error().Err(err).Msg("")
|
||
|
}
|
||
|
|
||
|
fmt.Println(string(b))
|
||
|
return
|
||
|
}
|