Parse SOCKS arguments and prefer over command line options

Parsing the Snowflake client options from SOCKS allow us to specify
snowflake client settings in the bridge lines.
This commit is contained in:
Cecylia Bocovich 2021-08-13 10:55:52 -04:00
parent 4acc08cc60
commit e762f58a31

View file

@ -10,6 +10,7 @@ import (
"os" "os"
"os/signal" "os/signal"
"path/filepath" "path/filepath"
"strconv"
"strings" "strings"
"sync" "sync"
"syscall" "syscall"
@ -44,7 +45,7 @@ func copyLoop(socks, sfconn io.ReadWriter) {
} }
// Accept local SOCKS connections and connect to a Snowflake connection // Accept local SOCKS connections and connect to a Snowflake connection
func socksAcceptLoop(ln *pt.SocksListener, transport *sf.Transport, shutdown chan struct{}, wg *sync.WaitGroup) { func socksAcceptLoop(ln *pt.SocksListener, config sf.ClientConfig, shutdown chan struct{}, wg *sync.WaitGroup) {
defer ln.Close() defer ln.Close()
for { for {
conn, err := ln.AcceptSocks() conn, err := ln.AcceptSocks()
@ -67,6 +68,30 @@ func socksAcceptLoop(ln *pt.SocksListener, transport *sf.Transport, shutdown cha
return return
} }
// Check to see if our command line options are overriden by SOCKS options
if arg, ok := conn.Req.Args.Get("ampcache"); ok {
config.AmpCacheURL = arg
}
if arg, ok := conn.Req.Args.Get("front"); ok {
config.FrontDomain = arg
}
if arg, ok := conn.Req.Args.Get("ice"); ok {
config.ICEAddresses = strings.Split(strings.TrimSpace(arg), ",")
}
if arg, ok := conn.Req.Args.Get("max"); ok {
max, err := strconv.Atoi(arg)
if err == nil {
config.Max = max
}
}
if arg, ok := conn.Req.Args.Get("url"); ok {
config.BrokerURL = arg
}
transport, err := sf.NewSnowflakeClient(config)
if err != nil {
log.Fatal("Failed to start snowflake transport: ", err)
}
handler := make(chan struct{}) handler := make(chan struct{})
go func() { go func() {
defer close(handler) defer close(handler)
@ -149,10 +174,6 @@ func main() {
KeepLocalAddresses: *keepLocalAddresses || *oldKeepLocalAddresses, KeepLocalAddresses: *keepLocalAddresses || *oldKeepLocalAddresses,
Max: *max, Max: *max,
} }
transport, err := sf.NewSnowflakeClient(config)
if err != nil {
log.Fatal("Failed to start snowflake transport: ", err)
}
// Begin goptlib client process. // Begin goptlib client process.
ptInfo, err := pt.ClientSetup(nil) ptInfo, err := pt.ClientSetup(nil)
@ -176,7 +197,7 @@ func main() {
break break
} }
log.Printf("Started SOCKS listener at %v.", ln.Addr()) log.Printf("Started SOCKS listener at %v.", ln.Addr())
go socksAcceptLoop(ln, transport, shutdown, &wg) go socksAcceptLoop(ln, config, shutdown, &wg)
pt.Cmethod(methodName, ln.Version(), ln.Addr()) pt.Cmethod(methodName, ln.Version(), ln.Addr())
listeners = append(listeners, ln) listeners = append(listeners, ln)
default: default: