sing-box/experimental/libbox/command_status.go

80 lines
2.0 KiB
Go
Raw Normal View History

2023-03-01 10:37:47 +08:00
package libbox
import (
"encoding/binary"
"net"
"runtime"
"time"
2023-03-03 19:26:54 +08:00
"github.com/sagernet/sing-box/common/dialer/conntrack"
2023-07-16 14:08:45 +08:00
"github.com/sagernet/sing-box/experimental/clashapi"
2023-03-01 10:37:47 +08:00
E "github.com/sagernet/sing/common/exceptions"
)
type StatusMessage struct {
2023-07-16 14:08:45 +08:00
Memory int64
Goroutines int32
ConnectionsIn int32
ConnectionsOut int32
TrafficAvailable bool
Uplink int64
Downlink int64
UplinkTotal int64
DownlinkTotal int64
2023-03-01 10:37:47 +08:00
}
2023-07-16 14:08:45 +08:00
func (s *CommandServer) readStatus() StatusMessage {
2023-03-01 10:37:47 +08:00
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
var message StatusMessage
2023-03-04 00:40:47 +08:00
message.Memory = int64(memStats.StackInuse + memStats.HeapInuse + memStats.HeapIdle - memStats.HeapReleased)
2023-03-01 10:37:47 +08:00
message.Goroutines = int32(runtime.NumGoroutine())
2023-07-16 14:08:45 +08:00
message.ConnectionsOut = int32(conntrack.Count())
if s.service != nil {
if clashServer := s.service.instance.Router().ClashServer(); clashServer != nil {
message.TrafficAvailable = true
trafficManager := clashServer.(*clashapi.Server).TrafficManager()
message.Uplink, message.Downlink = trafficManager.Now()
message.UplinkTotal, message.DownlinkTotal = trafficManager.Total()
message.ConnectionsIn = int32(trafficManager.Connections())
}
}
2023-03-01 10:37:47 +08:00
return message
}
func (s *CommandServer) handleStatusConn(conn net.Conn) error {
var interval int64
err := binary.Read(conn, binary.BigEndian, &interval)
if err != nil {
return E.Cause(err, "read interval")
}
ticker := time.NewTicker(time.Duration(interval))
defer ticker.Stop()
ctx := connKeepAlive(conn)
for {
2023-07-16 14:08:45 +08:00
err = binary.Write(conn, binary.BigEndian, s.readStatus())
2023-03-01 10:37:47 +08:00
if err != nil {
return err
}
select {
case <-ctx.Done():
2023-04-10 08:48:58 +08:00
return ctx.Err()
2023-03-01 10:37:47 +08:00
case <-ticker.C:
}
}
}
func (c *CommandClient) handleStatusConn(conn net.Conn) {
for {
var message StatusMessage
err := binary.Read(conn, binary.BigEndian, &message)
if err != nil {
c.handler.Disconnected(err.Error())
return
}
c.handler.WriteStatus(&message)
}
}