forked from amironov73/GoIrbis
/
ServerStat.go
107 lines (86 loc) · 2.84 KB
/
ServerStat.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package irbis
import (
"strconv"
"strings"
)
// ClientInfo Информация о клиенте, подключенном к серверу ИРБИС
// (не обязательно о текущем).
type ClientInfo struct {
// Number порядковый номер.
Number string
// IPAddress Адрес клиента.
IPAddress string
// Port Порт клиента.
Port string
// Name Логин
Name string
// Id Идентификатор клиентской программы
// (просто уникальное число).
Id string
// Workstation Клиентский АРМ.
Workstation string
// Registered Момент подключения к серверу.
Registered string
// Acknowledged Подследнее подтверждение, посланное серверу.
Acknowledged string
// LastCommand Последняя команда, посланная серверу.
LastCommand string
// CommandNumber Номер последней команлы.
CommandNumber string
}
// Parse Разбор ответа сервера.
func (client *ClientInfo) Parse(lines []string) {
client.Number = lines[0]
client.IPAddress = lines[1]
client.Port = lines[2]
client.Name = lines[3]
client.Id = lines[4]
client.Workstation = lines[5]
client.Registered = lines[6]
client.Acknowledged = lines[7]
client.LastCommand = lines[8]
client.CommandNumber = lines[9]
}
func (client *ClientInfo) String() string {
return client.IPAddress
}
// ServerStat Статистика работы ИРБИС-сервера.
type ServerStat struct {
// RunningClients Подключенные клиенты.
RunningClients []ClientInfo
// ClientCount Число клиентов, подключенных в текущий момент.
ClientCount int
// TotalCommandCount Общее количество команд,
// исполненных сервером с момента запуска.
TotalCommandCount int
}
func (stat *ServerStat) Parse(lines []string) {
stat.TotalCommandCount, _ = strconv.Atoi(lines[0])
stat.ClientCount, _ = strconv.Atoi(lines[1])
linesPerClient, err := strconv.Atoi(lines[2])
if err != nil || linesPerClient < 8 {
return
}
lines = lines[3:]
for i := 0; i < stat.ClientCount; i++ {
if len(lines) < linesPerClient {
break
}
stat.RunningClients = append(stat.RunningClients, ClientInfo{})
client := &stat.RunningClients[len(stat.RunningClients)-1]
client.Parse(lines)
lines = lines[linesPerClient+1:]
}
}
func (stat *ServerStat) String() string {
result := strings.Builder{}
result.WriteString(strconv.Itoa(stat.TotalCommandCount))
result.WriteString("\n")
result.WriteString(strconv.Itoa(stat.ClientCount))
result.WriteString("\n8\n")
for _, client := range stat.RunningClients {
result.WriteString(client.String())
result.WriteString("\n")
}
return result.String()
}