/* * Copyright 2022 Oleg Borodin */ package main import ( "context" "flag" "fmt" "os" "path/filepath" "time" "certmanager/internal/config" "certmanager/internal/database" "certmanager/internal/descriptor" "gopkg.in/yaml.v3" ) func main() { var err error util := NewUtil() err = util.Exec() if err != nil { fmt.Printf("Exec error: %s\n", err) } } type Util struct { conf *config.Config db *database.Database filename string } func NewUtil() *Util { var util Util return &util } func (util *Util) GetOpt() error { var err error exeName := filepath.Base(os.Args[0]) help := func() { fmt.Println("") fmt.Printf("Usage: %s [option]\n", exeName) fmt.Printf("\n") flag.PrintDefaults() fmt.Printf("\n") } flag.Usage = help flag.StringVar(&util.filename, "file", util.filename, "dump file name") flag.Parse() return err } func (util *Util) Exec() error { var err error err = util.GetOpt() if err != nil { return err } const timeout = 30 * time.Second ctx, _ := context.WithTimeout(context.Background(), timeout) err = util.DumpRecords(ctx) type ErrorDescr struct { Error bool `json:"error,omitempty"` Message string `json:"errorMessage,omitempty" yaml:"errorMessage,omitempty"` } errDescr := ErrorDescr{} if err != nil { errDescr.Error = true errDescr.Message = fmt.Sprintf("%v", err) } errBytes, _ := yaml.Marshal(errDescr) fmt.Printf("%s\n", string(errBytes)) return err } func (util *Util) DumpRecords(ctx context.Context) error { var err error util.conf = config.NewConfig() err = util.conf.ReadFile() if err != nil { return err } err = util.conf.ReadEnv() if err != nil { return err } db, err := database.NewDatabase(util.conf.DataDir) if err != nil { return err } util.db = db err = util.db.InitDatabase(ctx) if err != nil { return err } file := os.Stdout if util.filename != "" { file, err = os.OpenFile(util.filename, os.O_CREATE|os.O_WRONLY, 0640) if err != nil { return err } defer file.Close() } listIssuers, err := util.db.ListIssuers(ctx) if err != nil { return err } listServices, err := util.db.ListServices(ctx) if err != nil { return err } listAccounts, err := util.db.ListAccounts(ctx) if err != nil { return err } listGrants, err := util.db.ListGrants(ctx) if err != nil { return err } dump := descriptor.Dump{ Timestamp: time.Now().Format(time.RFC3339), Issuers: listIssuers, Services: listServices, Accounts: listAccounts, Grants: listGrants, } dumpBytes, err := yaml.Marshal(dump) if err != nil { return err } _, err = file.Write(dumpBytes) if err != nil { return err } return err }