2022-11-08 11:16:29 +01:00
|
|
|
|
package cfg
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"flag"
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
)
|
|
|
|
|
|
2022-11-22 17:14:04 +01:00
|
|
|
|
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
|
2022-11-22 17:14:04 +01:00
|
|
|
|
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(¶ms.Verbose, "verbose", false, "Dodatkowe komunkaty diagnostyczne")
|
|
|
|
|
flag.StringVar(¶ms.ConfigFile, "config", "multisql.conf", "Plik konfiguracji")
|
|
|
|
|
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")
|
2022-11-08 11:36:07 +01:00
|
|
|
|
flag.StringVar(¶ms.LogFile, "log", "", "Plik, do którego zostanie dopisany log programu")
|
2022-11-22 17:14:04 +01:00
|
|
|
|
flag.BoolVar(¶ms.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(¶ms.Version, "version", false, "Wypisuje wersję i kończy działanie")
|
2022-11-22 17:14:04 +01:00
|
|
|
|
|
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 są obsługiwane.
|
|
|
|
|
Pliki wynikowe zapisywane są 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
|
|
|
|
|
|
2022-11-22 17:24:23 +01:00
|
|
|
|
Użycie w trybie szyfrowania:
|
2022-11-23 14:31:32 +01:00
|
|
|
|
multisql encrypt plik.wynikowy.zaszyfrowany plik.zródłowy
|
2022-11-22 17:24:23 +01:00
|
|
|
|
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)
|
|
|
|
|
|
2022-11-22 17:24:23 +01:00
|
|
|
|
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 są 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
|
|
|
|
|
|
2022-11-22 17:24:23 +01:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|