multisql/mgr/mgr.go

133 lines
2.9 KiB
Go
Raw Permalink Normal View History

2022-11-08 11:16:29 +01:00
package mgr
import (
"fmt"
2022-11-08 11:36:07 +01:00
"log"
2022-11-08 11:16:29 +01:00
"os"
"path"
"sync"
"time"
2022-11-09 13:40:03 +01:00
"baal.ar76.eu/x/pub/multisql/cfg"
"baal.ar76.eu/x/pub/multisql/pass"
2022-11-09 13:40:03 +01:00
"baal.ar76.eu/x/pub/multisql/psql"
2022-11-08 11:16:29 +01:00
)
type Manager struct {
config cfg.Config
runDir string
2022-11-08 11:16:29 +01:00
verbose bool
askPass bool
2022-11-08 11:16:29 +01:00
}
func Create(verbose bool, askPass bool, outdir string, config cfg.Config) (Manager, error) {
2022-11-08 11:16:29 +01:00
runDir := createRunDir(outdir)
manager := Manager{
config: config,
runDir: runDir,
2022-11-08 11:16:29 +01:00
verbose: verbose,
askPass: askPass,
2022-11-08 11:16:29 +01:00
}
return manager, nil
}
func createRunDir(out string) string {
t := time.Now()
dataPart := t.Format("2006-01-02T15_04_05")
newDir := fmt.Sprintf("%s-%d", dataPart, os.Getpid())
dir := path.Join(out, newDir)
return dir
}
func (self Manager) GetScripts() ([]string, error) {
entries, err := os.ReadDir(self.config.SqlDir)
if err != nil {
return nil, fmt.Errorf("błąd wczytywania skryptów: %w", err)
}
scripts := make([]string, 0, len(entries))
for _, e := range entries {
if e.IsDir() {
continue
}
scrpt := path.Join(self.config.SqlDir, e.Name())
_, err := os.Stat(scrpt)
if err != nil {
2022-11-08 11:36:07 +01:00
log.Printf("Skrypt zostanie pominięty z powodu błedu: %v\n", err)
2022-11-08 11:16:29 +01:00
continue
}
scripts = append(scripts, scrpt)
}
return scripts, err
}
func (self Manager) Run() error {
err := os.Mkdir(self.runDir, 0o755)
if err != nil {
return fmt.Errorf("błąd tworzenia katalogu z wynikami: %w", err)
}
scripts, err := self.GetScripts()
if err != nil {
return err
}
var passdb *pass.PassDb
if self.config.PassFile != "" {
password := pass.GetMasterPass(self.askPass)
passdb, err = pass.Load(self.config.PassFile, password)
if err != nil {
return err
}
}
2022-11-08 11:16:29 +01:00
var group sync.WaitGroup
for _, con := range self.config.Connections {
dbDir, err := self.createDirPerCon(con)
if err != nil {
2022-11-08 11:36:07 +01:00
log.Printf("Problem z utworzeniem katalogu wynikow dla połaczenie: %v", dbDir)
log.Printf("Pomijam połaczenie")
2022-11-08 11:16:29 +01:00
continue
}
group.Add(1)
stream := make(chan psql.Result)
go self.Logger(&group, stream, con)
sql := psql.Create(
passdb,
2022-11-08 11:16:29 +01:00
dbDir,
scripts,
con,
self.config.PsqlExec,
2022-11-08 11:36:07 +01:00
self.verbose,
2022-11-08 11:16:29 +01:00
)
go sql.Exec(stream)
}
group.Wait()
return nil
}
func (self Manager) createDirPerCon(con cfg.Connection) (string, error) {
dbDir := fmt.Sprintf("%s_%d_%s_%s", con.Host, con.Port, con.DbName, con.User)
dir := path.Join(self.runDir, dbDir)
err := os.Mkdir(dir, 0o755)
return dir, err
}
func (self Manager) Logger(group *sync.WaitGroup, stream <-chan psql.Result, con cfg.Connection) {
for event := range stream {
if event.Err != nil {
scr := path.Base(event.Script)
2022-11-08 11:36:07 +01:00
log.Printf("%s:%d:%s:%s Skrypt: %s Błąd: %v\n", con.Host, con.Port, con.DbName, con.User, scr, event.Err)
2022-11-08 11:16:29 +01:00
} else if self.verbose {
scr := path.Base(event.Script)
2022-11-08 11:36:07 +01:00
log.Printf("%s:%d:%s:%s Skrypt %s zakończony poprawnie\n", con.Host, con.Port, con.DbName, con.User, scr)
2022-11-08 11:16:29 +01:00
}
}
group.Done()
}