summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Examples/OptimizerConfig.json21
-rw-r--r--Examples/obfs4Config.json4
-rw-r--r--Examples/shadowConfig.json4
-rw-r--r--common/pt_extras/pt_extras.go108
-rw-r--r--modes/pt_socks5/pt_socks5.go40
-rw-r--r--modes/stun_udp/stun_udp.go23
-rw-r--r--modes/transparent_tcp/transparent_tcp.go37
-rw-r--r--modes/transparent_udp/transparent_udp.go21
-rw-r--r--shapeshifter-dispatcher/shapeshifter-dispatcher.go5
-rw-r--r--state/dispatcher.log166
-rw-r--r--transports/transports.go306
11 files changed, 614 insertions, 121 deletions
diff --git a/Examples/OptimizerConfig.json b/Examples/OptimizerConfig.json
new file mode 100644
index 0000000..2634491
--- /dev/null
+++ b/Examples/OptimizerConfig.json
@@ -0,0 +1,21 @@
+{
+ "strategy": "first",
+ "transports": [
+ {
+ "name": "shadow",
+ "address": "127.0.0.1:1234",
+ "config": {
+ "password": "orange",
+ "cipherName": "aes-128-ctr"
+ }
+ },
+ {
+ "name": "obfs4",
+ "address": "77.81.104.251:443",
+ "config": {
+ "cert": "a1cc6eI5H+1kTzXhbuwMR9w3ZkLeZuReniier8DYSlAg4ed9yTbnyDiWc1vF1WFWKFRYHQ",
+ "iatMode": "0"
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/Examples/obfs4Config.json b/Examples/obfs4Config.json
new file mode 100644
index 0000000..4138172
--- /dev/null
+++ b/Examples/obfs4Config.json
@@ -0,0 +1,4 @@
+{
+ "cert": "a1cc6eI5H+1kTzXhbuwMR9w3ZkLeZuReniier8DYSlAg4ed9yTbnyDiWc1vF1WFWKFRYHQ",
+ "iatMode": "0"
+} \ No newline at end of file
diff --git a/Examples/shadowConfig.json b/Examples/shadowConfig.json
new file mode 100644
index 0000000..9a9862b
--- /dev/null
+++ b/Examples/shadowConfig.json
@@ -0,0 +1,4 @@
+{
+ "password": "orange",
+ "cipherName": "aes-128-ctr"
+} \ No newline at end of file
diff --git a/common/pt_extras/pt_extras.go b/common/pt_extras/pt_extras.go
index 3e865bf..a41f4f7 100644
--- a/common/pt_extras/pt_extras.go
+++ b/common/pt_extras/pt_extras.go
@@ -31,9 +31,8 @@ import (
"errors"
"fmt"
"github.com/OperatorFoundation/shapeshifter-dispatcher/common/log"
+ "github.com/OperatorFoundation/shapeshifter-dispatcher/transports"
"github.com/OperatorFoundation/shapeshifter-transports/transports/Optimizer"
- "github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4"
- "github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"net"
"net/url"
"os"
@@ -76,7 +75,7 @@ func PtIsClient() (bool, error) {
}
func PtGetProxy(proxy *string) (*url.URL, error) {
- var specString string
+ var specString string
if proxy != nil {
specString = *proxy
@@ -175,83 +174,64 @@ func PtShouldExitOnStdinClose() bool {
return os.Getenv("TOR_PT_EXIT_ON_STDIN_CLOSE") == "1"
}
-func ArgsToDialer(target string, name string, args pt.Args) (Optimizer.Transport, error) {
+func ArgsToDialer(target string, name string, args map[string]interface{}) (Optimizer.Transport, error) {
switch name {
//case "obfs2":
// transport := obfs2.NewObfs2Transport()
// dialer = transport.Dial
// return dialer, nil
case "obfs4":
- if cert, ok := args["cert"]; ok {
- if iatModeStr, ok2 := args["iatMode"]; ok2 {
- iatMode, err := strconv.Atoi(iatModeStr[0])
- if err == nil {
- transport := obfs4.Transport{
- CertString: cert[0],
- IatMode: iatMode,
- Address: target,
- }
- return transport, nil
- } else {
- log.Errorf("obfs4 transport bad iatMode value: %s %s", iatModeStr[0], err)
- return nil, errors.New("obfs4 transport bad iatMode value")
- }
- } else {
- log.Errorf("obfs4 transport missing iatMode argument: %s", args)
- return nil, errors.New("obfs4 transport missing iatMode argument")
- }
+ //refactor starts here
+ transport, err := transports.ParseArgsObfs4(args, target)
+ if err != nil {
+ log.Errorf("Could not parse options %s", err.Error())
+ return nil, err
} else {
- log.Errorf("obfs4 transport missing cert argument: %s", args)
- return nil, errors.New("obfs4 transport missing cert argument")
+ return transport, nil
}
case "shadow":
- if password, ok := args["password"]; ok {
- if cipher, ok2 := args["cipherName"]; ok2 {
- transport := shadow.Transport{
- Password: password[0],
- CipherName: cipher[0],
- Address: target,
- }
- return transport, nil
- } else {
- log.Errorf("shadow transport missing cipher argument: %s", args)
- return nil, errors.New("shadow transport missing cipher argument")
- }
+ transport, err := transports.ParseArgsShadow(args, target)
+ if err != nil {
+ log.Errorf("Could not parse options %s", err.Error())
+ return nil, err
} else {
- log.Errorf("shadow transport missing password argument: %s", args)
- return nil, errors.New("shadow transport missing password argument")
+ return transport, nil
}
case "Optimizer":
- //replace underscore with ArgsToDialer
- if _, ok := args["transports"]; ok {
- if strategyName, ok2 := args["strategy"]; ok2 {
- var strategy Optimizer.Strategy = nil
- switch strategyName[0] {
- case "first":
- strategy = Optimizer.NewFirstStrategy()
- case "random":
- strategy = Optimizer.NewRandomStrategy()
- case "rotate":
- strategy = Optimizer.NewRotateStrategy()
- case "track":
- strategy = Optimizer.NewTrackStrategy()
- case "min":
- strategy = Optimizer.NewMinimizeDialDuration()
- }
- transports := []Optimizer.Transport{}
- transport := Optimizer.NewOptimizerClient(transports, strategy)
- return transport, nil
- } else {
- log.Errorf("Optimizer transport missing transports argument: %s", args)
- return nil, errors.New("optimizer transport missing transports argument")
- }
+ transport, err := transports.ParseArgsOptimizer(args)
+ if err != nil {
+ log.Errorf("Could not parse options %s", err.Error())
+ return nil, err
+ } else {
+ return transport, nil
+ }
+ case "Dust":
+ transport, err := transports.ParseArgsDust(args, target)
+ if err != nil {
+ log.Errorf("Could not parse options %s", err.Error())
+ return nil, err
} else {
- log.Errorf("Optimizer transport missing strategy argument: %s", args)
- return nil, errors.New("optimizer transport missing strategy argument")
+ return transport, nil
+ }
+ case "Meeklite":
+ transport, err := transports.ParseArgsMeeklite(args, target)
+ if err != nil {
+ log.Errorf("Could not parse options %s", err.Error())
+ return nil, err
+ } else {
+ return transport, nil
+ }
+ case "Replicant":
+ transport, err := transports.ParseArgsReplicant(args, target)
+ if err != nil {
+ log.Errorf("Could not parse options %s", err.Error())
+ return nil, err
+ } else {
+ return transport, nil
}
default:
log.Errorf("Unknown transport: %s", name)
return nil, errors.New("unknown transport")
}
-} \ No newline at end of file
+}
diff --git a/modes/pt_socks5/pt_socks5.go b/modes/pt_socks5/pt_socks5.go
index dfd7359..59c4a7c 100644
--- a/modes/pt_socks5/pt_socks5.go
+++ b/modes/pt_socks5/pt_socks5.go
@@ -30,8 +30,11 @@
package pt_socks5
import (
+ "fmt"
+ options2 "github.com/OperatorFoundation/shapeshifter-dispatcher/common"
"github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras"
"github.com/OperatorFoundation/shapeshifter-transports/transports/Dust"
+ replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant"
"github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite"
"github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"io"
@@ -101,14 +104,20 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, con
}
addrStr := log.ElideAddr(socksReq.Target)
- var args pt.Args
- if needOptions {
- args = socksReq.Args
- } else {
- args, err = pt.ParsePT2ClientParameters(options)
- if err != nil {
- return
- }
+ //var args pt.Args
+ //if needOptions {
+ // args = socksReq.Args
+ //} else {
+ // args, err = pt.ParsePT2ClientParameters(options)
+ // if err != nil {
+ // return
+ // }
+ //}
+
+ args, argsErr := options2.ParseOptions(options)
+ if argsErr != nil {
+ log.Errorf("Error parsing transport options: %s", options)
+ return
}
var dialer func() (net.Conn, error)
@@ -192,13 +201,14 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
log.Errorf("obfs4 transport missing cert argument: %s", args)
return
}
- //case "replicant":
- // config, ok :=args.Get("config")
- // if !ok {
- // return false, nil
- // }
- // transport := replicant.New(config)
- // listen = transport.Listen
+ case "replicant":
+ config, ok :=args.Get("config")
+ fmt.Println(config)
+ if !ok {
+ return false, nil
+ }
+ transport := replicant.New(replicant.Config{})
+ listen = transport.Listen
case "Dust":
idPath, ok :=args.Get("idPath")
if !ok {
diff --git a/modes/stun_udp/stun_udp.go b/modes/stun_udp/stun_udp.go
index f12e69e..70d5565 100644
--- a/modes/stun_udp/stun_udp.go
+++ b/modes/stun_udp/stun_udp.go
@@ -31,8 +31,10 @@ package stun_udp
import (
"fmt"
+ options2 "github.com/OperatorFoundation/shapeshifter-dispatcher/common"
"github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras"
"github.com/OperatorFoundation/shapeshifter-transports/transports/Dust"
+ replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant"
"github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite"
"github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"io"
@@ -166,7 +168,7 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt
fmt.Println("Dialing....")
- args, argsErr := pt.ParsePT2ClientParameters(options)
+ args, argsErr := options2.ParseOptions(options)
if argsErr != nil {
log.Errorf("Error parsing transport options: %s", options)
return
@@ -243,14 +245,15 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
log.Errorf("meeklite transport missing Front argument: %s", args)
return
}
- //case "replicant":
- // if config, ok := args["config"]; ok {
- // transport := replicant.New(config[0])
- // listen = transport.Listen
- // } else {
- // log.Errorf("replicant transport missing config argument: %s", args)
- // return
- // }
+ case "replicant":
+ if config, ok := args["config"]; ok {
+ fmt.Println(config)
+ transport := replicant.New(replicant.Config{})
+ listen = transport.Listen
+ } else {
+ log.Errorf("replicant transport missing config argument: %s", args)
+ return
+ }
case "Dust":
if idPath, ok := args["idPath"]; ok {
transport := Dust.NewDustServer(idPath[0])
@@ -434,4 +437,4 @@ func serverHandler(termMon *termmon.TermMonitor, name string, remote net.Conn, i
dest.Write(writeBuffer)
}
-}
+} \ No newline at end of file
diff --git a/modes/transparent_tcp/transparent_tcp.go b/modes/transparent_tcp/transparent_tcp.go
index 9f9fc18..51ec43b 100644
--- a/modes/transparent_tcp/transparent_tcp.go
+++ b/modes/transparent_tcp/transparent_tcp.go
@@ -30,8 +30,12 @@
package transparent_tcp
import (
+ options2 "github.com/OperatorFoundation/shapeshifter-dispatcher/common"
+
"github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras"
+ "github.com/OperatorFoundation/shapeshifter-dispatcher/transports"
"github.com/OperatorFoundation/shapeshifter-transports/transports/Dust"
+ replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant"
"github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite"
"github.com/OperatorFoundation/shapeshifter-transports/transports/obfs2"
"io"
@@ -92,8 +96,8 @@ func clientHandler(target string, termMon *termmon.TermMonitor, name string, opt
defer termMon.OnHandlerFinish()
var dialer func() (net.Conn, error)
-
- args, argsErr := pt.ParsePT2ClientParameters(options)
+//this is where the refactoring begins
+ args, argsErr := options2.ParseOptions(options)
if argsErr != nil {
log.Errorf("Error parsing transport options: %s", options)
return
@@ -163,18 +167,22 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
case "obfs4":
transport := obfs4.NewObfs4Server(statedir)
listen = transport.Listen
- //case "Replicant":
- // shargs, aok := args["Replicant"]
- // if !aok {
- // return false, nil
- // }
- //
- // config, ok := shargs.Get("config")
- // if !ok {
- // return false, nil
- // }
- // transport := replicant.New(config)
- // listen = transport.Listen
+ case "Replicant":
+ shargs, aok := args["Replicant"]
+ if !aok {
+ return false, nil
+ }
+
+ configString, ok := shargs.Get("config")
+ if !ok {
+ return false, nil
+ }
+ config, err := transports.ParseReplicantConfig(configString)
+ if err != nil {
+ return false, nil
+ }
+ transport := replicant.New(config)
+ listen = transport.Listen
case "Dust":
shargs, aok := args["Dust"]
if !aok {
@@ -335,3 +343,4 @@ func copyLoop(a net.Conn, b net.Conn) error {
return nil
}
+
diff --git a/modes/transparent_udp/transparent_udp.go b/modes/transparent_udp/transparent_udp.go
index 62d0689..eade8c8 100644
--- a/modes/transparent_udp/transparent_udp.go
+++ b/modes/transparent_udp/transparent_udp.go
@@ -33,8 +33,10 @@ import (
"bytes"
"encoding/binary"
"fmt"
+ options2 "github.com/OperatorFoundation/shapeshifter-dispatcher/common"
"github.com/OperatorFoundation/shapeshifter-dispatcher/common/pt_extras"
"github.com/OperatorFoundation/shapeshifter-transports/transports/Dust"
+ replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant"
"github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite"
"github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"io"
@@ -179,7 +181,7 @@ func dialConn(tracker *ConnTracker, addr string, target string, name string, opt
fmt.Println("Dialing....")
- args, argsErr := pt.ParsePT2ClientParameters(options)
+ args, argsErr := options2.ParseOptions(options)
if argsErr != nil {
log.Errorf("Error parsing transport options: %s", options)
return
@@ -242,14 +244,15 @@ func ServerSetup(termMon *termmon.TermMonitor, bindaddrString string, ptServerIn
log.Errorf("obfs4 transport missing cert argument: %s", args)
return
}
- //case "Replicant":
- // Config, ok := args.Get("config")
- // if !ok {
- // return false, nil
- // }
- //
- // transport := replicant.New(Config)
- // listen = transport.Listen
+ case "Replicant":
+ config, ok := args.Get("config")
+ fmt.Println(config)
+ if !ok {
+ return false, nil
+ }
+
+ transport := replicant.New(replicant.Config{})
+ listen = transport.Listen
case "Dust":
idPath, ok := args.Get("idPath")
if !ok {
diff --git a/shapeshifter-dispatcher/shapeshifter-dispatcher.go b/shapeshifter-dispatcher/shapeshifter-dispatcher.go
index 72f2efb..d7f49e4 100644
--- a/shapeshifter-dispatcher/shapeshifter-dispatcher.go
+++ b/shapeshifter-dispatcher/shapeshifter-dispatcher.go
@@ -103,7 +103,7 @@ func main() {
// Experimental flags under consideration for PT 2.1
socksAddr := flag.String("proxylistenaddr", "127.0.0.1:0", "Specify the bind address for the local SOCKS server provided by the client")
optionsFile := flag.String("optionsFile", "", "store all the options in a single file")
-
+ fmt.Println("checking for optionsFile")
// Additional command line flags inherited from obfs4proxy
showVer := flag.Bool("version", false, "Print version and exit")
logLevelStr := flag.String("logLevel", "ERROR", "Log level (ERROR/WARN/INFO/DEBUG)")
@@ -152,7 +152,8 @@ func main() {
if *optionsFile != "" {
_, err := os.Stat(*optionsFile)
if err != nil {
- log.Errorf("optionsFile does not exist %s", *optionsFile)
+ log.Errorf("optionsFile does not exist with error %s %s", *optionsFile, err.Error())
+ log.Errorf("optionsFile does not exist %s", *optionsFile, err.Error())
} else {
contents, readErr := ioutil.ReadFile(*optionsFile)
if readErr != nil {
diff --git a/state/dispatcher.log b/state/dispatcher.log
index 9e869ae..ff272da 100644
--- a/state/dispatcher.log
+++ b/state/dispatcher.log
@@ -104,3 +104,169 @@
2019/08/28 22:50:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
2019/08/28 22:50:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
2019/08/28 22:50:27 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use
+2019/09/03 19:33:32 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 19:33:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 19:33:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 19:33:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/09/03 19:33:32 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use
+2019/09/03 19:34:35 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 19:34:35 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 19:34:35 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 19:34:35 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/09/03 19:34:35 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use
+2019/09/03 19:35:19 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 19:35:19 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 19:35:19 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 19:35:19 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/09/03 19:35:19 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use
+2019/09/03 19:36:38 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 19:36:38 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 19:36:38 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 19:36:38 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing client transport listeners
+2019/09/03 19:36:38 [ERROR]: failed to listen obfs4 listen tcp 127.0.0.1:1443: bind: address already in use
+2019/09/03 20:23:06 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:23:06 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:23:06 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:23:06 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:26:33 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:26:39 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:26:43 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:26:45 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:27:23 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:27:30 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:27:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:27:44 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:31:16 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:31:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:31:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:31:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:31:20 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:31:27 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:31:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:31:30 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:31:57 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:31:59 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:32:02 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:32:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:33:28 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:33:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:33:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:33:28 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:34:29 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:34:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:34:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:34:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:34:41 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:34:41 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:34:41 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:34:41 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:34:54 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:34:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:34:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:34:54 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:35:08 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:35:12 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:35:14 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:35:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:38:39 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:38:43 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:38:44 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:38:45 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:40:24 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:40:24 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:40:24 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:40:24 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:41:36 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:41:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:41:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:41:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:51:16 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 20:51:16 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 20:51:16 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:51:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:51:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:51:16 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:51:21 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 20:51:21 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 20:51:21 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:51:21 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:51:21 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:51:21 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:52:37 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 20:52:37 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 20:52:37 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:52:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:52:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:52:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:53:37 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 20:53:37 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 20:53:37 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:53:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:53:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:53:37 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:55:48 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 20:55:48 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 20:55:48 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:55:48 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:55:48 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:55:48 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:57:36 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 20:57:36 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 20:57:36 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:57:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:57:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:57:36 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:57:58 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 20:57:58 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 20:57:58 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:57:58 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:57:58 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:57:58 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 20:58:05 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 20:58:05 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 20:58:05 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 20:58:05 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 20:58:05 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 20:58:05 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 21:00:46 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 21:00:46 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 21:00:46 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 21:00:46 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 21:00:46 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 21:00:46 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 21:01:29 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 21:01:29 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 21:01:29 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 21:01:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 21:01:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 21:01:29 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 21:02:15 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 21:02:15 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 21:02:15 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 21:02:15 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 21:02:15 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 21:02:15 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 21:02:32 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 21:02:32 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 21:02:32 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 21:02:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 21:02:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 21:02:32 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 21:03:03 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 21:03:03 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 21:03:03 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 21:03:03 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 21:03:03 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 21:03:03 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 21:03:18 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 21:03:18 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 21:03:18 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 21:03:18 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 21:03:18 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 21:03:18 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
+2019/09/03 21:04:04 [ERROR]: optionsFile does not exist with error shadowserver.json stat shadowserver.json: no such file or directory
+2019/09/03 21:04:04 [ERROR]: optionsFile does not exist shadowserver.json%!(EXTRA string=stat shadowserver.json: no such file or directory)
+2019/09/03 21:04:04 [NOTICE]: dispatcher-0.0.7-dev - launched
+2019/09/03 21:04:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing transparent proxy
+2019/09/03 21:04:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing TCP transparent proxy
+2019/09/03 21:04:04 [INFO]: ___go_build_github_com_OperatorFoundation_shapeshifter_dispatcher_shapeshifter_dispatcher - initializing server transport listeners
diff --git a/transports/transports.go b/transports/transports.go
index df05d33..4ca49eb 100644
--- a/transports/transports.go
+++ b/transports/transports.go
@@ -31,9 +31,15 @@ package transports
import (
"errors"
+ "fmt"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/Dust"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/Optimizer"
+ replicant "github.com/OperatorFoundation/shapeshifter-transports/transports/Replicant"
+ "github.com/OperatorFoundation/shapeshifter-transports/transports/meeklite"
"github.com/OperatorFoundation/shapeshifter-transports/transports/obfs4"
"github.com/OperatorFoundation/shapeshifter-transports/transports/shadow"
"github.com/mufti1/interconv/package"
+ gourl "net/url"
"strconv"
)
@@ -59,7 +65,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor
return nil, icerr
}
default:
- return nil, errors.New("Unsupported type for obfs4 cert option")
+ return nil, errors.New("unsupported type for obfs4 cert option")
}
untypedIatMode, ok2 := args["iatMode"]
@@ -83,7 +89,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor
case 1:
iatMode = iatModeInt
default:
- return nil, errors.New("Unsupported value for obfs4 iatMode option")
+ return nil, errors.New("unsupported value for obfs4 iatMode option")
}
case float64:
iatModeFloat, icerr := interconv.ParseFloat64(untypedIatMode)
@@ -97,7 +103,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor
case 1:
iatMode = iatModeInt
default:
- return nil, errors.New("Unsupported value for obfs4 iatMode option")
+ return nil, errors.New("unsupported value for obfs4 iatMode option")
}
case int:
iatModeInt, icerr := interconv.ParseInt(untypedIatMode)
@@ -110,7 +116,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor
case 1:
iatMode = iatModeInt
default:
- return nil, errors.New("Unsupported value for obfs4 iatMode option")
+ return nil, errors.New("unsupported value for obfs4 iatMode option")
}
case bool:
iatModeBool, icerr := interconv.ParseBoolean(untypedCert)
@@ -124,7 +130,7 @@ func ParseArgsObfs4(args map[string]interface{}, target string) (*obfs4.Transpor
iatMode = 0
}
default:
- return nil, errors.New("Unsupported type for obfs4 iatMode option")
+ return nil, errors.New("unsupported type for obfs4 iatMode option")
}
transport := obfs4.Transport{
@@ -153,7 +159,7 @@ func ParseArgsShadow(args map[string]interface{}, target string) (*shadow.Transp
return nil, icerr
}
default:
- return nil, errors.New("Unsupported type for shadow password option")
+ return nil, errors.New("unsupported type for shadow password option")
}
untypedCipherName, ok2 := args["cipherName"]
@@ -169,7 +175,7 @@ func ParseArgsShadow(args map[string]interface{}, target string) (*shadow.Transp
return nil, icerr
}
default:
- return nil, errors.New("Unsupported type for shadow cipherName option")
+ return nil, errors.New("unsupported type for shadow cipherName option")
}
transport := shadow.Transport{
@@ -180,3 +186,289 @@ func ParseArgsShadow(args map[string]interface{}, target string) (*shadow.Transp
return &transport, nil
}
+
+func ParseArgsDust(args map[string]interface{}, target string) (*Dust.Transport, error) {
+ var serverPublic string
+
+ untypedServerPublic, ok := args["serverPublic"]
+ if !ok {
+ return nil, errors.New("dust transport missing serverpublic argument")
+ }
+
+ switch untypedServerPublic.(type) {
+ case string:
+ var icerr error
+ serverPublic, icerr = interconv.ParseString(untypedServerPublic)
+ if icerr != nil {
+ return nil, icerr
+ }
+ default:
+ return nil, errors.New("unsupported type for dust serverpublic option")
+ }
+
+ transport := Dust.Transport{
+ ServerPublic: serverPublic,
+ Address: target,
+ }
+
+ return &transport, nil
+}
+
+func ParseArgsReplicant(args map[string]interface{}, target string) (*replicant.Transport, error) {
+ var conf string
+ fmt.Println(conf)
+ untypedConfig, ok := args["config"]
+ if !ok {
+ return nil, errors.New("replicant transport missing config argument")
+ }
+
+ switch untypedConfig.(type) {
+ case string:
+ var icerr error
+ conf, icerr = interconv.ParseString(untypedConfig)
+ if icerr != nil {
+ return nil, icerr
+ }
+ default:
+ return nil, errors.New("unsupported type for replicant config option")
+ }
+
+ transport := replicant.Transport{
+ Config: replicant.Config{},
+ Address: target,
+ }
+
+ return &transport, nil
+}
+
+func ParseArgsMeeklite(args map[string]interface{}, target string) (*meeklite.Transport, error) {
+
+ var url *gourl.URL
+ var front string
+
+ untypedUrl, ok := args["url"]
+ if !ok {
+ return nil, errors.New("meeklite transport missing url argument")
+ }
+
+ switch untypedUrl.(type) {
+ case string:
+
+ urlString, icerr := interconv.ParseString(untypedUrl)
+ if icerr != nil {
+ return nil, icerr
+ }
+ var parseErr error
+ url, parseErr = gourl.Parse(urlString)
+ if parseErr != nil {
+ return nil, errors.New("could not parse URL")
+ }
+
+ default:
+ return nil, errors.New("unsupported type for meeklite url option")
+ }
+
+ untypedFront, ok2 := args["front"]
+ if !ok2 {
+ return nil, errors.New("meeklite transport missing front argument")
+ }
+
+ switch untypedFront.(type) {
+ case string:
+ var icerr error
+ front, icerr = interconv.ParseString(untypedFront)
+ if icerr != nil {
+ return nil, icerr
+ }
+ default:
+ return nil, errors.New("unsupported type for meeklite front option")
+ }
+
+ transport := meeklite.Transport{
+ Url: url,
+ Front: front,
+ Address: target,
+ }
+
+ return &transport, nil
+}
+
+func ParseArgsOptimizer(args map[string]interface{}) (*Optimizer.OptimizerTransport, error) {
+ var transports []Optimizer.Transport
+ var strategy Optimizer.Strategy
+
+ untypedTransports, ok := args["transports"]
+ if !ok {
+ return nil, errors.New("optimizer transport missing transports argument")
+ }
+
+ switch untypedTransports.(type) {
+ case []map[string]interface{}:
+ otcs := untypedTransports.([]map[string]interface{})
+
+ var parseErr error
+ transports, parseErr = parseTransports(otcs)
+ if parseErr != nil {
+ return nil, errors.New("could not parse transports")
+ }
+ default:
+ return nil, errors.New("unsupported type for Optimizer transports option")
+ }
+
+ untypedStrategy, ok2 := args["strategy"]
+ if !ok2 {
+ return nil, errors.New("optimizer transport missing strategy argument")
+ }
+
+ switch untypedStrategy.(type) {
+ case string:
+ strategyString, icerr := interconv.ParseString(untypedStrategy)
+ if icerr != nil {
+ return nil, icerr
+ }
+ var parseErr error
+ strategy, parseErr = parseStrategy(strategyString, transports)
+ if parseErr != nil {
+ return nil, errors.New("could not parse strategy")
+ }
+ default:
+ return nil, errors.New("unsupported type for optimizer strategy option")
+ }
+
+ transport := Optimizer.OptimizerTransport{
+ Transports: transports,
+ Strategy: strategy,
+ }
+
+ return &transport, nil
+}
+
+func parseStrategy(strategyString string, transports []Optimizer.Transport) (Optimizer.Strategy, error) {
+ switch strategyString {
+ case "first":
+ strategy := Optimizer.NewFirstStrategy(transports)
+ return strategy, nil
+ case "random":
+ strategy := Optimizer.NewRandomStrategy(transports)
+ return strategy, nil
+ case "rotate":
+ strategy := Optimizer.NewRotateStrategy(transports)
+ return strategy, nil
+ case "track":
+ return Optimizer.NewTrackStrategy(transports), nil
+ case "minimizeDialDuration":
+ return Optimizer.NewMinimizeDialDuration(transports), nil
+
+ default:
+ return nil, errors.New("invalid strategy")
+ }
+}
+
+func parseTransports(otcs []map[string]interface{}) ([]Optimizer.Transport, error) {
+ transports := make([]Optimizer.Transport, len(otcs))
+ for index, otc := range otcs {
+ transport, err := parsedTransport(otc)
+ if err != nil {
+ return nil, errors.New("transport could not parse config")
+ //this error sucks and is uninformative
+ }
+ transports[index] = transport
+ }
+ return transports, nil
+}
+
+func parsedTransport(otc map[string]interface{}) (Optimizer.Transport, error) {
+ var address string
+ var name string
+ var config map[string]interface{}
+ //start by parsing the address
+ untypedAddress, ok := otc["address"]
+ if !ok {
+ return nil, errors.New("missing address in transport parser")
+ }
+
+ switch untypedAddress.(type) {
+
+ case string:
+ var icerr error
+ address, icerr = interconv.ParseString(untypedAddress)
+ if icerr != nil {
+ return nil, icerr
+ }
+
+ default:
+ return nil, errors.New("unsupported type for optimizer address option")
+ }
+ //now to parse the name
+ untypedName, ok2 := otc["name"]
+ if !ok2 {
+ return nil, errors.New("missing name in transport parser")
+ }
+
+ switch untypedName.(type) {
+
+ case string:
+ var icerr error
+ name, icerr = interconv.ParseString(untypedName)
+ if icerr != nil {
+ return nil, icerr
+ }
+
+ default:
+ return nil, errors.New("unsupported type for optimizer name option")
+ }
+ //on to parsing the config
+ untypedConfig, ok3 := otc["config"]
+ if !ok3 {
+ return nil, errors.New("missing config in transport parser")
+ }
+
+ switch untypedConfig.(type) {
+
+ case map[string]interface{}:
+ config = untypedConfig.(map[string]interface{})
+
+ default:
+ return nil, errors.New("unsupported type for optimizer config option")
+ }
+
+ switch name {
+ case "shadow":
+ shadowTransport, parseErr := ParseArgsShadow(config, address)
+ if parseErr != nil {
+ return nil, errors.New("could not parse shadow Args")
+ }
+ return shadowTransport, nil
+ case "obfs4":
+ obfs4Transport, parseErr := ParseArgsObfs4(config, address)
+ if parseErr != nil {
+ return nil, errors.New("could not parse obfs4 Args")
+ }
+ return obfs4Transport, nil
+ case "meeklite":
+ meekliteTransport, parseErr := ParseArgsMeeklite(config, address)
+ if parseErr != nil {
+ return nil, errors.New("could not parse meeklite Args")
+ }
+ return meekliteTransport, nil
+ case "Dust":
+ DustTransport, parseErr := ParseArgsDust(config, address)
+ if parseErr != nil {
+ return nil, errors.New("could not parse dust Args")
+ }
+ return DustTransport, nil
+ case "replicant":
+ replicantTransport, parseErr := ParseArgsReplicant(config, address)
+ if parseErr != nil {
+ return nil, errors.New("could not parse replicant Args")
+ }
+ return replicantTransport, nil
+ default:
+ return nil, errors.New("unsupported transport name")
+ }
+}
+
+func ParseReplicantConfig(config string) (replicant.Config, error) {
+ return replicant.Config{}, errors.New("function not implemented")
+
+} \ No newline at end of file