2021-10-23 13:47:21 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
|
|
|
|
|
|
|
"github.com/drakkan/sftpgo/v2/sdk/plugin/eventsearcher"
|
|
|
|
"github.com/hashicorp/go-plugin"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
errNotSupported = errors.New("unsupported parameter")
|
|
|
|
)
|
|
|
|
|
|
|
|
type fsEvent struct {
|
|
|
|
ID string `json:"id"`
|
|
|
|
Timestamp int64 `json:"timestamp"`
|
|
|
|
Action string `json:"action"`
|
|
|
|
Username string `json:"username"`
|
|
|
|
FsPath string `json:"fs_path"`
|
|
|
|
FsTargetPath string `json:"fs_target_path,omitempty"`
|
|
|
|
VirtualPath string `json:"virtual_path"`
|
|
|
|
VirtualTargetPath string `json:"virtual_target_path,omitempty"`
|
|
|
|
SSHCmd string `json:"ssh_cmd,omitempty"`
|
|
|
|
FileSize int64 `json:"file_size,omitempty"`
|
|
|
|
Status int `json:"status"`
|
|
|
|
Protocol string `json:"protocol"`
|
|
|
|
IP string `json:"ip,omitempty"`
|
2021-12-04 17:18:59 +00:00
|
|
|
SessionID string `json:"session_id"`
|
2021-10-23 13:47:21 +00:00
|
|
|
InstanceID string `json:"instance_id,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type providerEvent struct {
|
|
|
|
ID string `json:"id" gorm:"primaryKey"`
|
|
|
|
Timestamp int64 `json:"timestamp"`
|
|
|
|
Action string `json:"action"`
|
|
|
|
Username string `json:"username"`
|
|
|
|
IP string `json:"ip,omitempty"`
|
|
|
|
ObjectType string `json:"object_type"`
|
|
|
|
ObjectName string `json:"object_name"`
|
|
|
|
ObjectData []byte `json:"object_data"`
|
|
|
|
InstanceID string `json:"instance_id,omitempty"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type Searcher struct{}
|
|
|
|
|
|
|
|
func (s *Searcher) SearchFsEvents(startTimestamp, endTimestamp int64, username, ip, sshCmd string, actions,
|
|
|
|
protocols, instanceIDs, excludeIDs []string, statuses []int32, limit, order int,
|
|
|
|
) ([]byte, []string, []string, error) {
|
|
|
|
if startTimestamp < 0 {
|
|
|
|
return nil, nil, nil, errNotSupported
|
|
|
|
}
|
|
|
|
|
|
|
|
results := []fsEvent{
|
|
|
|
{
|
|
|
|
ID: "1",
|
|
|
|
Timestamp: 100,
|
|
|
|
Action: "upload",
|
|
|
|
Username: "username1",
|
|
|
|
FsPath: "/tmp/file.txt",
|
|
|
|
FsTargetPath: "/tmp/target.txt",
|
|
|
|
VirtualPath: "file.txt",
|
|
|
|
VirtualTargetPath: "target.txt",
|
|
|
|
SSHCmd: "scp",
|
|
|
|
FileSize: 123,
|
|
|
|
Status: 1,
|
|
|
|
Protocol: "SFTP",
|
|
|
|
IP: "::1",
|
2021-12-04 17:18:59 +00:00
|
|
|
SessionID: "1234",
|
2021-10-23 13:47:21 +00:00
|
|
|
InstanceID: "instance1",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
data, err := json.Marshal(results)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return data, nil, nil, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *Searcher) SearchProviderEvents(startTimestamp, endTimestamp int64, username, ip, objectName string,
|
|
|
|
limit, order int, actions, objectTypes, instanceIDs, excludeIDs []string,
|
|
|
|
) ([]byte, []string, []string, error) {
|
|
|
|
if startTimestamp < 0 {
|
|
|
|
return nil, nil, nil, errNotSupported
|
|
|
|
}
|
|
|
|
|
|
|
|
results := []providerEvent{
|
|
|
|
{
|
|
|
|
ID: "1",
|
|
|
|
Timestamp: 100,
|
|
|
|
Action: "add",
|
|
|
|
Username: "username1",
|
|
|
|
IP: "127.0.0.1",
|
|
|
|
ObjectType: "api_key",
|
|
|
|
ObjectName: "123",
|
|
|
|
ObjectData: []byte("data"),
|
|
|
|
InstanceID: "instance1",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
data, err := json.Marshal(results)
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return data, nil, nil, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
plugin.Serve(&plugin.ServeConfig{
|
|
|
|
HandshakeConfig: eventsearcher.Handshake,
|
|
|
|
Plugins: map[string]plugin.Plugin{
|
|
|
|
eventsearcher.PluginName: &eventsearcher.Plugin{Impl: &Searcher{}},
|
|
|
|
},
|
|
|
|
GRPCServer: plugin.DefaultGRPCServer,
|
|
|
|
})
|
|
|
|
}
|