118 lines
2.8 KiB
Go
118 lines
2.8 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
"time"
|
||
|
|
||
|
"git.keyzox.me/42_adjoly/inception/internal/env"
|
||
|
"git.keyzox.me/42_adjoly/inception/internal/log"
|
||
|
)
|
||
|
|
||
|
func createDBDir(dataDir string) {
|
||
|
if dataDir == "/var/lib/mysql" {
|
||
|
return
|
||
|
}
|
||
|
err := os.Mkdir(dataDir, 750)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
err = os.Mkdir(dataDir+"/.already", 750)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func checkOlderDB(dataDir string) bool {
|
||
|
if _, err := os.Stat(dataDir+"/.already"); errors.Is(err, os.ErrNotExist) {
|
||
|
return false
|
||
|
}
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
func waitForMariaDB() {
|
||
|
for i := 0; i < 30; i++ {
|
||
|
cmd := exec.Command("mysql", "-uroot", "-e", "SELECT 1")
|
||
|
if err := cmd.Run(); err == nil {
|
||
|
return
|
||
|
}
|
||
|
fmt.Println("MariaDB init process in progress...")
|
||
|
time.Sleep(1 * time.Second)
|
||
|
}
|
||
|
fmt.Println("MariaDB init process failed.")
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
func configureMariaDB(rootPassword, user, password, database string) {
|
||
|
cmd := exec.Command("mysql", "-uroot", "-e", fmt.Sprintf(`
|
||
|
ALTER USER 'root'@'localhost' IDENTIFIED BY '%s';
|
||
|
CREATE DATABASE IF NOT EXISTS %s;
|
||
|
CREATE USER IF NOT EXISTS '%s'@'%%' IDENTIFIED BY '%s';
|
||
|
GRANT ALL PRIVILEGES ON %s.* TO '%s'@'%%';
|
||
|
FLUSH PRIVILEGES;
|
||
|
`, rootPassword, database, user, password, database, user))
|
||
|
cmd.Stdout = os.Stdout
|
||
|
cmd.Stderr = os.Stderr
|
||
|
if err := cmd.Run(); err != nil {
|
||
|
fmt.Printf("Error configuring MariaDB: %v\n", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
args := os.Args
|
||
|
|
||
|
|
||
|
if args[1] == "mariadbd" || args[1] == "mysqld" {
|
||
|
_log.Log("note", "Entrypoint script for MariaDB Server started")
|
||
|
|
||
|
rootPass := env.FileEnv("MYSQL_ROOT_PASSWORD", "default")
|
||
|
pass := env.FileEnv("MYSQL_PASSWORD", "default")
|
||
|
user := env.FileEnv("MYSQL_USER", "mariadb")
|
||
|
dbName := env.EnvCheck("MYSQL_DATABASE", "default")
|
||
|
dataDir := env.EnvCheck("DATADIR", "/var/lib/mysql")
|
||
|
|
||
|
oldDB := checkOlderDB(dataDir)
|
||
|
if oldDB == false {
|
||
|
createDBDir(dataDir)
|
||
|
// Init DB
|
||
|
cmd := exec.Command("mariadb-install-db", "--user=mysql", "--ldata="+dataDir)
|
||
|
cmd.Stdout = os.Stdout
|
||
|
cmd.Stderr = os.Stderr
|
||
|
createDBDir(dataDir)
|
||
|
if err := cmd.Run(); err != nil {
|
||
|
_log.Log("error", "Error initializing MariaDB")
|
||
|
}
|
||
|
|
||
|
// Starting temp mariadb server for config
|
||
|
cmd = exec.Command("mariadbd-safe", "--skip-networking")
|
||
|
cmd.Stdout = os.Stdout
|
||
|
cmd.Stderr = os.Stderr
|
||
|
if err := cmd.Start(); err != nil {
|
||
|
fmt.Printf("Error starting MariaDB: %v\n", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
// Wait for mariadb to start
|
||
|
waitForMariaDB()
|
||
|
|
||
|
configureMariaDB(rootPass, user, pass, dbName)
|
||
|
|
||
|
if err := cmd.Process.Kill(); err != nil {
|
||
|
fmt.Printf("Error stopping MariaDB: %v\n", err)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cmd := exec.Command(args[1], args[2:]...)
|
||
|
cmd.Stdout = os.Stdout
|
||
|
cmd.Stderr = os.Stderr
|
||
|
cmd.Stdin = os.Stdin
|
||
|
if err := cmd.Run(); err != nil {
|
||
|
fmt.Printf("Error running MariaDB: %v\n", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|