mirror of https://github.com/bjdgyc/anylink.git
117 lines
2.9 KiB
Go
117 lines
2.9 KiB
Go
package sessdata
|
||
|
||
import (
|
||
"bytes"
|
||
"net"
|
||
"sort"
|
||
"strings"
|
||
"time"
|
||
|
||
"github.com/bjdgyc/anylink/pkg/utils"
|
||
)
|
||
|
||
type Online struct {
|
||
Token string `json:"token"`
|
||
Username string `json:"username"`
|
||
Group string `json:"group"`
|
||
MacAddr string `json:"mac_addr"`
|
||
UniqueMac bool `json:"unique_mac"`
|
||
Ip net.IP `json:"ip"`
|
||
RemoteAddr string `json:"remote_addr"`
|
||
TunName string `json:"tun_name"`
|
||
Mtu int `json:"mtu"`
|
||
Client string `json:"client"`
|
||
BandwidthUp string `json:"bandwidth_up"`
|
||
BandwidthDown string `json:"bandwidth_down"`
|
||
BandwidthUpAll string `json:"bandwidth_up_all"`
|
||
BandwidthDownAll string `json:"bandwidth_down_all"`
|
||
LastLogin time.Time `json:"last_login"`
|
||
}
|
||
|
||
type Onlines []Online
|
||
|
||
func (o Onlines) Len() int {
|
||
return len(o)
|
||
}
|
||
|
||
func (o Onlines) Less(i, j int) bool {
|
||
return bytes.Compare(o[i].Ip, o[j].Ip) < 0
|
||
}
|
||
|
||
func (o Onlines) Swap(i, j int) {
|
||
o[i], o[j] = o[j], o[i]
|
||
}
|
||
|
||
func OnlineSess() []Online {
|
||
return GetOnlineSess("", "", false)
|
||
}
|
||
|
||
/**
|
||
* @Description: GetOnlineSess
|
||
* @param search_cate 分类:用户名、登录组、MAC地址、IP地址、远端地址
|
||
* @param search_text 关键字,模糊搜索
|
||
* @param show_sleeper 是否显示休眠用户
|
||
* @return []Online
|
||
*/
|
||
func GetOnlineSess(search_cate string, search_text string, show_sleeper bool) []Online {
|
||
var datas Onlines
|
||
if strings.TrimSpace(search_text) == "" {
|
||
search_cate = ""
|
||
}
|
||
sessMux.Lock()
|
||
defer sessMux.Unlock()
|
||
for _, v := range sessions {
|
||
v.mux.Lock()
|
||
cSess := v.CSess
|
||
if cSess == nil {
|
||
cSess = &ConnSession{}
|
||
}
|
||
// 选择需要比较的字符串
|
||
var compareText string
|
||
switch search_cate {
|
||
case "username":
|
||
compareText = v.Username
|
||
case "group":
|
||
compareText = v.Group
|
||
case "mac_addr":
|
||
compareText = v.MacAddr
|
||
case "ip":
|
||
if cSess != nil {
|
||
compareText = cSess.IpAddr.String()
|
||
}
|
||
case "remote_addr":
|
||
if cSess != nil {
|
||
compareText = cSess.RemoteAddr
|
||
}
|
||
}
|
||
if search_cate != "" && !strings.Contains(compareText, search_text) {
|
||
v.mux.Unlock()
|
||
continue
|
||
}
|
||
|
||
if show_sleeper || v.IsActive {
|
||
val := Online{
|
||
Token: v.Token,
|
||
Ip: cSess.IpAddr,
|
||
Username: v.Username,
|
||
Group: v.Group,
|
||
MacAddr: v.MacAddr,
|
||
UniqueMac: v.UniqueMac,
|
||
RemoteAddr: cSess.RemoteAddr,
|
||
TunName: cSess.IfName,
|
||
Mtu: cSess.Mtu,
|
||
Client: cSess.Client,
|
||
BandwidthUp: utils.HumanByte(cSess.BandwidthUpPeriod.Load()) + "/s",
|
||
BandwidthDown: utils.HumanByte(cSess.BandwidthDownPeriod.Load()) + "/s",
|
||
BandwidthUpAll: utils.HumanByte(cSess.BandwidthUpAll.Load()),
|
||
BandwidthDownAll: utils.HumanByte(cSess.BandwidthDownAll.Load()),
|
||
LastLogin: v.LastLogin,
|
||
}
|
||
datas = append(datas, val)
|
||
}
|
||
v.mux.Unlock()
|
||
}
|
||
sort.Sort(&datas)
|
||
return datas
|
||
}
|