From ab90333b9ee6dfae2469fb1c16c56477d729ba40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Se=C3=A1n=20C=20McCord?= Date: Sun, 26 Jan 2025 17:40:15 -0500 Subject: [PATCH] working dbinit --- README.md | 4 +-- dbinit/Dockerfile | 10 ++++++ dbinit/go.mod | 7 ++++ dbinit/go.sum | 4 +++ dbinit/main.go | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 dbinit/Dockerfile create mode 100644 dbinit/go.mod create mode 100644 dbinit/go.sum create mode 100644 dbinit/main.go diff --git a/README.md b/README.md index 8b97a82..76dcc88 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# archivmatica +# archivematica -Archivmatica on Kubernetes \ No newline at end of file +Archivematica on Kubernetes diff --git a/dbinit/Dockerfile b/dbinit/Dockerfile new file mode 100644 index 0000000..5da10e6 --- /dev/null +++ b/dbinit/Dockerfile @@ -0,0 +1,10 @@ +FROM golang:alpine AS builder + +COPY . /src +WORKDIR /src +RUN go build -o /app + +FROM alpine +COPY --from=builder /app /app +ENTRYPOINT ["/app"] +CMD [] diff --git a/dbinit/go.mod b/dbinit/go.mod new file mode 100644 index 0000000..80d7e23 --- /dev/null +++ b/dbinit/go.mod @@ -0,0 +1,7 @@ +module git.cycore.io/jp/archivematica/dbinit + +go 1.23.3 + +require github.com/go-sql-driver/mysql v1.8.1 + +require filippo.io/edwards25519 v1.1.0 // indirect diff --git a/dbinit/go.sum b/dbinit/go.sum new file mode 100644 index 0000000..19dbcec --- /dev/null +++ b/dbinit/go.sum @@ -0,0 +1,4 @@ +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= diff --git a/dbinit/main.go b/dbinit/main.go new file mode 100644 index 0000000..4dc7e52 --- /dev/null +++ b/dbinit/main.go @@ -0,0 +1,84 @@ +package main + +import ( + "database/sql" + "flag" + "fmt" + "log" + "os" + + _ "github.com/go-sql-driver/mysql" +) + +var wipeDB bool + +func init() { + flag.BoolVar(&wipeDB, "wipe-databases", false, "wipe databases before creating them") +} + +func main() { + flag.Parse() + + db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:3306)/", + os.Getenv("DB_ADMIN_USER"), + os.Getenv("DB_ADMIN_PASS"), + os.Getenv("DB_HOST"), + )) + if err != nil { + log.Fatal("failed to connect to database:", err) + } + + if err := createDB(db, + os.Getenv("DB_PASS"), + ); err != nil { + log.Fatal("failed to ensure database creation:", err) + } + + log.Print("database verified") +} + +func createDB(db *sql.DB, dbpass string) error { + tx, err := db.Begin() + if err != nil { + return fmt.Errorf("failed to create db transaction: %w", err) + } + + defer tx.Rollback() + + if wipeDB { + if _, err := tx.Exec("DROP DATABASE IF EXISTS mcp"); err != nil { + return fmt.Errorf("failed to drop existing mcp database: %w", err) + } + + if _, err := tx.Exec("DROP DATABASE IF EXISTS ss"); err != nil { + return fmt.Errorf("failed to drop existing ss database: %w", err) + } + } + + // NB: "CREATE USER" does not support substitutions: https://bugs.mysql.com/bug.php?id=28406 + if _, err := tx.Exec(fmt.Sprintf(`CREATE USER IF NOT EXISTS 'am'@'%%' IDENTIFIED BY '%s'`, dbpass)); err != nil { + return fmt.Errorf("failed to create database user: %w", err) + } + + if _, err := tx.Exec(`CREATE DATABASE IF NOT EXISTS mcp CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci`); err != nil { + return fmt.Errorf("failed to ensure creation of mcp database: %w", err) + } + + if _, err := tx.Exec(`GRANT ALL ON mcp.* TO 'am'@'%'`); err != nil { + return fmt.Errorf("failed to ensure privilege to mcp database: %w", err) + } + + if _, err := tx.Exec(`CREATE DATABASE IF NOT EXISTS ss CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci`); err != nil { + return fmt.Errorf("failed to ensure creation of ss database: %w", err) + } + + if _, err := tx.Exec(`GRANT ALL ON ss.* TO 'am'@'%'`); err != nil { + return fmt.Errorf("failed to ensure privilege to ss database: %w", err) + } + + if _, err := tx.Exec(`FLUSH PRIVILEGES`); err != nil { + return fmt.Errorf("failed to flush privileges: %w", err) + } + + return tx.Commit() +}