-
Notifications
You must be signed in to change notification settings - Fork 2
/
wire.go
250 lines (206 loc) · 4.18 KB
/
wire.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
package wire
import (
"encoding/binary"
"encoding/json"
"unsafe"
)
type FlowType byte
type CommandType byte
type UID uint16
const (
AgentToUser FlowType = iota
UserToAgent
BroadcastUsers
DefaultFlow
)
const (
CMD_SERVER_HELLO CommandType = iota
CMD_SYSTEM_STAT
CMD_TERMINAL
CMD_TASKMGR
CMD_PROCESS_ACTION
CMD_LIST_SERVICES
CMD_SERVICE_ACTION
CMD_EXIT
CMD_GCM_TOKEN // register gcm or notification tokens from browser to server
CMD_AGENTS_NO
CMD_EVENTS
CMD_FM_LISTDIR
CMD_FM_ACTION
CMD_SYSTEM_ACTION
CMD_START_SERVICE
CMD_DOWNLOAD_SERVICE
CMD_UPLOAD_SERVICE
CMD_SCRIPT
CMD_BUILTIN_MAX
)
type Header struct {
Connid UID
CmdType CommandType
Flow FlowType
}
func NewHeader(connid UID, cmdtype CommandType, flow FlowType) *Header {
return &Header{
Connid: connid,
CmdType: cmdtype,
Flow: flow,
}
}
func AttachHeader(header *Header, body []byte) []byte {
b := make([]byte, 4)
binary.BigEndian.PutUint16(b, uint16(header.Connid))
b[2] = byte(header.CmdType)
b[3] = byte(header.Flow)
return append(body, b...)
}
func UpdateHeader(header *Header, body []byte) []byte {
offset := len(body) - int(unsafe.Sizeof(Header{}))
return AttachHeader(header, body[:offset])
}
func GetHeader(raw []byte) (*Header, []byte) {
h := &Header{}
offset := len(raw) - int(unsafe.Sizeof(Header{}))
headerbytes := raw[offset:]
h.Connid = UID(binary.BigEndian.Uint16(headerbytes[:2]))
h.CmdType = CommandType(headerbytes[2])
h.Flow = FlowType(headerbytes[3])
return h, raw[:offset]
}
func Encode(connid UID, cmdtype CommandType, flow FlowType, v interface{}) ([]byte, error) {
bodybyte, err := json.Marshal(v)
if err != nil {
return nil, err
}
h := NewHeader(connid, cmdtype, flow)
return AttachHeader(h, bodybyte), nil
}
func Decode(raw []byte, out interface{}) (*Header, error) {
h, bodyraw := GetHeader(raw)
err := json.Unmarshal(bodyraw, out)
if err != nil {
return nil, err
}
return h, nil
}
// structs which will represent new command/message format
type SysStatCmd struct {
Interval int64 //duration in sec
Timeout int64 // 0 means no timeouts
}
type SysStatData struct {
TimeStamp int64
CPUPercent []float64
TotalMem uint64
AvailableMem uint64
NetSentbytes uint64
NetRecvbytes uint64
DiskTotal uint64
DiskFree uint64
}
/*
type TermCmd struct {
Command string // "" defaults to bash
Args []string
EnvVars []string
}*/
type TermData struct {
Data string
ResizeInfo string
}
type TaskMgrCmd struct {
Interval int64 //duration in msec
Timeout int64 // 0 means default timeout will be used
}
type TaskMgrData struct {
Uptime int64
AvgLoad int
Battery uint8
Processes []*ProcessInfo
}
type ProcessInfo struct {
PID int32
USER string
CPU float64
MEM uint64
UpTime float64
Command string
ChildPIDS []int32
}
type ProcessActionCmd struct {
PID int32
Action string
ID int32
}
type ProcessActionData struct {
Output string
ID int32
}
type ListServicesCmd struct {
}
type ListServicesMsg struct {
Services []*ServiceInfo
}
type ServiceInfo struct {
Name string
}
type Exit struct {
}
type TokenMessage struct {
Token string
}
// used by server to give connid and list of agents online
type AgentsCountMsg struct {
Agents map[string]UID
}
// listdir in filemanager
type ListDirReq struct {
Path string
Options []string
}
type ListDirReply struct {
Path string
FSNodes []FSNode
ParentPath string
}
type FSNode struct {
Name string
Type string
Size int64
}
// listdir in filemanager end
// shutdown and reboot for now
type SystemActionReq struct {
Action string
Options []string
}
type FmActionReq struct {
Action string
Basepath string
Targets []string
Destination string
Options []string
}
/*
type FmActionRes struct {
Action string
Status bool
Errors []string
Outputs []string
} */
type FmActionRes map[string]interface{}
type StartServiceReq struct {
Interval int64 //duration in sec
Timeout int64 // 0 means no timeouts
Options []string
ServiceType byte // should be CommandType
}
type DownloaderReq struct {
Control byte
Offset int64
}
type ScriptReq struct {
Code string
}
type ScriptRes struct {
Response string
}