diff --git a/README.md b/README.md index 6f2e985..a12d26c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # multiserver_converter -MT to multiserver SQLite3 auth database converter +MT to multiserver auth database converter diff --git a/converter.go b/converter.go index 15c3871..b1acb6b 100644 --- a/converter.go +++ b/converter.go @@ -3,9 +3,7 @@ multiserver_converter is a utility designed to convert MT authentication databases to the multiserver authentication database scheme Usage: - multiserver_converter -where in is the path to the MT auth database -and out is the desired path to the newly created database + multiserver_converter | psql > */ package main @@ -14,11 +12,13 @@ import ( "errors" "fmt" "os" + "strconv" + _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" ) -func convertDB(in, out string) error { +func convertSQLite3(in, out string) error { db, err := sql.Open("sqlite3", in) if err != nil { return err @@ -31,19 +31,18 @@ func convertDB(in, out string) error { } defer db2.Close() - if _, err := db2.Exec(` - CREATE TABLE auth ( - name VARCHAR(32) NOT NULL, - password VARCHAR(512) NOT NULL - ); - CREATE TABLE privileges ( - name VARCHAR(32) NOT NULL, - privileges VARCHAR(1024) - ); - CREATE TABLE ban ( - addr VARCHAR(39) NOT NULL, - name VARCHAR(32) NOT NULL - );`); err != nil { + if _, err := db2.Exec(`CREATE TABLE auth ( + name VARCHAR(32) PRIMARY KEY NOT NULL, + password VARCHAR(512) NOT NULL +); +CREATE TABLE privileges ( + name VARCHAR(32) PRIMARY KEY NOT NULL, + privileges VARCHAR(1024) +); +CREATE TABLE ban ( + addr VARCHAR(39) PRIMARY KEY NOT NULL, + name VARCHAR(32) NOT NULL +);`); err != nil { return err } @@ -52,8 +51,7 @@ func convertDB(in, out string) error { for { var name, password string - err := result.Scan(&name, &password) - if err != nil { + if err := result.Scan(&name, &password); err != nil { if errors.Is(err, sql.ErrNoRows) { break } @@ -62,11 +60,69 @@ func convertDB(in, out string) error { } _, err = db2.Exec(`INSERT INTO auth ( - name, password - ) VALUES ( - ?, - ? - );`, name, password) + name, password +) VALUES ( + ?, + ? +);`, name, password) + if err != nil { + return err + } + } + + return nil +} + +func convertPSQL(inDB, inUser, inPassword, inHost string, inPort int, outDB, outUser, outPassword, outHost string, outPort int) error { + inConn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", inHost, inPort, inUser, inPassword, inDB) + outConn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", outHost, outPort, outUser, outPassword, outDB) + + db, err := sql.Open("postgres", inConn) + if err != nil { + return err + } + defer db.Close() + + db2, err := sql.Open("postgres", outConn) + if err != nil { + return err + } + defer db2.Close() + + if _, err := db2.Exec(`CREATE TABLE auth ( + name VARCHAR(32) PRIMARY KEY NOT NULL, + password VARCHAR(512) NOT NULL +); +CREATE TABLE privileges ( + name VARCHAR(32) PRIMARY KEY NOT NULL, + privileges VARCHAR(1024) +); +CREATE TABLE ban ( + addr VARCHAR(39) PRIMARY KEY NOT NULL, + name VARCHAR(32) NOT NULL +);`); err != nil { + return err + } + + result := db.QueryRow("SELECT name, password FROM auth;") + + for { + var name, password string + + if err := result.Scan(&name, &password); err != nil { + if errors.Is(err, sql.ErrNoRows) { + break + } + + return err + } + + _, err = db2.Exec(`INSERT INTO auth ( + name, password +) VALUES ( + $1, + $2 +);`, name, password) if err != nil { return err } @@ -76,14 +132,44 @@ func convertDB(in, out string) error { } func main() { - if len(os.Args) != 3 { - fmt.Println("Usage: multiserver_converter ") + if len(os.Args) < 4 { + fmt.Println("Usage: multiserver_converter | psql >") os.Exit(1) } - if err := convertDB(os.Args[1], os.Args[2]); err != nil { - fmt.Println(err) - os.Exit(1) + switch os.Args[1] { + case "sqlite3": + if len(os.Args) != 4 { + fmt.Println("Usage: multiserver_converter | psql >") + os.Exit(1) + } + + if err := convertSQLite3(os.Args[2], os.Args[3]); err != nil { + fmt.Println(err) + os.Exit(1) + } + case "psql": + if len(os.Args) != 12 { + fmt.Println("Usage: multiserver_converter | psql >") + os.Exit(1) + } + + inPort, err := strconv.Atoi(os.Args[6]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + outPort, err := strconv.Atoi(os.Args[11]) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + if err := convertPSQL(os.Args[2], os.Args[3], os.Args[4], os.Args[5], inPort, os.Args[7], os.Args[8], os.Args[9], os.Args[10], outPort); err != nil { + fmt.Println(err) + os.Exit(1) + } } fmt.Println("Database converted successfully") diff --git a/go.mod b/go.mod index 6abfaef..7907a5e 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/HimbeerserverDE/multiserver/multiserver_converter go 1.16 -require github.com/mattn/go-sqlite3 v1.14.7 +require ( + github.com/lib/pq v1.10.1 + github.com/mattn/go-sqlite3 v1.14.7 +) diff --git a/go.sum b/go.sum index 96ff824..9df671d 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,4 @@ +github.com/lib/pq v1.10.1 h1:6VXZrLU0jHBYyAqrSPa+MgPfnSvTPuMgK+k0o5kVFWo= +github.com/lib/pq v1.10.1/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-sqlite3 v1.14.7 h1:fxWBnXkxfM6sRiuH3bqJ4CfzZojMOLVc0UTsTglEghA= github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=