diff --git a/tapdance/assets.go b/tapdance/assets.go index 05136df6..b3d5a224 100644 --- a/tapdance/assets.go +++ b/tapdance/assets.go @@ -351,3 +351,7 @@ func (a *assets) saveClientConf() error { func (a *assets) SetStatsSocksAddr(addr string) { a.socksAddr = addr } + +func (a *assets) GetStatsSocksAddr() string { + return a.socksAddr +} diff --git a/tapdance/conjure.go b/tapdance/conjure.go index b09727de..cac2260a 100644 --- a/tapdance/conjure.go +++ b/tapdance/conjure.go @@ -59,9 +59,13 @@ func DialConjure(ctx context.Context, cjSession *ConjureSession) (net.Conn, erro Logger().Debugf("%v Successfully sent registrations, sleeping for: %v ms", cjSession.IDString(), toSleep) time.Sleep(toSleep) - Logger().Debugf("%v Woke from sleep, attempting to Connect ...", cjSession.IDString()) - return registration.Connect(ctx) - // return Connect(cjSession) + Logger().Tracef("%v Woke from sleep, attempting to Connect ...", cjSession.IDString()) + + conn, err := registration.Connect(ctx) + if conn != nil && err == nil { + go StatsReporting(cjSession.stats) + } + return conn, err } // Register - Send registrations equal to the width specified in the Conjure Session diff --git a/tapdance/logger.go b/tapdance/logger.go index bbbd358b..9ee2be18 100644 --- a/tapdance/logger.go +++ b/tapdance/logger.go @@ -1,9 +1,14 @@ package tapdance import ( + "bytes" "fmt" + "net/http" + "net/url" "sync" + "github.com/golang/protobuf/proto" + pb "github.com/refraction-networking/gotapdance/protobuf" "github.com/sirupsen/logrus" ) @@ -35,3 +40,25 @@ func Logger() *logrus.Logger { }) return logrusLogger } + +func StatsReporting(stats *pb.SessionStats) { + socks_url, err := url.Parse("socks5://" + Assets().GetStatsSocksAddr()) + // Test socks5 proxy + //socks_url, err := url.Parse("socks5://localhost:8080") + fmt.Printf("Got %v as socks5 proxy\n", socks_url) + if err != nil { + Logger().Debugf("Could not parse socks addr %v: %v\n", Assets().GetStatsSocksAddr(), err) + return + } + client := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(socks_url)}} + + data, err := proto.Marshal(stats) + if err != nil { + Logger().Debugf("Could not marshal stats protobuf: %v", err) + return + } + + // TODO setup stats endpoint + client.Post("https://stats.refraction.network", "stats", bytes.NewReader(data)) + return +} diff --git a/tapdance/logger_test.go b/tapdance/logger_test.go new file mode 100644 index 00000000..f8882b30 --- /dev/null +++ b/tapdance/logger_test.go @@ -0,0 +1,17 @@ +package tapdance + +import ( + "testing" + + pb "github.com/refraction-networking/gotapdance/protobuf" +) + +func TestStatsReporting(t *testing.T) { + reg := ConjureReg{} + testRTT := uint32(1000) + reg.stats = &pb.SessionStats{ + TotalTimeToConnect: &testRTT, + TcpToDecoy: &testRTT, + } + StatsReporting(reg.stats) +}