mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-10-08 18:20:41 +08:00
add traffic track
This commit is contained in:
@@ -24,6 +24,10 @@ var (
|
|||||||
|
|
||||||
type Server struct {
|
type Server struct {
|
||||||
*http.Server
|
*http.Server
|
||||||
|
|
||||||
|
trafficUp int64
|
||||||
|
trafficDown int64
|
||||||
|
|
||||||
activeSessionMap sync.Map
|
activeSessionMap sync.Map
|
||||||
completedSessionQueue *queue.Queue
|
completedSessionQueue *queue.Queue
|
||||||
}
|
}
|
||||||
@@ -45,8 +49,8 @@ func (s *Server) handler(resp http.ResponseWriter, req *http.Request) {
|
|||||||
// Slice of completed sessions
|
// Slice of completed sessions
|
||||||
var completedSessions []*Session
|
var completedSessions []*Session
|
||||||
for _, item := range s.completedSessionQueue.Copy() {
|
for _, item := range s.completedSessionQueue.Copy() {
|
||||||
if sess, ok := item.(*Session); ok {
|
if session, ok := item.(*Session); ok {
|
||||||
completedSessions = append(completedSessions, sess)
|
completedSessions = append(completedSessions, session)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,17 +65,17 @@ func (s *Server) handler(resp http.ResponseWriter, req *http.Request) {
|
|||||||
return sessions[i].SessionStart.After(sessions[j].SessionStart)
|
return sessions[i].SessionStart.After(sessions[j].SessionStart)
|
||||||
})
|
})
|
||||||
|
|
||||||
for _, sess := range sessions {
|
for _, session := range sessions {
|
||||||
_, _ = fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td></tr>",
|
_, _ = fmt.Fprintf(w, "<tr><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td><td>%v</td></tr>",
|
||||||
sess.Process,
|
session.Process,
|
||||||
sess.Network,
|
session.Network,
|
||||||
date(sess.SessionStart),
|
date(session.SessionStart),
|
||||||
duration(sess.SessionStart, sess.SessionClose),
|
duration(session.SessionStart, session.SessionClose),
|
||||||
// sess.DialerAddr,
|
// session.DialerAddr,
|
||||||
sess.ClientAddr,
|
session.ClientAddr,
|
||||||
sess.TargetAddr,
|
session.TargetAddr,
|
||||||
byteCountSI(atomic.LoadInt64(&sess.UploadBytes)),
|
byteCountSI(atomic.LoadInt64(&session.UploadBytes)),
|
||||||
byteCountSI(atomic.LoadInt64(&sess.DownloadBytes)),
|
byteCountSI(atomic.LoadInt64(&session.DownloadBytes)),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
_, _ = fmt.Fprintf(w, "</table>")
|
_, _ = fmt.Fprintf(w, "</table>")
|
||||||
@@ -88,10 +92,17 @@ table, th, td {
|
|||||||
}</style><title>Go-tun2socks Sessions</title></head>`)
|
}</style><title>Go-tun2socks Sessions</title></head>`)
|
||||||
_, _ = fmt.Fprintf(w, "<h2>Go-tun2socks %s</h2>", C.Version)
|
_, _ = fmt.Fprintf(w, "<h2>Go-tun2socks %s</h2>", C.Version)
|
||||||
_, _ = fmt.Fprintf(w, "<h3>Now: %s ; Uptime: %s</h3>", now(), uptime())
|
_, _ = fmt.Fprintf(w, "<h3>Now: %s ; Uptime: %s</h3>", now(), uptime())
|
||||||
_, _ = fmt.Fprintf(w, "<p>Active sessions %d</p>", len(activeSessions))
|
_, _ = fmt.Fprintf(w, "<p>Traffic</p>")
|
||||||
|
trafficUp := atomic.LoadInt64(&s.trafficUp)
|
||||||
|
trafficDown := atomic.LoadInt64(&s.trafficDown)
|
||||||
|
_, _ = fmt.Fprintf(w, "<tr><td>Total</td><td>%s</td><td>Up</td><td>%s</td><td>Down</td><td>%s</td></tr>",
|
||||||
|
byteCountSI(trafficUp+trafficDown),
|
||||||
|
byteCountSI(trafficUp),
|
||||||
|
byteCountSI(trafficDown),
|
||||||
|
)
|
||||||
|
_, _ = fmt.Fprintf(w, "<p>Active sessions: %d</p>", len(activeSessions))
|
||||||
tablePrint(w, activeSessions)
|
tablePrint(w, activeSessions)
|
||||||
_, _ = fmt.Fprintf(w, "<br/><br/>")
|
_, _ = fmt.Fprintf(w, "<p>Recently completed sessions: %d</p>", len(completedSessions))
|
||||||
_, _ = fmt.Fprintf(w, "<p>Recently completed sessions %d</p>", len(completedSessions))
|
|
||||||
tablePrint(w, completedSessions)
|
tablePrint(w, completedSessions)
|
||||||
_, _ = fmt.Fprintf(w, "</html>")
|
_, _ = fmt.Fprintf(w, "</html>")
|
||||||
_ = w.Flush()
|
_ = w.Flush()
|
||||||
@@ -131,17 +142,23 @@ func (s *Server) Stop() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Server) AddSession(key interface{}, session *Session) {
|
func (s *Server) AddSession(key interface{}, session *Session) {
|
||||||
|
if session != nil {
|
||||||
s.activeSessionMap.Store(key, session)
|
s.activeSessionMap.Store(key, session)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Server) RemoveSession(key interface{}) {
|
func (s *Server) RemoveSession(key interface{}) {
|
||||||
if sess, ok := s.activeSessionMap.Load(key); ok {
|
if item, ok := s.activeSessionMap.Load(key); ok {
|
||||||
|
session := item.(*Session)
|
||||||
|
// delete first
|
||||||
|
s.activeSessionMap.Delete(key)
|
||||||
|
// record up & down traffic
|
||||||
|
atomic.AddInt64(&s.trafficUp, atomic.LoadInt64(&session.UploadBytes))
|
||||||
|
atomic.AddInt64(&s.trafficDown, atomic.LoadInt64(&session.DownloadBytes))
|
||||||
// move to completed sessions
|
// move to completed sessions
|
||||||
s.completedSessionQueue.Put(sess)
|
s.completedSessionQueue.Put(session)
|
||||||
if s.completedSessionQueue.Len() > maxCompletedSessions {
|
if s.completedSessionQueue.Len() > maxCompletedSessions {
|
||||||
s.completedSessionQueue.Pop()
|
s.completedSessionQueue.Pop()
|
||||||
}
|
}
|
||||||
// delete
|
|
||||||
s.activeSessionMap.Delete(key)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user