package main import ( "context" "fmt" "git.badhouseplants.net/allanger/shoebill/internal/controller" "git.badhouseplants.net/allanger/shoebill/internal/utils/workdir" "github.com/alecthomas/kong" "github.com/go-logr/logr" "github.com/go-logr/zapr" "go.uber.org/zap" ) type Sync struct { Config string `short:"c" default:"config.yaml" help:"A path to the configuration file"` Workdir string `short:"w" default:"" help:"A path to a workdir"` SshKey string `help:"A path to the ssh key that should be used for git operations"` DryRun bool `help:"Run the generation without pushing to repos"` SopsBin string `default:"/usr/bin/sops" help:"A path to the sops binary"` } var CLI struct { Sync Sync `cmd:"" help:"Sync gitops configs"` } func main() { var log logr.Logger zapLog, err := zap.NewDevelopment() if err != nil { panic(fmt.Sprintf("who watches the watchmen (%v)?", err)) } log = zapr.NewLogger(zapLog) ctx := logr.NewContext(context.Background(), log) cmd := kong.Parse(&CLI) switch cmd.Command() { case "sync": if err := syncCmd(ctx, CLI.Sync); err != nil { log.Error(err, "Error occured during the execution") } default: panic(cmd.Command()) } } func syncCmd(ctx context.Context, args Sync) error { log, err := logr.FromContext(ctx) if err != nil { return err } log.Info("Setting up the sync command") log.Info("Trying to read the config file", "path", args.Config) configObj, err := controller.ReadTheConfig(args.Config) if err != nil { log.Error(err, "Couldn't read the config file") return err } log.Info("Preparing the workdir") workdirPath, err := workdir.CreateWorkdir(ctx, args.Workdir) if err != nil { log.Error(err, "Couldn't prepare a working directory") return err } syncOptions := &controller.SyncOptions{ SSHKey: args.SshKey, Dry: args.DryRun, Config: configObj, Workdir: workdirPath, SopsBin: args.SopsBin, } if err := controller.Sync(ctx, syncOptions); err != nil { log.Error(err, "Couldn't sync the config") return err } return nil }