mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-11-02 04:52:33 +08:00
Refactor: manager -> statistic
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
|
||||||
}
|
|
||||||
@@ -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)
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package manager
|
package statistic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
"net"
|
||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user