mirror of
				https://github.com/bjdgyc/anylink.git
				synced 2025-11-04 19:16:22 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			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
 | 
						||
}
 |