From 2cbea02b3a1f9e7023d0be271b45488b8ae4aeb2 Mon Sep 17 00:00:00 2001 From: Alex Denes Date: Wed, 16 Oct 2024 19:45:48 +0000 Subject: [PATCH] Inital commit --- go.mod | 3 +++ main.go | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 go.mod create mode 100644 main.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f36b84f --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.redxen.eu/caskd/postgres-seeder + +go 1.22.7 diff --git a/main.go b/main.go new file mode 100644 index 0000000..bd85957 --- /dev/null +++ b/main.go @@ -0,0 +1,74 @@ +package main + +import ( + "flag" + "fmt" + "log" + "os" + "strings" +) + +func main() { + var ( + pairs = make(map[string]([]string)) + databases = make(map[string]interface{}) + l = log.New(os.Stderr, "postgres-seeder: ", log.Lmsgprefix|log.LUTC) + err error + + hbastr, initstr string + hba, init *os.File + hbabuf, initbuf strings.Builder + ) + + flag.StringVar(&hbastr, "hbafile", "pg_hba.conf", "Host-Based authentication file output") + flag.StringVar(&initstr, "init", "init.sql", "SQL command list file output") + flag.Parse() + + if hba, err = os.Create(hbastr); err != nil { + l.Fatalf("Cannot create or truncate HBA file %s: %s\n", hbastr, err) + } + defer hba.Close() + + if init, err = os.Create(initstr); err != nil { + l.Fatalf("Cannot create or truncate init file %s: %s\n", initstr, err) + } + defer init.Close() + + for _, v := range flag.Args() { + tok := strings.Split(v, "/") + if len(tok) != 2 { + l.Fatalln("Incorrect token count") + } + var ( + user = tok[0] + db = tok[1] + v []string + ) + + v, _ = pairs[user] + pairs[user] = append(v, db) + + databases[db] = nil + } + + hbabuf.WriteString("local\tall\tpostgres\ttrust\n") + + for d := range databases { + initbuf.WriteString(fmt.Sprintf("CREATE DATABASE %s;\n", d)) + } + + for u, v := range pairs { + initbuf.WriteString(fmt.Sprintf("CREATE USER %s LOGIN;\n", u)) + for _, d := range v { + initbuf.WriteString(fmt.Sprintf("GRANT ALL PRIVILEGES ON DATABASE %s TO %s;\n", d, u)) + hbabuf.WriteString(fmt.Sprintf("hostssl\t%s\t%s\tall\tcert\tclientcert=verify-full\n", u, d)) + } + } + + if _, err = hba.WriteString(hbabuf.String()); err != nil { + l.Fatalf("Failed to write to HBA: %s\n", err) + } + if _, err = init.WriteString(initbuf.String()); err != nil { + l.Fatalf("Failed to write to init: %s\n", err) + } +}