Skip to content

Commit d80687f

Browse files
committed
Implement mysql and postgres auto setting detection
Use docker environment for automatic settings detection if settings are not supplied
1 parent ecf3f74 commit d80687f

7 files changed

+197
-10
lines changed

sync/database.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,15 @@ func (database *Database) GetType() string {
3030
}
3131

3232
func (database *Database) GetMysql() DatabaseMysql {
33-
return DatabaseMysql{*database}
33+
mysql := DatabaseMysql{*database}
34+
mysql.init()
35+
return mysql
3436
}
3537

3638
func (database *Database) GetPostgres() DatabasePostgres {
37-
return DatabasePostgres{*database}
39+
postgres := DatabasePostgres{*database}
40+
postgres.init()
41+
return postgres
3842
}
3943

4044
func (database *Database) String(direction string) string {

sync/database_mysql.go

Lines changed: 103 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,115 @@ import (
44
"fmt"
55
"strings"
66
"github.com/webdevops/go-shell"
7-
"github.com/webdevops/go-shell/commandbuilder"
87
)
98

109
type DatabaseMysql struct {
1110
Database
1211
}
1312

14-
func (database *DatabaseMysql) tableFilter(connection *commandbuilder.Connection, connectionType string) ([]string, []string) {
13+
func (database *DatabaseMysql) init() {
14+
// LOCAL
15+
if database.Local.Connection.Docker != "" {
16+
queryConn := database.Local.Connection.Clone()
17+
queryConn.Type = "auto"
18+
queryConn.Docker = ""
19+
20+
// docker auto hostname
21+
database.Local.Hostname = "127.0.0.1"
22+
23+
if database.Local.User == "" || database.Local.Schema == "" {
24+
containerId := queryConn.DockerGetContainerId(database.Local.Connection.Docker)
25+
containerEnv := queryConn.DockerGetEnvironment(containerId)
26+
27+
// try to guess user/password
28+
if database.Local.User == "" {
29+
if val, ok := containerEnv["MYSQL_ROOT_PASSWORD"]; ok {
30+
// get root pass from env
31+
if database.Local.User == "" && database.Local.Password == "" {
32+
fmt.Println(" -> local: using mysql root account (from MYSQL_ROOT_PASSWORD)")
33+
database.Local.User = "root"
34+
database.Local.Password = val
35+
}
36+
} else if val, ok := containerEnv["MYSQL_ALLOW_EMPTY_PASSWORD"]; ok {
37+
// get root without password from env
38+
if val == "yes" && database.Local.User == "" {
39+
fmt.Println(" -> local: using mysql root account (from MYSQL_ALLOW_EMPTY_PASSWORD)")
40+
database.Local.User = "root"
41+
database.Local.Password = ""
42+
}
43+
} else if user, ok := containerEnv["MYSQL_USER"]; ok {
44+
if pass, ok := containerEnv["MYSQL_PASSWORD"]; ok {
45+
if database.Local.User == "" && database.Local.Password == "" {
46+
fmt.Println(" -> local: using mysql user account (from MYSQL_USER and MYSQL_PASSWORD)")
47+
database.Local.User = user
48+
database.Local.Password = pass
49+
}
50+
}
51+
}
52+
}
53+
54+
// get schema from env
55+
if database.Local.Schema == "" {
56+
if val, ok := containerEnv["MYSQL_DATABASE"]; ok {
57+
fmt.Println(" -> local: using mysql schema (from MYSQL_DATABASE)")
58+
database.Local.Schema = val
59+
}
60+
}
61+
}
62+
}
63+
64+
// Remote
65+
if database.Connection.Docker != "" {
66+
queryConn := database.Connection.Clone()
67+
queryConn.Type = "auto"
68+
queryConn.Docker = ""
69+
70+
// docker auto hostname
71+
database.Hostname = "127.0.0.1"
72+
73+
if database.User == "" || database.Schema == "" {
74+
containerId := queryConn.DockerGetContainerId(database.Connection.Docker)
75+
containerEnv := queryConn.DockerGetEnvironment(containerId)
76+
77+
// try to guess user/password
78+
if database.User == "" {
79+
if val, ok := containerEnv["MYSQL_ROOT_PASSWORD"]; ok {
80+
// get root pass from env
81+
if database.User == "" && database.Password == "" {
82+
fmt.Println(" -> remote: using mysql root account (from MYSQL_ROOT_PASSWORD)")
83+
database.User = "root"
84+
database.Password = val
85+
}
86+
} else if val, ok := containerEnv["MYSQL_ALLOW_EMPTY_PASSWORD"]; ok {
87+
// get root without password from env
88+
if val == "yes" && database.User == "" {
89+
fmt.Println(" -> remote: using mysql root account (from MYSQL_ALLOW_EMPTY_PASSWORD)")
90+
database.User = "root"
91+
database.Password = ""
92+
}
93+
} else if user, ok := containerEnv["MYSQL_USER"]; ok {
94+
if pass, ok := containerEnv["MYSQL_PASSWORD"]; ok {
95+
if database.User == "" && database.Password == "" {
96+
fmt.Println(" -> remote: using mysql user account (from MYSQL_USER and MYSQL_PASSWORD)")
97+
database.User = user
98+
database.Password = pass
99+
}
100+
}
101+
}
102+
}
103+
104+
// get schema from env
105+
if database.Schema == "" {
106+
if val, ok := containerEnv["MYSQL_DATABASE"]; ok {
107+
fmt.Println(" -> remote: using mysql schema (from MYSQL_DATABASE)")
108+
database.Schema = val
109+
}
110+
}
111+
}
112+
}
113+
}
114+
115+
func (database *DatabaseMysql) tableFilter(connectionType string) ([]string, []string) {
15116
var exclude []string
16117
var include []string
17118

sync/database_mysql_local.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func (database *DatabaseMysql) localMysqldumpCmdBuilder(additionalArgs []string,
2727
}
2828

2929
// exclude
30-
excludeArgs, includeArgs := database.tableFilter(&database.Local.Connection, "local");
30+
excludeArgs, includeArgs := database.tableFilter("local");
3131
if useFilter && len(excludeArgs) > 0 {
3232
args = append(args, excludeArgs...)
3333
}

sync/database_mysql_remote.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func (database *DatabaseMysql) remoteMysqldumpCmdBuilder(additionalArgs []string
3030
}
3131

3232
// exclude
33-
excludeArgs, includeArgs := database.tableFilter(&database.Connection, "remote");
33+
excludeArgs, includeArgs := database.tableFilter("remote");
3434
if useFilter && len(excludeArgs) > 0 {
3535
args = append(args, excludeArgs...)
3636
}

sync/database_postgres.go

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,96 @@ import (
44
"fmt"
55
"strings"
66
"github.com/webdevops/go-shell"
7-
"github.com/webdevops/go-shell/commandbuilder"
87
)
98

109
type DatabasePostgres struct {
1110
Database
1211
}
1312

14-
func (database *DatabasePostgres) tableFilter(connection *commandbuilder.Connection, connectionType string) ([]string, []string) {
13+
14+
func (database *DatabasePostgres) init() {
15+
// LOCAL
16+
if database.Local.Connection.Docker != "" {
17+
queryConn := database.Local.Connection.Clone()
18+
queryConn.Type = "auto"
19+
queryConn.Docker = ""
20+
21+
// docker auto hostname
22+
database.Local.Hostname = "127.0.0.1"
23+
24+
if database.Local.User == "" || database.Local.Schema == "" {
25+
containerId := queryConn.DockerGetContainerId(database.Local.Connection.Docker)
26+
containerEnv := queryConn.DockerGetEnvironment(containerId)
27+
28+
// try to guess user/password
29+
if database.Local.User == "" {
30+
// get superuser pass from env
31+
if pass, ok := containerEnv["POSTGRES_PASSWORD"]; ok {
32+
if user, ok := containerEnv["POSTGRES_USER"]; ok {
33+
fmt.Println(" -> local: using postgres superadmin account (from POSTGRES_USER and POSTGRES_PASSWORD)")
34+
database.Local.User = user
35+
database.Local.Password = pass
36+
} else {
37+
fmt.Println(" -> local: using postgres superadmin account (from POSTGRES_PASSWORD)")
38+
// only password available
39+
database.Local.User = "postgres"
40+
database.Local.Password = pass
41+
}
42+
}
43+
}
44+
45+
// get schema from env
46+
if database.Local.Schema == "" {
47+
if val, ok := containerEnv["POSTGRES_DB"]; ok {
48+
fmt.Println(" -> local: using postgres schema (from POSTGRES_DB)")
49+
database.Local.Schema = val
50+
}
51+
}
52+
}
53+
}
54+
55+
// Remote
56+
if database.Connection.Docker != "" {
57+
queryConn := database.Connection.Clone()
58+
queryConn.Type = "auto"
59+
queryConn.Docker = ""
60+
61+
// docker auto hostname
62+
database.Hostname = "127.0.0.1"
63+
64+
if database.User == "" || database.Schema == "" {
65+
containerId := queryConn.DockerGetContainerId(database.Connection.Docker)
66+
containerEnv := queryConn.DockerGetEnvironment(containerId)
67+
68+
// try to guess user/password
69+
if database.User == "" {
70+
// get superuser pass from env
71+
if pass, ok := containerEnv["POSTGRES_PASSWORD"]; ok {
72+
if user, ok := containerEnv["POSTGRES_USER"]; ok {
73+
fmt.Println(" -> remote: using postgres superadmin account (from POSTGRES_USER and POSTGRES_PASSWORD)")
74+
database.User = user
75+
database.Password = pass
76+
} else {
77+
fmt.Println(" -> remote: using postgres superadmin account (from POSTGRES_PASSWORD)")
78+
// only password available
79+
database.User = "postgres"
80+
database.Password = pass
81+
}
82+
}
83+
}
84+
85+
// get schema from env
86+
if database.Schema == "" {
87+
if val, ok := containerEnv["POSTGRES_DB"]; ok {
88+
fmt.Println(" -> remote: using postgres schema (from POSTGRES_DB)")
89+
database.Schema = val
90+
}
91+
}
92+
}
93+
}
94+
}
95+
96+
func (database *DatabasePostgres) tableFilter(connectionType string) ([]string, []string) {
1597
var exclude []string
1698
var include []string
1799

sync/database_postgres_local.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func (database *DatabasePostgres) localPgdumpCmdBuilder(additionalArgs []string,
2727
}
2828

2929
// exclude
30-
excludeArgs, includeArgs := database.tableFilter(&database.Local.Connection, "local");
30+
excludeArgs, includeArgs := database.tableFilter("local");
3131
if useFilter && len(excludeArgs) > 0 {
3232
args = append(args, excludeArgs...)
3333
}

sync/database_postgres_remote.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func (database *DatabasePostgres) remotePgdumpCmdBuilder(additionalArgs []string
3030
}
3131

3232
// exclude
33-
excludeArgs, includeArgs := database.tableFilter(&database.Connection, "remote")
33+
excludeArgs, includeArgs := database.tableFilter("remote")
3434
if useFilter && len(excludeArgs) > 0 {
3535
args = append(args, excludeArgs...)
3636
}

0 commit comments

Comments
 (0)