diff --git a/cfg/params.go b/cfg/params.go index 06acd42..49e6b3a 100644 --- a/cfg/params.go +++ b/cfg/params.go @@ -14,6 +14,7 @@ type Parameters struct { Passfile string OutDir string SqlDir string + LogFile string } var params Parameters @@ -24,6 +25,7 @@ func init() { flag.StringVar(¶ms.Passfile, "passfile", "", "Plik pgpass z hasłami do baz") flag.StringVar(¶ms.OutDir, "outdir", "", "Katalog (istniejący i z prawem do zapisu), do którego generowane są wyniki") flag.StringVar(¶ms.SqlDir, "sqldir", "scripts", "Katalog, w którym znajdują się skrypty do uruchomienia") + flag.StringVar(¶ms.LogFile, "log", "", "Plik, do którego zostanie dopisany log programu") flag.Usage = printUsage flag.Parse() } diff --git a/cmd/multisql/multisql.go b/cmd/multisql/multisql.go index 696b642..436d174 100644 --- a/cmd/multisql/multisql.go +++ b/cmd/multisql/multisql.go @@ -1,19 +1,33 @@ package main import ( - "fmt" "multisql/cfg" "multisql/mgr" "os" + + "log" ) func main() { + log.SetFlags(log.LstdFlags) params := cfg.GetParams() + + if params.LogFile != "" { + fh, err := os.OpenFile(params.LogFile, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o664) + if err != nil { + log.Fatalf("Nie udało się ustawić logu: %v", err) + } + defer fh.Close() + log.SetOutput(fh) + } + + if params.Verbose { + log.Print("MultiSQL - start") + } config, err := cfg.GetConfig(params) if err != nil { - fmt.Fprintf(os.Stderr, "Błąd z konfiguracją: %v\n", err) - os.Exit(1) + log.Fatalf("Błąd z konfiguracją: %v\n", err) } @@ -22,25 +36,22 @@ func main() { } else { fs, err := os.Stat(params.OutDir) if err != nil { - fmt.Fprintf(os.Stderr, "Podany katalog wyników nie jest prawidłowy: %v\n", err) - os.Exit(1) + log.Fatalf("Podany katalog wyników nie jest prawidłowy: %v\n", err) } if !fs.IsDir() { - fmt.Fprintf(os.Stderr, "Ścieżka %s nie wskazuje na poprawny katalog\n", params.OutDir) + log.Fatalf("Ścieżka %s nie wskazuje na poprawny katalog\n", params.OutDir) } } manager, err := mgr.Create(params.Verbose, params.OutDir, config) if err != nil { - fmt.Fprintf(os.Stderr, "Nie można wystartować operacji: %v\n", err) - os.Exit(1) + log.Fatalf("Nie można wystartować operacji: %v\n", err) } err = manager.Run() if err != nil { - fmt.Fprintf(os.Stderr, "Błąd przetwarzania: %v\n", err) - os.Exit(1) + log.Fatalf("Błąd przetwarzania: %v\n", err) } } diff --git a/mgr/mgr.go b/mgr/mgr.go index 9f56aa2..c9bc538 100644 --- a/mgr/mgr.go +++ b/mgr/mgr.go @@ -2,6 +2,7 @@ package mgr import ( "fmt" + "log" "multisql/cfg" "multisql/psql" "os" @@ -49,7 +50,7 @@ func (self Manager) GetScripts() ([]string, error) { scrpt := path.Join(self.config.SqlDir, e.Name()) _, err := os.Stat(scrpt) if err != nil { - fmt.Fprintf(os.Stderr, "Skrypt zostanie pominięty z powodu błedu: %v\n", err) + log.Printf("Skrypt zostanie pominięty z powodu błedu: %v\n", err) continue } scripts = append(scripts, scrpt) @@ -72,8 +73,8 @@ func (self Manager) Run() error { for _, con := range self.config.Connections { dbDir, err := self.createDirPerCon(con) if err != nil { - fmt.Fprintf(os.Stderr, "Problem z utworzeniem katalogu wynikow dla połaczenie: %v", dbDir) - fmt.Fprintf(os.Stderr, "Pomijam połaczenie") + log.Printf("Problem z utworzeniem katalogu wynikow dla połaczenie: %v", dbDir) + log.Printf("Pomijam połaczenie") continue } @@ -87,6 +88,7 @@ func (self Manager) Run() error { scripts, con, self.config.PsqlExec, + self.verbose, ) go sql.Exec(stream) } @@ -107,10 +109,10 @@ func (self Manager) Logger(group *sync.WaitGroup, stream <-chan psql.Result, con for event := range stream { if event.Err != nil { scr := path.Base(event.Script) - fmt.Fprintf(os.Stderr, "%s:%d:%s:%s Skrypt: %s Błąd: %v\n", con.Host, con.Port, con.DbName, con.User, scr, event.Err) + log.Printf("%s:%d:%s:%s Skrypt: %s Błąd: %v\n", con.Host, con.Port, con.DbName, con.User, scr, event.Err) } else if self.verbose { scr := path.Base(event.Script) - fmt.Fprintf(os.Stderr, "%s:%d:%s:%s Skrypt %s zakończony poprawnie\n", con.Host, con.Port, con.DbName, con.User, scr) + log.Printf("%s:%d:%s:%s Skrypt %s zakończony poprawnie\n", con.Host, con.Port, con.DbName, con.User, scr) } } group.Done() diff --git a/psql/psql.go b/psql/psql.go index fc08e2e..c2296dd 100644 --- a/psql/psql.go +++ b/psql/psql.go @@ -2,6 +2,7 @@ package psql import ( "fmt" + "log" "multisql/cfg" "os" "os/exec" @@ -16,6 +17,7 @@ type Instance struct { passfile string psqlExe string conn cfg.Connection + verbose bool } type Result struct { @@ -23,7 +25,7 @@ type Result struct { Err error } -func Create(passfile string, outdir string, scripts []string, conn cfg.Connection, psqlExe string) (instnace Instance) { +func Create(passfile string, outdir string, scripts []string, conn cfg.Connection, psqlExe string, verbose bool) (instnace Instance) { instnace = Instance{ outdir: outdir, @@ -31,6 +33,7 @@ func Create(passfile string, outdir string, scripts []string, conn cfg.Connectio passfile: passfile, conn: conn, psqlExe: psqlExe, + verbose: verbose, } return instnace } @@ -62,7 +65,6 @@ func (self Instance) Exec(result chan<- Result) { continue } err = self.cmdPsql(outdir, connString, scr, absPassFile) - fmt.Println() result <- Result{ Script: scr, Err: err, @@ -116,7 +118,9 @@ func (self Instance) cmdPsql(outdir string, connString string, script string, pa } - fmt.Println("Uruchamiam", cmd.String()) + if self.verbose { + log.Printf("Uruchamiam %s", cmd.String()) + } err = cmd.Run() if err != nil { return fmt.Errorf("Błąd uruchamiania psql: %v", err)