tart-guest-agent/internal/command/root.go

86 lines
2.1 KiB
Go

package command
import (
"errors"
"github.com/cirruslabs/tart-guest-agent/internal/diskresizer"
"github.com/cirruslabs/tart-guest-agent/internal/logginglevel"
"github.com/cirruslabs/tart-guest-agent/internal/spice/vdagent"
"github.com/cirruslabs/tart-guest-agent/internal/tart"
"github.com/cirruslabs/tart-guest-agent/internal/version"
"github.com/spf13/cobra"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"golang.org/x/sys/unix"
"os"
"syscall"
)
var resizeDisk bool
var runVdagent bool
var debug bool
func NewRootCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "tart-guest-agent",
Short: "Guest agent for Tart VMs",
Version: version.FullVersion,
SilenceUsage: true,
SilenceErrors: true,
PersistentPreRunE: func(_ *cobra.Command, _ []string) error {
if debug {
logginglevel.Level.SetLevel(zapcore.DebugLevel)
}
return nil
},
RunE: run,
}
cmd.Flags().BoolVar(&resizeDisk, "resize-disk", false, "resize disk")
cmd.Flags().BoolVar(&runVdagent, "run-vdagent", false, "run vdagent")
cmd.Flags().BoolVar(&debug, "debug", false, "enable debug logging")
return cmd
}
func run(cmd *cobra.Command, args []string) error {
// Terminate to prevent corruption on systems with disk layouts other than Tart's
communicationPoint, ok := tart.LocateCommunicationPoint()
if !ok {
return unix.Kill(os.Getppid(), syscall.SIGTERM)
}
zap.S().Infof("successfully located host communication point %s, proceeding...",
communicationPoint)
// Perform disk resizing
if resizeDisk {
if err := diskresizer.Resize(); err != nil {
if errors.Is(err, diskresizer.ErrUnsupported) || errors.Is(err, diskresizer.ErrAlreadyResized) {
zap.S().Infof("skipping disk resizing: %v", err)
} else {
zap.S().Warnf("failed to resize disk: %v", err)
}
} else {
zap.S().Infof("successfully resized the disk")
}
}
if runVdagent {
vdAgent, err := vdagent.New()
if err != nil {
return err
}
if err := vdAgent.Run(cmd.Context()); err != nil {
return err
}
}
// Wait indefinitely
<-cmd.Context().Done()
return cmd.Context().Err()
}