164 lines
2.6 KiB
Go
164 lines
2.6 KiB
Go
/*
|
|
* Copyright 2022 Oleg Borodin <borodin@unix7.org>
|
|
*/
|
|
|
|
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
|
|
}
|