(config SSHSessionConfig)
| 242 | } |
| 243 | |
| 244 | func getSSHSessions(config SSHSessionConfig) (res []byte, err error) { |
| 245 | var ( |
| 246 | result []sshSession |
| 247 | users []host.UserStat |
| 248 | processes []*process.Process |
| 249 | ) |
| 250 | ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) |
| 251 | defer cancel() |
| 252 | |
| 253 | users, err = host.UsersWithContext(ctx) |
| 254 | if err != nil { |
| 255 | res, err = json.Marshal(result) |
| 256 | return |
| 257 | } |
| 258 | |
| 259 | usersByHost := make(map[string][]host.UserStat) |
| 260 | for _, user := range users { |
| 261 | if user.Host == "" { |
| 262 | continue |
| 263 | } |
| 264 | if config.LoginUser != "" && !strings.Contains(user.User, config.LoginUser) { |
| 265 | continue |
| 266 | } |
| 267 | if config.LoginIP != "" && !strings.Contains(user.Host, config.LoginIP) { |
| 268 | continue |
| 269 | } |
| 270 | usersByHost[user.Host] = append(usersByHost[user.Host], user) |
| 271 | } |
| 272 | |
| 273 | if len(usersByHost) == 0 { |
| 274 | res, err = json.Marshal(result) |
| 275 | return |
| 276 | } |
| 277 | |
| 278 | processes, err = process.ProcessesWithContext(ctx) |
| 279 | if err != nil { |
| 280 | res, err = json.Marshal(result) |
| 281 | return |
| 282 | } |
| 283 | |
| 284 | for _, proc := range processes { |
| 285 | name, _ := proc.Name() |
| 286 | if name != "sshd" || proc.Pid == 0 { |
| 287 | continue |
| 288 | } |
| 289 | connections, _ := proc.Connections() |
| 290 | if len(connections) == 0 { |
| 291 | continue |
| 292 | } |
| 293 | |
| 294 | cmdline, cmdErr := proc.Cmdline() |
| 295 | if cmdErr != nil { |
| 296 | continue |
| 297 | } |
| 298 | |
| 299 | for _, conn := range connections { |
| 300 | matchedUsers, exists := usersByHost[conn.Raddr.IP] |
| 301 | if !exists { |
no test coverage detected