From aac0e0ab307126387732a825a1b0268d59ac2cbb Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Sat, 13 Jan 2024 18:33:38 +0100 Subject: [PATCH] database stuff --- .gitignore | 4 ++ deployment/decrypt-secrets.sh | 43 ++++++++++++++++++++ deployment/encrypt-secrets.sh | 27 ++++++++++++ deployment/secrets.enc | 2 + src/locsrv/.gitignore | 1 - src/locsrv/ENVDB.load | 14 +++++++ src/locsrv/database/abstract_database.go | 11 +++++ src/locsrv/database/database.go | 52 ++++++++++++++++++++++++ src/locsrv/database/migrate_database.go | 19 +++++++++ src/locsrv/go.mod | 19 +++++++-- src/locsrv/go.sum | 36 ++++++++++++---- src/locsrv/migrate_schema.go | 18 ++++++++ 12 files changed, 234 insertions(+), 12 deletions(-) create mode 100644 .gitignore create mode 100755 deployment/decrypt-secrets.sh create mode 100755 deployment/encrypt-secrets.sh create mode 100644 deployment/secrets.enc delete mode 100644 src/locsrv/.gitignore create mode 100644 src/locsrv/ENVDB.load create mode 100644 src/locsrv/database/abstract_database.go create mode 100644 src/locsrv/database/database.go create mode 100644 src/locsrv/database/migrate_database.go create mode 100644 src/locsrv/migrate_schema.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e052ef6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +src/locsrv/locsrv +src/locsrv/migrate +deployment/secrets.txt + diff --git a/deployment/decrypt-secrets.sh b/deployment/decrypt-secrets.sh new file mode 100755 index 0000000..d971ca7 --- /dev/null +++ b/deployment/decrypt-secrets.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +if [ "$ENCRYPTION_KEY" = "" ]; then + echo "ENCRYPTION_KEY not set" + exit 1 +fi + +if [ "$MD5_CHECKSUM" = "" ]; then + echo "No checksum given" + exit 1 +fi + +SECRETS_CIPHERTEXT_FILE=secrets.enc +SECRETS_PLAINTEXT_FILE=/tmp/secrets +TMP_FILE=`mktemp` +POD_NAME_SUFFIX=`date +%s` + +cat $SECRETS_CIPHERTEXT_FILE | \ + kubectl run openssl-$POD_NAME_SUFFIX \ + --rm \ + --image bitnami/debian-base-buildpack:latest \ + --env KEY=$ENCRYPTION_KEY \ + -i \ + -q \ + -- \ + /bin/sh -c "openssl enc -aes-256-cbc -salt -pass env:KEY -a -d" > \ + $TMP_FILE + +if [ `uname` = "Darwin" ]; then + CALCULATED_CHECKSUM=`cat $TMP_FILE | md5` +elif [ `uname` = "Linux" ]; then + CALCULATED_CHECKSUM=`cat $TMP_FILE | md5sum - | awk '{print $1}'` +fi + +if [ "$MD5_CHECKSUM" != "$CALCULATED_CHECKSUM" ]; then + echo "Invalid checksum" + exit 1 +fi + +# cat $TMP_FILE +mv $TMP_FILE $SECRETS_PLAINTEXT_FILE + + diff --git a/deployment/encrypt-secrets.sh b/deployment/encrypt-secrets.sh new file mode 100755 index 0000000..38a7b6d --- /dev/null +++ b/deployment/encrypt-secrets.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +ENCRYPTION_KEY=`openssl rand -hex 32` +echo $ENCRYPTION_KEY + +SECRETS_PLAINTEXT_FILE=secrets.txt +SECRETS_CIPHERTEXT_FILE=secrets.enc + +if [ `uname` = "Darwin" ]; then + cat $SECRETS_PLAINTEXT_FILE | md5 +elif [ `uname` = "Linux" ]; then + cat $SECRETS_PLAINTEXT_FILE | md5sum - | awk '{print $1}' +fi + +POD_NAME_SUFFIX=`date +%s` + +cat $SECRETS_PLAINTEXT_FILE | \ + kubectl run openssl-$POD_NAME_SUFFIX \ + --rm \ + --image bitnami/debian-base-buildpack:latest \ + --env KEY=$ENCRYPTION_KEY \ + -i \ + -q \ + -- \ + /bin/sh -c "openssl enc -aes-256-cbc -salt -pass env:KEY -a" > \ + $SECRETS_CIPHERTEXT_FILE + diff --git a/deployment/secrets.enc b/deployment/secrets.enc new file mode 100644 index 0000000..48a9a47 --- /dev/null +++ b/deployment/secrets.enc @@ -0,0 +1,2 @@ +U2FsdGVkX1/LnrdH8axG/l+8DFQawP7GD6v1M/N8pH5vpgb6ovuFoQUs7t19PE9j +ylG1pHC4crNb6UVjXX80OVCgGdtk/1+lizf6teDGNK30AbLIifMz392VKS78ASFD diff --git a/src/locsrv/.gitignore b/src/locsrv/.gitignore deleted file mode 100644 index e82f385..0000000 --- a/src/locsrv/.gitignore +++ /dev/null @@ -1 +0,0 @@ -locsrv diff --git a/src/locsrv/ENVDB.load b/src/locsrv/ENVDB.load new file mode 100644 index 0000000..8ddfcb0 --- /dev/null +++ b/src/locsrv/ENVDB.load @@ -0,0 +1,14 @@ +if [ "$1" = "" ]; then + echo "set namespace as argument" +fi +N=$1 +if [ "$2" = "" ]; then + echo "set instance as argument" +fi +I=$2 +PGHOST=`kubectl get services traefik -n system -o jsonpath="{.status.loadBalancer.ingress[0].ip}"` +PGPASSWORD=`kubectl get secrets $I-udi-db-cred -n $N -o jsonpath="{.data.PGPASSWORD}" | base64 --decode` +PGUSER=`kubectl get secrets $I-udi-db-cred -n $N -o jsonpath="{.data.PGUSER}" | base64 --decode` +PGSSLMODE=`kubectl get secrets $I-udi-db-cred -n $N -o jsonpath="{.data.PGSSLMODE}" | base64 --decode` +PGDATABASE=`kubectl get secrets $I-udi-db-cred -n $N -o jsonpath="{.data.PGDATABASE}" | base64 --decode` +export PGUSER PGHOST PGPASSWORD PGSSLMODE PGDATABASE diff --git a/src/locsrv/database/abstract_database.go b/src/locsrv/database/abstract_database.go new file mode 100644 index 0000000..bc07dde --- /dev/null +++ b/src/locsrv/database/abstract_database.go @@ -0,0 +1,11 @@ +package database + +import "gorm.io/gorm" + + +type Person struct { + gorm.Model + Id string `gorm:"not null"` + Name string `gorm:"not null"` +} + diff --git a/src/locsrv/database/database.go b/src/locsrv/database/database.go new file mode 100644 index 0000000..48f6d5f --- /dev/null +++ b/src/locsrv/database/database.go @@ -0,0 +1,52 @@ +package database + + +import ( + "log" + //"time" + "fmt" + "gorm.io/driver/postgres" + "gorm.io/gorm" +) + +type DatabaseHandle struct { + initialized bool + dbh *gorm.DB +} + +func New() *DatabaseHandle { + var db DatabaseHandle + // inject the whole database configuration via the well-known PG* env variables + conn, err := gorm.Open(postgres.Open("")) + if err != nil { + log.Printf("Unable to open database connection: %s", err) + db.initialized = false + } else { + db.dbh = conn + db.initialized = true + //log.Println("Database connection opened") + } + return &db +} + +func (self *DatabaseHandle) GetPersonById(id string) (string, error) { + if ! self.initialized { + err := fmt.Errorf("Database connection not initialized") + return "", err + } + + var person Person + result := self.dbh. + Where("persons.id = ?", id). + First(&person) + + if result.Error != nil { + err := fmt.Errorf("Query failed: %s", result.Error) + return "", err + } + + return person.Name, nil +} + + + diff --git a/src/locsrv/database/migrate_database.go b/src/locsrv/database/migrate_database.go new file mode 100644 index 0000000..3382b97 --- /dev/null +++ b/src/locsrv/database/migrate_database.go @@ -0,0 +1,19 @@ +package database + +import ( + "log" + //"time" + "gorm.io/driver/postgres" + "gorm.io/gorm" +) + +func Migrate() { + dsn := "" + db, err := gorm.Open(postgres.Open(dsn)) + if err != nil { + log.Fatalf("Unable to open database connection: %s", err) + } + + db.AutoMigrate(&Person{}) +} + diff --git a/src/locsrv/go.mod b/src/locsrv/go.mod index 5d2b928..833161b 100644 --- a/src/locsrv/go.mod +++ b/src/locsrv/go.mod @@ -2,7 +2,11 @@ module locsrv go 1.21.3 -require github.com/gin-gonic/gin v1.9.1 +require ( + github.com/gin-gonic/gin v1.9.1 + gorm.io/driver/postgres v1.5.4 + gorm.io/gorm v1.25.5 +) require ( github.com/bytedance/sonic v1.9.1 // indirect @@ -13,20 +17,27 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.14.0 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.4.3 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/kr/text v0.2.0 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.9.0 // indirect + golang.org/x/crypto v0.14.0 // indirect golang.org/x/net v0.10.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect + golang.org/x/sys v0.13.0 // indirect + golang.org/x/text v0.13.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/src/locsrv/go.sum b/src/locsrv/go.sum index 1a77fa1..92e6036 100644 --- a/src/locsrv/go.sum +++ b/src/locsrv/go.sum @@ -4,6 +4,7 @@ github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZX github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -27,11 +28,25 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= +github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= @@ -45,6 +60,8 @@ github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZ github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -63,24 +80,29 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k= golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.5.4 h1:Iyrp9Meh3GmbSuyIAGyjkN+n9K+GHX9b9MqsTL4EJCo= +gorm.io/driver/postgres v1.5.4/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= diff --git a/src/locsrv/migrate_schema.go b/src/locsrv/migrate_schema.go new file mode 100644 index 0000000..f6f7eee --- /dev/null +++ b/src/locsrv/migrate_schema.go @@ -0,0 +1,18 @@ +package main + +import "log" +import "locsrv/database" + + + +func main() { + log.SetPrefix("locsrv Migrate Schema: ") + log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) + + log.Println("Starting") + + database.Migrate() + + log.Println("Done") +} +