44 "database/sql"
55 "fmt"
66 "net"
7+ "net/url"
8+ "regexp"
79 "strings"
810 "time"
911
@@ -53,6 +55,12 @@ func Provider() terraform.ResourceProvider {
5355 DefaultFunc : schema .EnvDefaultFunc ("MYSQL_PASSWORD" , nil ),
5456 },
5557
58+ "proxy" : {
59+ Type : schema .TypeString ,
60+ Optional : true ,
61+ ValidateFunc : validation .StringMatch (regexp .MustCompile ("^socks5h?://.*:\\ d+$" ), "The proxy URL is not a valid socks url." ),
62+ },
63+
5664 "tls" : {
5765 Type : schema .TypeString ,
5866 Optional : true ,
@@ -105,7 +113,11 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
105113 AllowNativePasswords : true ,
106114 }
107115
108- dialer := proxy .FromEnvironment ()
116+ dialer , err := getDialerFromArgOrFromEnv (d )
117+ if err != nil {
118+ return nil , err
119+ }
120+
109121 mysql .RegisterDial ("tcp" , func (network string ) (net.Conn , error ) {
110122 return dialer .Dial ("tcp" , network )
111123 })
@@ -119,6 +131,26 @@ func providerConfigure(d *schema.ResourceData) (interface{}, error) {
119131
120132var identQuoteReplacer = strings .NewReplacer ("`" , "``" )
121133
134+ func getDialerFromArgOrFromEnv (d * schema.ResourceData ) (proxy.Dialer , error ) {
135+ proxyFromEnv := proxy .FromEnvironment ()
136+ proxyArg := d .Get ("proxy" ).(string )
137+
138+ if len (proxyArg ) > 0 {
139+ proxyURL , err := url .Parse (proxyArg )
140+ if err != nil {
141+ return nil , err
142+ }
143+ proxy , err := proxy .FromURL (proxyURL , proxyFromEnv )
144+ if err != nil {
145+ return nil , err
146+ }
147+
148+ return proxy , nil
149+ }
150+
151+ return proxyFromEnv , nil
152+ }
153+
122154func quoteIdentifier (in string ) string {
123155 return fmt .Sprintf ("`%s`" , identQuoteReplacer .Replace (in ))
124156}
0 commit comments