mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-07 14:50:55 +03:00
eventsearcher plugin: add support to search for provider, bucket, endpoint
Signed-off-by: Nicola Murino <nicola.murino@gmail.com>
This commit is contained in:
@@ -7,38 +7,28 @@ import (
|
||||
|
||||
"github.com/drakkan/sftpgo/v2/dataprovider"
|
||||
"github.com/drakkan/sftpgo/v2/sdk/plugin"
|
||||
"github.com/drakkan/sftpgo/v2/sdk/plugin/eventsearcher"
|
||||
"github.com/drakkan/sftpgo/v2/util"
|
||||
)
|
||||
|
||||
type commonEventSearchParams struct {
|
||||
StartTimestamp int64
|
||||
EndTimestamp int64
|
||||
Actions []string
|
||||
Username string
|
||||
IP string
|
||||
InstanceIDs []string
|
||||
ExcludeIDs []string
|
||||
Limit int
|
||||
Order int
|
||||
}
|
||||
|
||||
func (c *commonEventSearchParams) fromRequest(r *http.Request) error {
|
||||
func getCommonSearchParamsFromRequest(r *http.Request) (eventsearcher.CommonSearchParams, error) {
|
||||
c := eventsearcher.CommonSearchParams{}
|
||||
c.Limit = 100
|
||||
|
||||
if _, ok := r.URL.Query()["limit"]; ok {
|
||||
limit, err := strconv.Atoi(r.URL.Query().Get("limit"))
|
||||
if err != nil {
|
||||
return util.NewValidationError(fmt.Sprintf("invalid limit: %v", err))
|
||||
return c, util.NewValidationError(fmt.Sprintf("invalid limit: %v", err))
|
||||
}
|
||||
if limit < 1 || limit > 1000 {
|
||||
return util.NewValidationError(fmt.Sprintf("limit is out of the 1-1000 range: %v", limit))
|
||||
return c, util.NewValidationError(fmt.Sprintf("limit is out of the 1-1000 range: %v", limit))
|
||||
}
|
||||
c.Limit = limit
|
||||
}
|
||||
if _, ok := r.URL.Query()["order"]; ok {
|
||||
order := r.URL.Query().Get("order")
|
||||
if order != dataprovider.OrderASC && order != dataprovider.OrderDESC {
|
||||
return util.NewValidationError(fmt.Sprintf("invalid order %#v", order))
|
||||
return c, util.NewValidationError(fmt.Sprintf("invalid order %#v", order))
|
||||
}
|
||||
if order == dataprovider.OrderASC {
|
||||
c.Order = 1
|
||||
@@ -47,14 +37,14 @@ func (c *commonEventSearchParams) fromRequest(r *http.Request) error {
|
||||
if _, ok := r.URL.Query()["start_timestamp"]; ok {
|
||||
ts, err := strconv.ParseInt(r.URL.Query().Get("start_timestamp"), 10, 64)
|
||||
if err != nil {
|
||||
return util.NewValidationError(fmt.Sprintf("invalid start_timestamp: %v", err))
|
||||
return c, util.NewValidationError(fmt.Sprintf("invalid start_timestamp: %v", err))
|
||||
}
|
||||
c.StartTimestamp = ts
|
||||
}
|
||||
if _, ok := r.URL.Query()["end_timestamp"]; ok {
|
||||
ts, err := strconv.ParseInt(r.URL.Query().Get("end_timestamp"), 10, 64)
|
||||
if err != nil {
|
||||
return util.NewValidationError(fmt.Sprintf("invalid end_timestamp: %v", err))
|
||||
return c, util.NewValidationError(fmt.Sprintf("invalid end_timestamp: %v", err))
|
||||
}
|
||||
c.EndTimestamp = ts
|
||||
}
|
||||
@@ -64,64 +54,63 @@ func (c *commonEventSearchParams) fromRequest(r *http.Request) error {
|
||||
c.InstanceIDs = getCommaSeparatedQueryParam(r, "instance_ids")
|
||||
c.ExcludeIDs = getCommaSeparatedQueryParam(r, "exclude_ids")
|
||||
|
||||
return nil
|
||||
return c, nil
|
||||
}
|
||||
|
||||
type fsEventSearchParams struct {
|
||||
commonEventSearchParams
|
||||
SSHCmd string
|
||||
Protocols []string
|
||||
Statuses []int32
|
||||
}
|
||||
|
||||
func (s *fsEventSearchParams) fromRequest(r *http.Request) error {
|
||||
if err := s.commonEventSearchParams.fromRequest(r); err != nil {
|
||||
return err
|
||||
func getFsSearchParamsFromRequest(r *http.Request) (eventsearcher.FsEventSearch, error) {
|
||||
var err error
|
||||
s := eventsearcher.FsEventSearch{}
|
||||
s.CommonSearchParams, err = getCommonSearchParamsFromRequest(r)
|
||||
if err != nil {
|
||||
return s, err
|
||||
}
|
||||
if _, ok := r.URL.Query()["fs_provider"]; ok {
|
||||
provider := r.URL.Query().Get("fs_provider")
|
||||
val, err := strconv.Atoi(provider)
|
||||
if err != nil {
|
||||
return s, util.NewValidationError(fmt.Sprintf("invalid fs_provider: %v", provider))
|
||||
}
|
||||
s.FsProvider = val
|
||||
}
|
||||
s.IP = r.URL.Query().Get("ip")
|
||||
s.SSHCmd = r.URL.Query().Get("ssh_cmd")
|
||||
s.Bucket = r.URL.Query().Get("bucket")
|
||||
s.Endpoint = r.URL.Query().Get("endpoint")
|
||||
s.Protocols = getCommaSeparatedQueryParam(r, "protocols")
|
||||
statuses := getCommaSeparatedQueryParam(r, "statuses")
|
||||
for _, status := range statuses {
|
||||
val, err := strconv.Atoi(status)
|
||||
if err != nil {
|
||||
return util.NewValidationError(fmt.Sprintf("invalid status: %v", status))
|
||||
return s, util.NewValidationError(fmt.Sprintf("invalid status: %v", status))
|
||||
}
|
||||
s.Statuses = append(s.Statuses, int32(val))
|
||||
}
|
||||
|
||||
return nil
|
||||
return s, nil
|
||||
}
|
||||
|
||||
type providerEventSearchParams struct {
|
||||
commonEventSearchParams
|
||||
ObjectName string
|
||||
ObjectTypes []string
|
||||
}
|
||||
|
||||
func (s *providerEventSearchParams) fromRequest(r *http.Request) error {
|
||||
if err := s.commonEventSearchParams.fromRequest(r); err != nil {
|
||||
return err
|
||||
func getProviderSearchParamsFromRequest(r *http.Request) (eventsearcher.ProviderEventSearch, error) {
|
||||
var err error
|
||||
s := eventsearcher.ProviderEventSearch{}
|
||||
s.CommonSearchParams, err = getCommonSearchParamsFromRequest(r)
|
||||
if err != nil {
|
||||
return s, err
|
||||
}
|
||||
s.ObjectName = r.URL.Query().Get("object_name")
|
||||
s.ObjectTypes = getCommaSeparatedQueryParam(r, "object_types")
|
||||
|
||||
return nil
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func searchFsEvents(w http.ResponseWriter, r *http.Request) {
|
||||
r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
|
||||
|
||||
params := fsEventSearchParams{}
|
||||
err := params.fromRequest(r)
|
||||
filters, err := getFsSearchParamsFromRequest(r)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
}
|
||||
|
||||
data, _, _, err := plugin.Handler.SearchFsEvents(params.StartTimestamp, params.EndTimestamp, params.Username,
|
||||
params.IP, params.SSHCmd, params.Actions, params.Protocols, params.InstanceIDs, params.ExcludeIDs,
|
||||
params.Statuses, params.Limit, params.Order)
|
||||
data, _, _, err := plugin.Handler.SearchFsEvents(&filters)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
@@ -134,16 +123,13 @@ func searchFsEvents(w http.ResponseWriter, r *http.Request) {
|
||||
func searchProviderEvents(w http.ResponseWriter, r *http.Request) {
|
||||
r.Body = http.MaxBytesReader(w, r.Body, maxRequestSize)
|
||||
|
||||
params := providerEventSearchParams{}
|
||||
err := params.fromRequest(r)
|
||||
filters, err := getProviderSearchParamsFromRequest(r)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
}
|
||||
|
||||
data, _, _, err := plugin.Handler.SearchProviderEvents(params.StartTimestamp, params.EndTimestamp, params.Username,
|
||||
params.IP, params.ObjectName, params.Limit, params.Order, params.Actions, params.ObjectTypes, params.InstanceIDs,
|
||||
params.ExcludeIDs)
|
||||
data, _, _, err := plugin.Handler.SearchProviderEvents(&filters)
|
||||
if err != nil {
|
||||
sendAPIResponse(w, r, err, "", getRespStatus(err))
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user