Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions app/stats/command/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,12 @@ func (s *statsServer) GetStatsOnlineIpList(ctx context.Context, request *GetStat
}, nil
}

func (s *statsServer) GetAllOnlineUsers(ctx context.Context, request *GetAllOnlineUsersRequest) (*GetAllOnlineUsersResponse, error) {
return &GetAllOnlineUsersResponse{
Users: s.stats.GetAllOnlineUsers(),
}, nil
}

func (s *statsServer) QueryStats(ctx context.Context, request *QueryStatsRequest) (*QueryStatsResponse, error) {
matcher, err := strmatcher.Substr.New(request.Pattern)
if err != nil {
Expand Down
472 changes: 250 additions & 222 deletions app/stats/command/command.pb.go

Large diffs are not rendered by default.

7 changes: 7 additions & 0 deletions app/stats/command/command.proto
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,19 @@ message GetStatsOnlineIpListResponse {
map<string, int64> ips = 2;
}

message GetAllOnlineUsersRequest {}

message GetAllOnlineUsersResponse {
repeated string users = 1;
}

service StatsService {
rpc GetStats(GetStatsRequest) returns (GetStatsResponse) {}
rpc GetStatsOnline(GetStatsRequest) returns (GetStatsResponse) {}
rpc QueryStats(QueryStatsRequest) returns (QueryStatsResponse) {}
rpc GetSysStats(SysStatsRequest) returns (SysStatsResponse) {}
rpc GetStatsOnlineIpList(GetStatsRequest) returns (GetStatsOnlineIpListResponse) {}
rpc GetAllOnlineUsers(GetAllOnlineUsersRequest) returns (GetAllOnlineUsersResponse) {}
}

message Config {}
44 changes: 41 additions & 3 deletions app/stats/command/command_grpc.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions app/stats/stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,21 @@ func (m *Manager) GetChannel(name string) stats.Channel {
return nil
}

// GetAllOnlineUsers implements stats.Manager.
func (m *Manager) GetAllOnlineUsers() []string {
m.access.Lock()
defer m.access.Unlock()

usersOnline := make([]string, 0, len(m.onlineMap))
for user, onlineMap := range m.onlineMap {
if len(onlineMap.IpTimeMap()) > 0 {
usersOnline = append(usersOnline, user)
}
}

return usersOnline
}

// Start implements common.Runnable.
func (m *Manager) Start() error {
m.access.Lock()
Expand Down
8 changes: 8 additions & 0 deletions features/stats/stats.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@ type Manager interface {
UnregisterChannel(string) error
// GetChannel returns a channel by its identifier.
GetChannel(string) Channel

// GetAllOnlineUsers returns all online users from all OnlineMaps.
GetAllOnlineUsers() []string
}

// GetOrRegisterCounter tries to get the StatCounter first. If not exist, it then tries to create a new counter.
Expand Down Expand Up @@ -190,6 +193,11 @@ func (NoopManager) GetChannel(string) Channel {
return nil
}

// GetAllOnlineUsers implements Manager.
func (NoopManager) GetAllOnlineUsers() []string {
return nil
}

// Start implements common.Runnable.
func (NoopManager) Start() error { return nil }

Expand Down
1 change: 1 addition & 0 deletions main/commands/all/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,5 +32,6 @@ var CmdAPI = &base.Command{
cmdSourceIpBlock,
cmdOnlineStats,
cmdOnlineStatsIpList,
cmdGetAllOnlineUsers,
},
}
43 changes: 43 additions & 0 deletions main/commands/all/api/stats_get_all_online_users.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package api

import (
statsService "github.com/xtls/xray-core/app/stats/command"
"github.com/xtls/xray-core/main/commands/base"
)

var cmdGetAllOnlineUsers = &base.Command{
CustomFlags: true,
UsageLine: "{{.Exec}} api statsgetallonlineusers [--server=127.0.0.1:8080]",
Short: "Retrieve array of all online users",
Long: `
Retrieve array of all online users.

Arguments:

-s, -server <server:port>
The API server address. Default 127.0.0.1:8080

-t, -timeout <seconds>
Timeout in seconds for calling API. Default 3

Example:

{{.Exec}} {{.LongName}} --server=127.0.0.1:8080"
`,
Run: executeGetAllOnlineUsers,
}

func executeGetAllOnlineUsers(cmd *base.Command, args []string) {
setSharedFlags(cmd)
cmd.Flag.Parse(args)
conn, ctx, close := dialAPIServer()
defer close()

client := statsService.NewStatsServiceClient(conn)
r := &statsService.GetAllOnlineUsersRequest{}
resp, err := client.GetAllOnlineUsers(ctx, r)
if err != nil {
base.Fatalf("failed to get stats: %s", err)
}
showJSONResponse(resp)
}
Loading