anylink/server/sessdata/online.go

117 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}