providers/fireeye/api/parameters.go (64 lines of code) (raw):
// Copyright (c) Facebook, Inc. and its affiliates.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package api
import (
"fmt"
"net/url"
"strconv"
"time"
)
const (
ninetyDays = int64(60 * 60 * 24 * 90) // 90 days in seconds, max for FireEye api
)
type timeRangeParameters struct {
StartDate int64
EndDate int64
}
func (vp timeRangeParameters) String() string {
return fmt.Sprintf("Start: (%s); End: (%s)",
time.Unix(vp.StartDate, 0).Format(time.RFC1123),
time.Unix(vp.EndDate, 0).Format(time.RFC1123),
)
}
func newParametersSince(since int64) timeRangeParameters {
return timeRangeParameters{
StartDate: since,
EndDate: time.Now().Unix(),
}
}
func (vp timeRangeParameters) validate() error {
if vp.StartDate < 0 {
return fmt.Errorf("start date (%d) can't be < 0 ", vp.StartDate)
}
if vp.EndDate < 0 {
return fmt.Errorf("end date (%d) can't be < 0 ", vp.EndDate)
}
if vp.EndDate < vp.StartDate {
return fmt.Errorf("end date can't be < start date: %s", vp)
}
return nil
}
func (vp timeRangeParameters) query() string {
query := url.Values{}
query.Set("startDate", strconv.FormatInt(vp.StartDate, 10))
query.Set("endDate", strconv.FormatInt(vp.EndDate, 10))
return query.Encode()
}
func (vp timeRangeParameters) batchBy(gap int64) []timeRangeParameters {
/*
This will create an array of parameters. Each element will have endDate - startDate <= gap
Actually, all but last elements will have endDate - startDate = gap
Last one might have <gap or =gap
They will have no overlaps: [i+1].StartDate = [i].EndDate + 1
[1,11].batchBy(3) = [(1,4),(5,8),(9,11)]
*/
var params []timeRangeParameters
add := func(s, e int64) {
params = append(params, timeRangeParameters{
StartDate: s,
EndDate: e,
})
}
current := vp.StartDate
for {
currentEnd := current + gap
if currentEnd >= vp.EndDate {
break
}
add(current, currentEnd)
current = currentEnd + 1
}
add(current, vp.EndDate)
return params
}