fleet/server/service/service.go

111 lines
2.9 KiB
Go
Raw Normal View History

// Package service holds the implementation of the kolide service interface and the HTTP endpoints
// for the API
2016-09-26 18:48:55 +00:00
package service
2016-08-28 03:59:17 +00:00
import (
"io"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/WatchBeam/clock"
kitlog "github.com/go-kit/kit/log"
2017-06-22 19:50:45 +00:00
"github.com/kolide/fleet/server/config"
"github.com/kolide/fleet/server/kolide"
"github.com/kolide/fleet/server/logwriter"
"github.com/kolide/fleet/server/sso"
"gopkg.in/natefinch/lumberjack.v2"
)
2016-08-28 03:59:17 +00:00
// NewService creates a new service from the config struct
func NewService(ds kolide.Datastore, resultStore kolide.QueryResultStore,
logger kitlog.Logger, kolideConfig config.KolideConfig, mailService kolide.MailService,
2017-09-01 16:42:46 +00:00
c clock.Clock, sso sso.SessionStore) (kolide.Service, error) {
2016-08-28 03:59:17 +00:00
var svc kolide.Service
statusWriter, err := osqueryLogFile(kolideConfig.Osquery.StatusLogFile, logger, kolideConfig.Osquery.EnableLogRotation)
if err != nil {
return nil, err
}
resultWriter, err := osqueryLogFile(kolideConfig.Osquery.ResultLogFile, logger, kolideConfig.Osquery.EnableLogRotation)
if err != nil {
return nil, err
}
2016-08-28 03:59:17 +00:00
svc = service{
2017-09-01 16:42:46 +00:00
ds: ds,
resultStore: resultStore,
logger: logger,
config: kolideConfig,
clock: c,
osqueryStatusLogWriter: statusWriter,
osqueryResultLogWriter: resultWriter,
mailService: mailService,
ssoSessionStore: sso,
metaDataClient: &http.Client{
Timeout: 5 * time.Second,
},
2016-08-28 03:59:17 +00:00
}
svc = validationMiddleware{svc, ds, sso}
2016-08-28 03:59:17 +00:00
return svc, nil
}
// osqueryLogFile creates a log file for osquery status/result logs
// the logFile can be rotated by sending a `SIGHUP` signal to kolide if
// enableRotation is true
func osqueryLogFile(path string, appLogger kitlog.Logger, enableRotation bool) (io.Writer, error) {
if enableRotation {
osquerydLogger := &lumberjack.Logger{
Filename: path,
MaxSize: 500, // megabytes
MaxBackups: 3,
MaxAge: 28, //days
}
appLogger = kitlog.With(appLogger, "component", "osqueryd-logger")
sig := make(chan os.Signal)
signal.Notify(sig, syscall.SIGHUP)
go func() {
for {
<-sig //block on signal
if err := osquerydLogger.Rotate(); err != nil {
appLogger.Log("err", err)
}
}
}()
return osquerydLogger, nil
}
// no log rotation
return logwriter.New(path)
}
2016-08-28 03:59:17 +00:00
type service struct {
2017-09-01 16:42:46 +00:00
ds kolide.Datastore
resultStore kolide.QueryResultStore
logger kitlog.Logger
config config.KolideConfig
clock clock.Clock
osqueryStatusLogWriter io.Writer
osqueryResultLogWriter io.Writer
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
}