Refactor: manager -> statistic

This commit is contained in:
xjasonlyu
2021-02-07 10:54:29 +08:00
parent 84b7c17268
commit 035504020e
7 changed files with 34 additions and 46 deletions

View File

@@ -7,7 +7,7 @@ import (
"strconv" "strconv"
"time" "time"
"github.com/xjasonlyu/tun2socks/tunnel" "github.com/xjasonlyu/tun2socks/tunnel/statistic"
"github.com/go-chi/chi" "github.com/go-chi/chi"
"github.com/go-chi/render" "github.com/go-chi/render"
@@ -26,7 +26,7 @@ func connectionRouter() http.Handler {
func getConnections(w http.ResponseWriter, r *http.Request) { func getConnections(w http.ResponseWriter, r *http.Request) {
if !websocket.IsWebSocketUpgrade(r) { if !websocket.IsWebSocketUpgrade(r) {
snapshot := tunnel.DefaultManager.Snapshot() snapshot := statistic.DefaultManager.Snapshot()
render.JSON(w, r, snapshot) render.JSON(w, r, snapshot)
return return
} }
@@ -52,7 +52,7 @@ func getConnections(w http.ResponseWriter, r *http.Request) {
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
sendSnapshot := func() error { sendSnapshot := func() error {
buf.Reset() buf.Reset()
snapshot := tunnel.DefaultManager.Snapshot() snapshot := statistic.DefaultManager.Snapshot()
if err := json.NewEncoder(buf).Encode(snapshot); err != nil { if err := json.NewEncoder(buf).Encode(snapshot); err != nil {
return err return err
} }
@@ -75,7 +75,7 @@ func getConnections(w http.ResponseWriter, r *http.Request) {
func closeConnection(w http.ResponseWriter, r *http.Request) { func closeConnection(w http.ResponseWriter, r *http.Request) {
id := chi.URLParam(r, "id") id := chi.URLParam(r, "id")
snapshot := tunnel.DefaultManager.Snapshot() snapshot := statistic.DefaultManager.Snapshot()
for _, c := range snapshot.Connections { for _, c := range snapshot.Connections {
if id == c.ID() { if id == c.ID() {
_ = c.Close() _ = c.Close()
@@ -86,7 +86,7 @@ func closeConnection(w http.ResponseWriter, r *http.Request) {
} }
func closeAllConnections(w http.ResponseWriter, r *http.Request) { func closeAllConnections(w http.ResponseWriter, r *http.Request) {
snapshot := tunnel.DefaultManager.Snapshot() snapshot := statistic.DefaultManager.Snapshot()
for _, c := range snapshot.Connections { for _, c := range snapshot.Connections {
_ = c.Close() _ = c.Close()
} }

View File

@@ -10,7 +10,7 @@ import (
"github.com/xjasonlyu/tun2socks/constant" "github.com/xjasonlyu/tun2socks/constant"
"github.com/xjasonlyu/tun2socks/log" "github.com/xjasonlyu/tun2socks/log"
"github.com/xjasonlyu/tun2socks/tunnel" "github.com/xjasonlyu/tun2socks/tunnel/statistic"
"github.com/go-chi/chi" "github.com/go-chi/chi"
"github.com/go-chi/cors" "github.com/go-chi/cors"
@@ -176,7 +176,7 @@ func traffic(w http.ResponseWriter, r *http.Request) {
tick := time.NewTicker(time.Second) tick := time.NewTicker(time.Second)
defer tick.Stop() defer tick.Stop()
t := tunnel.DefaultManager t := statistic.DefaultManager
buf := &bytes.Buffer{} buf := &bytes.Buffer{}
var err error var err error
for range tick.C { for range tick.C {

View File

@@ -1,22 +0,0 @@
package tunnel
import (
"net"
"github.com/xjasonlyu/tun2socks/common/adapter"
"github.com/xjasonlyu/tun2socks/component/manager"
)
var (
// DefaultManager is the default traffic and connections
// manager used by tunnel.
DefaultManager = manager.New()
)
func newTCPTracker(conn net.Conn, metadata *adapter.Metadata) net.Conn {
return manager.NewTCPTracker(conn, metadata, DefaultManager)
}
func newUDPTracker(conn net.PacketConn, metadata *adapter.Metadata) net.PacketConn {
return manager.NewUDPTracker(conn, metadata, DefaultManager)
}

View File

@@ -1,5 +1,4 @@
// Package manager provides statistic management of connections. package statistic
package manager
import ( import (
"sync" "sync"
@@ -8,6 +7,21 @@ import (
"go.uber.org/atomic" "go.uber.org/atomic"
) )
var DefaultManager *Manager
func init() {
DefaultManager = &Manager{
uploadTemp: atomic.NewInt64(0),
downloadTemp: atomic.NewInt64(0),
uploadBlip: atomic.NewInt64(0),
downloadBlip: atomic.NewInt64(0),
uploadTotal: atomic.NewInt64(0),
downloadTotal: atomic.NewInt64(0),
}
go DefaultManager.handle()
}
type Manager struct { type Manager struct {
connections sync.Map connections sync.Map
uploadTemp *atomic.Int64 uploadTemp *atomic.Int64
@@ -18,20 +32,6 @@ type Manager struct {
downloadTotal *atomic.Int64 downloadTotal *atomic.Int64
} }
func New() *Manager {
manager := &Manager{
uploadTemp: atomic.NewInt64(0),
downloadTemp: atomic.NewInt64(0),
uploadBlip: atomic.NewInt64(0),
downloadBlip: atomic.NewInt64(0),
uploadTotal: atomic.NewInt64(0),
downloadTotal: atomic.NewInt64(0),
}
go manager.handle()
return manager
}
func (m *Manager) Join(c tracker) { func (m *Manager) Join(c tracker) {
m.connections.Store(c.ID(), c) m.connections.Store(c.ID(), c)
} }

View File

@@ -1,4 +1,4 @@
package manager package statistic
import ( import (
"net" "net"

View File

@@ -11,12 +11,17 @@ import (
"github.com/xjasonlyu/tun2socks/common/pool" "github.com/xjasonlyu/tun2socks/common/pool"
"github.com/xjasonlyu/tun2socks/log" "github.com/xjasonlyu/tun2socks/log"
"github.com/xjasonlyu/tun2socks/proxy" "github.com/xjasonlyu/tun2socks/proxy"
"github.com/xjasonlyu/tun2socks/tunnel/statistic"
) )
const ( const (
tcpWaitTimeout = 5 * time.Second tcpWaitTimeout = 5 * time.Second
) )
func newTCPTracker(conn net.Conn, metadata *adapter.Metadata) net.Conn {
return statistic.NewTCPTracker(conn, metadata, statistic.DefaultManager)
}
func handleTCP(localConn adapter.TCPConn) { func handleTCP(localConn adapter.TCPConn) {
defer localConn.Close() defer localConn.Close()

View File

@@ -12,6 +12,7 @@ import (
"github.com/xjasonlyu/tun2socks/component/nat" "github.com/xjasonlyu/tun2socks/component/nat"
"github.com/xjasonlyu/tun2socks/log" "github.com/xjasonlyu/tun2socks/log"
"github.com/xjasonlyu/tun2socks/proxy" "github.com/xjasonlyu/tun2socks/proxy"
"github.com/xjasonlyu/tun2socks/tunnel/statistic"
) )
const ( const (
@@ -24,6 +25,10 @@ var (
natTable = nat.NewTable() natTable = nat.NewTable()
) )
func newUDPTracker(conn net.PacketConn, metadata *adapter.Metadata) net.PacketConn {
return statistic.NewUDPTracker(conn, metadata, statistic.DefaultManager)
}
func handleUDP(packet adapter.UDPPacket) { func handleUDP(packet adapter.UDPPacket) {
metadata := packet.Metadata() metadata := packet.Metadata()
if !metadata.Valid() { if !metadata.Valid() {