mirror of
https://github.com/empayre/fleet.git
synced 2024-11-06 08:55:24 +00:00
0502412e15
This change optimizes live queries by pushing the computation of query targets to the creation time of the query, and efficiently caching the targets in Redis. This results in a huge performance improvement at both steady-state, and when running live queries. - Live queries are stored using a bitfield in Redis, and takes advantage of bitfield operations to be extremely efficient. - Only run Redis live query test when REDIS_TEST is set in environment - Ensure that live queries are only sent to hosts when there is a client listening for results. Addresses an existing issue in Fleet along with appropriate cleanup for the refactored live query backend.
91 lines
2.4 KiB
Go
91 lines
2.4 KiB
Go
// Package service holds the implementation of the kolide service interface and the HTTP endpoints
|
|
// for the API
|
|
package service
|
|
|
|
import (
|
|
"html/template"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/WatchBeam/clock"
|
|
kitlog "github.com/go-kit/kit/log"
|
|
"github.com/kolide/fleet/server/config"
|
|
"github.com/kolide/fleet/server/kolide"
|
|
"github.com/kolide/fleet/server/logging"
|
|
"github.com/kolide/fleet/server/sso"
|
|
"github.com/kolide/kit/version"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// NewService creates a new service from the config struct
|
|
func NewService(ds kolide.Datastore, resultStore kolide.QueryResultStore,
|
|
logger kitlog.Logger, config config.KolideConfig, mailService kolide.MailService,
|
|
c clock.Clock, sso sso.SessionStore, lq kolide.LiveQueryStore) (kolide.Service, error) {
|
|
var svc kolide.Service
|
|
|
|
osqueryLogger, err := logging.New(config, logger)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "initializing osquery logging")
|
|
}
|
|
|
|
svc = service{
|
|
ds: ds,
|
|
resultStore: resultStore,
|
|
liveQueryStore: lq,
|
|
logger: logger,
|
|
config: config,
|
|
clock: c,
|
|
osqueryLogWriter: osqueryLogger,
|
|
mailService: mailService,
|
|
ssoSessionStore: sso,
|
|
metaDataClient: &http.Client{
|
|
Timeout: 5 * time.Second,
|
|
},
|
|
}
|
|
svc = validationMiddleware{svc, ds, sso}
|
|
return svc, nil
|
|
}
|
|
|
|
type service struct {
|
|
ds kolide.Datastore
|
|
resultStore kolide.QueryResultStore
|
|
liveQueryStore kolide.LiveQueryStore
|
|
logger kitlog.Logger
|
|
config config.KolideConfig
|
|
clock clock.Clock
|
|
|
|
osqueryLogWriter *logging.OsqueryLogger
|
|
|
|
mailService kolide.MailService
|
|
ssoSessionStore sso.SessionStore
|
|
metaDataClient *http.Client
|
|
}
|
|
|
|
func (s service) SendEmail(mail kolide.Email) error {
|
|
return s.mailService.SendEmail(mail)
|
|
}
|
|
|
|
func (s service) Clock() clock.Clock {
|
|
return s.clock
|
|
}
|
|
|
|
type validationMiddleware struct {
|
|
kolide.Service
|
|
ds kolide.Datastore
|
|
ssoSessionStore sso.SessionStore
|
|
}
|
|
|
|
// getAssetURL gets the URL prefix used for retrieving assets from Github. This
|
|
// function will determine the appropriate version to use, and create a URL
|
|
// prefix for retrieving assets from that tag.
|
|
func getAssetURL() template.URL {
|
|
v := version.Version().Version
|
|
tag := strings.Split(v, "-")[0]
|
|
if tag == "unknown" {
|
|
tag = "master"
|
|
}
|
|
|
|
return template.URL("https://github.com/kolide/fleet/blob/" + tag)
|
|
}
|