multisql/cfg/params.go

138 lines
3.6 KiB
Go
Raw Normal View History

2022-11-08 11:16:29 +01:00
package cfg
import (
"bytes"
"encoding/json"
"flag"
"fmt"
"os"
)
const MULTISQLPASS = "MULTISQLPASS" // nazwa ziennej środowiskowej z hasłem
2022-11-08 11:16:29 +01:00
type Parameters struct {
ConfigFile string
Passfile string
OutDir string
SqlDir string
LogFile string
Verbose bool
AskPass bool
2022-11-22 18:22:55 +01:00
Version bool
2022-11-08 11:16:29 +01:00
}
var params Parameters
func init() {
flag.BoolVar(&params.Verbose, "verbose", false, "Dodatkowe komunkaty diagnostyczne")
flag.StringVar(&params.ConfigFile, "config", "multisql.conf", "Plik konfiguracji")
flag.StringVar(&params.Passfile, "passfile", "", "Plik pgpass z hasłami do baz")
flag.StringVar(&params.OutDir, "outdir", "", "Katalog (istniejący i z prawem do zapisu), do którego generowane są wyniki")
flag.StringVar(&params.SqlDir, "sqldir", "scripts", "Katalog, w którym znajdują się skrypty do uruchomienia")
2022-11-08 11:36:07 +01:00
flag.StringVar(&params.LogFile, "log", "", "Plik, do którego zostanie dopisany log programu")
flag.BoolVar(&params.AskPass, "P", false, "Pytaj o hasło. Jeśli nie podane wymaga się hasła w ")
2022-11-22 18:22:55 +01:00
flag.BoolVar(&params.Version, "version", false, "Wypisuje wersję i kończy działanie")
2022-11-08 11:16:29 +01:00
flag.Usage = printUsage
flag.Parse()
}
func GetParams() Parameters {
return params
}
func printUsage() {
fmt.Fprintf(os.Stderr,
`
multisql - uruchamia zestaw skryptów na skonfigurowanej liście baz danych.
Program, dla każdej z baz wskazanych w konfiguracji, uruchamia kolejno każdy
z plików sql wskazanych parametrem lub w pliku konfiguracji poprzez
uruchomienie narzędzia psql:
psql -f skrypt.sql -w -L log.txt _szczegóły_połaczenia_ 2>stderr.txt > stdout.txt
Skrypty mogą mieć dowolne rozszerzenia ale podkatalogi nie obsługiwane.
Pliki wynikowe zapisywane do katalogu wskazanego w outdir w strukturze o postaci
output:
-> data-godzina-pid
-> host-port-baza-user
-> skrypt.sql
-> log.txt
-> stdout.txt
-> stderr.txt
Użycie:
multisql -outdir /tmp -sqldir /data/skrypty -passfile ./hasla
Użycie w trybie szyfrowania:
multisql encrypt plik.wynikowy.zaszyfrowany plik.zródłowy
lub
multisql [-P] decrypt plik.źródłowy.zaszyfrowany [plik.wynikowy.jawny]
2022-11-08 11:16:29 +01:00
Opis flag:
`,
)
flag.PrintDefaults()
fmt.Fprintf(os.Stderr,
`
Plik passfile ma standardowy format .pgpass PostgreSQLa.
Plik multisql.conf ma format JSON, np:
> `,
)
c := Config{
PassFile: "mypgpass",
PsqlExec: "/usr/local/bin/psql",
SqlDir: "/data/skrypty-sql",
Defaults: Connection{
Port: 5433,
User: "myapp",
DbName: "moja-db",
},
Connections: []Connection{
{
Host: "10.20.30.01",
},
{
Host: "10.20.30.02",
DbName: "innadb",
User: "innyuser",
},
},
}
b, _ := json.Marshal(&c)
var out bytes.Buffer
_ = json.Indent(&out, b, "> ", "\t")
_, _ = out.WriteTo(os.Stderr)
fmt.Fprintf(os.Stderr, `
2022-11-08 11:16:29 +01:00
PsqlExec jest opcjonalny - jesli nie zostanie podany wyszukuje się programu psql.exe w PATH.
Każde połączenie w tablicy Connections może zawierać Host, Port, User i DbName.
Brakujące wartości uzupełniane z sekcji Defaults (która ma taki sam
format jak obiekt w Connections).
Parametry mają pierwszeństwo przed wartościami w konfiguracji.
Format pliku passfile jest następujący:
hostname:port:database:username:password
W szczegółach opisano go na https://www.postgresql.org/docs/current/libpq-pgpass.html.
Aktualnie obsługiwana jest jedynie zaszyforowana postać pliku. Przed użyciem należy
plik zaszyfrować:
multsql encrypt pgpass.encrypted pgpass
Przy użyciu (odszyfrowaniu) pliku, hasło jest pobierane ze zmiennej
środowiskowej %s lub z klawiatury, jeśli użyto opcji -P.
`, MULTISQLPASS)
2022-11-08 11:16:29 +01:00
}