diff options
| author | Niall Sheridan <nsheridan@gmail.com> | 2017-01-08 19:39:51 +0000 | 
|---|---|---|
| committer | Niall Sheridan <nsheridan@gmail.com> | 2017-01-08 22:00:03 +0000 | 
| commit | 6dfe350cb5eefde3a99374d14c083d1906717ddd (patch) | |
| tree | f064f18885b4c314845756fec2021980c2fb6dd9 | |
| parent | 9aeb1445549ec9a5b890f6df9bcf2952ef94ee03 (diff) | |
Remove dbinit and use sql/js seed files
| -rw-r--r-- | .travis.yml | 5 | ||||
| -rw-r--r-- | README.md | 5 | ||||
| -rw-r--r-- | cmd/dbinit/dbinit.go | 126 | ||||
| -rw-r--r-- | db/seed.js | 3 | ||||
| -rw-r--r-- | db/seed.sql | 13 | ||||
| -rw-r--r-- | server/store/store_test.go | 31 | 
6 files changed, 40 insertions, 143 deletions
| diff --git a/.travis.yml b/.travis.yml index a377de1..5ca7233 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,14 +16,13 @@ matrix:  before_install:    - go get -v github.com/golang/lint/golint -  - go install ./cmd/dbinit  install:    - go version  before_script: -  - dbinit -db_user user -db_password passwd -  - dbinit -db_type mongo -admin_user '' -db_user user -db_password passwd +  - mysql < db/seed.sql +  - mongo db/seed.js  sudo: false  script: @@ -151,8 +151,9 @@ server {  }  ``` -Prior to using MySQL, MongoDB or SQLite you need to create the database and tables using the [dbinit tool](cmd/dbinit/dbinit.go).   -dbinit hasn't been tested with mongo replica sets. +Prior to using MySQL, MongoDB or SQLite you need to create the database and tables using [one of the provided files](db).   +e.g. `mysql < db/seed.sql` or `mongo db/seed.js`.   +Obviously you should setup a role user for running in prodution.  ### datastore diff --git a/cmd/dbinit/dbinit.go b/cmd/dbinit/dbinit.go deleted file mode 100644 index 4cf0834..0000000 --- a/cmd/dbinit/dbinit.go +++ /dev/null @@ -1,126 +0,0 @@ -package main - -import ( -	"database/sql" -	"flag" -	"fmt" -	"log" -	"strings" - -	mgo "gopkg.in/mgo.v2" - -	"github.com/go-sql-driver/mysql" -	_ "github.com/mattn/go-sqlite3" -) - -var ( -	host        = flag.String("host", "localhost", "host[:port]") -	adminUser   = flag.String("admin_user", "root", "Admin user") -	adminPasswd = flag.String("admin_password", "", "Admin password") -	dbUser      = flag.String("db_user", "user", "Database user") -	dbPasswd    = flag.String("db_password", "passwd", "Admin password") -	dbType      = flag.String("db_type", "mysql", "Database engine (\"mysql\", \"sqlite\" or \"mongo\")") -	sqliteDB    = flag.String("db_path", "certs.db", "Path to SQLite database") -	authDB      = flag.String("authdb", "admin", "Admin database (mongo)") - -	certsDB     = "certs" -	issuedTable = "issued_certs" -	createTable = `CREATE TABLE IF NOT EXISTS ` + issuedTable + ` ( -			key_id VARCHAR(255) NOT NULL, -			principals VARCHAR(255) NULL, -			created_at DATETIME NULL, -			expires_at DATETIME NULL, -			revoked BOOLEAN DEFAULT NULL, -			raw_key TEXT NULL, -			PRIMARY KEY (key_id) -		);` -) - -func initSQLite() { -	db, err := sql.Open("sqlite3", *sqliteDB) -	if err != nil { -		log.Fatal(err) -	} -	defer db.Close() - -	if _, err = db.Exec(createTable); err != nil { -		log.Fatal(err) -	} -} - -func initMySQL() { -	var createTableStmt = []string{ -		`CREATE DATABASE IF NOT EXISTS ` + certsDB + ` DEFAULT CHARACTER SET = 'utf8' DEFAULT COLLATE 'utf8_general_ci';`, -		`USE ` + certsDB + `;`, -		createTable, -		`GRANT ALL PRIVILEGES ON certs.* TO '` + *dbUser + `'@'%' IDENTIFIED BY '` + *dbPasswd + `';`, -	} - -	if len(strings.Split(*host, ":")) != 2 { -		*host = fmt.Sprintf("%s:3306", *host) -	} -	conn := &mysql.Config{ -		User:   *adminUser, -		Passwd: *adminPasswd, -		Net:    "tcp", -		Addr:   *host, -	} -	db, err := sql.Open("mysql", conn.FormatDSN()) -	if err != nil { -		log.Fatalf("Error connecting to database: %v", err) -	} -	defer db.Close() -	if err := db.Ping(); err != nil { -		log.Fatalf("Unable to connect to database.") -	} -	for _, stmt := range createTableStmt { -		_, err := db.Exec(stmt) -		if err != nil { -			log.Fatalf("Error running setup: %v", err) -		} -	} -} - -func initMongo() { -	di := &mgo.DialInfo{ -		Addrs:    strings.Split(*host, ","), -		Username: *adminUser, -		Password: *adminPasswd, -		Database: *authDB, -	} -	session, err := mgo.DialWithInfo(di) -	if err != nil { -		log.Fatalln(err) -	} -	defer session.Close() -	d := session.DB(certsDB) -	if err := d.UpsertUser(&mgo.User{ -		Username: *dbUser, -		Password: *dbPasswd, -		Roles:    []mgo.Role{mgo.RoleReadWrite}, -	}); err != nil { -		log.Fatalln(err) -	} -	c := d.C(issuedTable) -	i := mgo.Index{ -		Key:    []string{"keyid"}, -		Unique: true, -	} -	if err != c.EnsureIndex(i) { -		log.Fatalln(err) -	} -} - -func main() { -	flag.Parse() -	switch *dbType { -	case "mysql": -		initMySQL() -	case "mongo": -		initMongo() -	case "sqlite": -		initSQLite() -	default: -		log.Fatalf("Invalid database type") -	} -} diff --git a/db/seed.js b/db/seed.js new file mode 100644 index 0000000..c9d62fa --- /dev/null +++ b/db/seed.js @@ -0,0 +1,3 @@ +conn = new Mongo(); +db = conn.getDB("certs"); +db.issued_certs.createIndex({"keyid": 1}, {unique: true}); diff --git a/db/seed.sql b/db/seed.sql new file mode 100644 index 0000000..cf5e62a --- /dev/null +++ b/db/seed.sql @@ -0,0 +1,13 @@ +CREATE DATABASE IF NOT EXISTS `certs`; + +USE `certs`; + +CREATE TABLE `issued_certs` ( +  `key_id` varchar(255) NOT NULL, +  `principals` varchar(255) DEFAULT NULL, +  `created_at` datetime DEFAULT NULL, +  `expires_at` datetime DEFAULT NULL, +  `revoked` tinyint(1) DEFAULT NULL, +  `raw_key` text, +  PRIMARY KEY (`key_id`) +); diff --git a/server/store/store_test.go b/server/store/store_test.go index dbe2d95..281a614 100644 --- a/server/store/store_test.go +++ b/server/store/store_test.go @@ -3,9 +3,11 @@ package store  import (  	"crypto/rand"  	"crypto/rsa" +	"database/sql"  	"io/ioutil"  	"os" -	"os/exec" +	"os/user" +	"strings"  	"testing"  	"time" @@ -15,10 +17,6 @@ import (  	"golang.org/x/crypto/ssh"  ) -var ( -	dbConfig = map[string]string{"username": "user", "password": "passwd", "address": "localhost"} -) -  func TestParseCertificate(t *testing.T) {  	t.Parallel()  	a := assert.New(t) @@ -93,8 +91,8 @@ func TestMySQLStore(t *testing.T) {  	if os.Getenv("MYSQL_TEST") == "" {  		t.Skip("No MYSQL_TEST environment variable")  	} -	dbConfig["type"] = "mysql" -	db, err := NewSQLStore(dbConfig) +	u, _ := user.Current() +	db, err := NewSQLStore(map[string]string{"type": "mysql", "username": u.Username})  	if err != nil {  		t.Error(err)  	} @@ -106,8 +104,7 @@ func TestMongoStore(t *testing.T) {  	if os.Getenv("MONGO_TEST") == "" {  		t.Skip("No MONGO_TEST environment variable")  	} -	dbConfig["type"] = "mongo" -	db, err := NewMongoStore(dbConfig) +	db, err := NewMongoStore(map[string]string{"type": "mongo"})  	if err != nil {  		t.Error(err)  	} @@ -121,11 +118,21 @@ func TestSQLiteStore(t *testing.T) {  		t.Error(err)  	}  	defer os.Remove(f.Name()) -	// This is so jank. -	args := []string{"run", "../../cmd/dbinit/dbinit.go", "-db_type", "sqlite", "-db_path", f.Name()} -	if err := exec.Command("go", args...).Run(); err != nil { + +	seed, err := ioutil.ReadFile("../../db/seed.sql") +	if err != nil {  		t.Error(err)  	} +	stmts := strings.Split(string(seed), ";") +	d, _ := sql.Open("sqlite3", f.Name()) +	for _, stmt := range stmts { +		if !strings.Contains(stmt, "CREATE TABLE") { +			continue +		} +		d.Exec(stmt) +	} +	d.Close() +  	config := map[string]string{"type": "sqlite", "filename": f.Name()}  	db, err := NewSQLStore(config)  	if err != nil { | 
