Added built in labels (#526)

This commit is contained in:
John Murphy 2016-11-26 02:08:22 +08:00 committed by GitHub
parent 46dee08ab3
commit 44ef92550f
22 changed files with 600 additions and 360 deletions

View file

@ -7,7 +7,6 @@ import (
"os"
"os/signal"
"syscall"
"time"
"github.com/WatchBeam/clock"
kitlog "github.com/go-kit/kit/log"
@ -25,6 +24,12 @@ import (
"golang.org/x/net/context"
)
type initializer interface {
// Initialize is used to populate a datastore with
// preloaded data
Initialize() error
}
func createServeCmd(configManager config.Manager) *cobra.Command {
var devMode = false
@ -67,7 +72,7 @@ the way that the kolide server works.
"Warning: Changes will not be saved across process restarts. This should NOT be used in production.",
)
if ds, err = inmem.New(); err != nil {
if ds, err = inmem.New(config); err != nil {
initFatal(err, "initializing inmem database")
}
} else {
@ -79,7 +84,12 @@ the way that the kolide server works.
if err != nil {
initFatal(err, "initializing datastore")
}
}
if initializingDS, ok := ds.(initializer); ok {
if err := initializingDS.Initialize(); err != nil {
initFatal(err, "loading built in data")
}
}
svc, err := service.NewService(ds, pubsub.NewInmemQueryResults(), logger, config, mailService, clock.C)
@ -87,15 +97,6 @@ the way that the kolide server works.
initFatal(err, "initializing service")
}
if devMode {
createDevUsers(ds, config)
createDevHosts(ds, config)
createDevQueries(ds, config)
createDevLabels(ds, config)
createDevOrgInfo(ds, config)
createDevPacksAndQueries(ds, config)
}
fieldKeys := []string{"method", "error"}
requestCount := kitprometheus.NewCounterFrom(prometheus.CounterOpts{
Namespace: "api",
@ -190,298 +191,3 @@ func createDevMailService(config config.KolideConfig) kolide.MailService {
}
return devMailService{}
}
// Bootstrap a few users when using the in-memory database.
// Each user's default password will just be their username.
func createDevUsers(ds kolide.Datastore, config config.KolideConfig) {
users := []kolide.User{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 10, 0, 0, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 27, 10, 0, 0, 0, time.UTC),
},
},
Name: "Admin User",
Username: "admin",
Email: "admin@kolide.co",
Position: "Director of Security",
Admin: true,
Enabled: true,
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().Add(-3 * time.Hour),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().Add(-1 * time.Hour),
},
},
Name: "Normal User",
Username: "user",
Email: "user@kolide.co",
Position: "Security Engineer",
Admin: false,
Enabled: true,
},
}
for _, user := range users {
user := user
err := user.SetPassword(user.Username, config.Auth.SaltKeySize, config.Auth.BcryptCost)
if err != nil {
initFatal(err, "creating bootstrap user")
}
_, err = ds.NewUser(&user)
if err != nil {
initFatal(err, "creating bootstrap user")
}
}
}
// Bootstrap a few hosts when using the in-memory database.
func createDevHosts(ds kolide.Datastore, config config.KolideConfig) {
hosts := []kolide.Host{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 10, 0, 0, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().Add(-20 * time.Minute),
},
},
NodeKey: "totally-legit",
HostName: "jmeller-mbp.local",
UUID: "1234-5678-9101",
Platform: "darwin",
OsqueryVersion: "2.0.0",
OSVersion: "Mac OS X 10.11.6",
Uptime: 60 * time.Minute,
PhysicalMemory: 4145483776,
PrimaryMAC: "C0:11:1B:13:3E:15",
PrimaryIP: "192.168.1.10",
DetailUpdateTime: time.Now().Add(-20 * time.Minute),
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 4, 3, 10, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 27, 4, 3, 10, 0, time.UTC),
},
},
NodeKey: "definitely-legit",
HostName: "marpaia.local",
UUID: "1234-5678-9102",
Platform: "windows",
OsqueryVersion: "2.0.0",
OSVersion: "Windows 10.0.0",
Uptime: 60 * time.Minute,
PhysicalMemory: 17179869184,
PrimaryMAC: "7e:5c:be:ef:b4:df",
PrimaryIP: "192.168.1.11",
DetailUpdateTime: time.Now().Add(-10 * time.Second),
},
}
for _, host := range hosts {
host := host
_, err := ds.NewHost(&host)
if err != nil {
initFatal(err, "creating bootstrap host")
}
}
}
func createDevOrgInfo(ds kolide.Datastore, config config.KolideConfig) {
devOrgInfo := &kolide.AppConfig{
OrgName: "Kolide",
OrgLogoURL: fmt.Sprintf("%s/logo.png", config.Server.Address),
}
_, err := ds.NewAppConfig(devOrgInfo)
if err != nil {
initFatal(err, "creating fake org info")
}
}
func createDevQueries(ds kolide.Datastore, config config.KolideConfig) {
queries := []kolide.Query{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 17, 7, 6, 0, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 17, 7, 6, 0, 0, time.UTC),
},
},
Name: "dev_query_1",
Query: "select * from processes",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 4, 3, 10, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 27, 4, 3, 10, 0, time.UTC),
},
},
Name: "dev_query_2",
Query: "select * from time",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().Add(-24 * time.Hour),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().Add(-17 * time.Hour),
},
},
Name: "dev_query_3",
Query: "select * from cpuid",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().Add(-1 * time.Hour),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().Add(-30 * time.Hour),
},
},
Name: "dev_query_4",
Query: "select 1 from processes where name like '%Apache%'",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now(),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now(),
},
},
Name: "dev_query_5",
Query: "select 1 from osquery_info where build_platform='darwin'",
},
}
for _, query := range queries {
query := query
_, err := ds.NewQuery(&query)
if err != nil {
initFatal(err, "creating bootstrap query")
}
}
}
func createDevLabels(ds kolide.Datastore, config config.KolideConfig) {
labels := []kolide.Label{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 8, 31, 16, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 27, 8, 31, 16, 0, time.UTC),
},
},
Name: "dev_label_apache",
Query: "select * from processes where name like '%Apache%'",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().Add(-1 * time.Hour),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now(),
},
},
Name: "dev_label_darwin",
Query: "select * from osquery_info where build_platform='darwin'",
},
}
for _, label := range labels {
label := label
_, err := ds.NewLabel(&label)
if err != nil {
initFatal(err, "creating bootstrap label")
}
}
}
func createDevPacksAndQueries(ds kolide.Datastore, config config.KolideConfig) {
query1 := &kolide.Query{
Name: "Osquery Info",
Query: "select * from osquery_info",
}
query1, err := ds.NewQuery(query1)
if err != nil {
initFatal(err, "creating dev queries")
}
query2 := &kolide.Query{
Name: "Launchd",
Query: "select * from launchd",
Platform: "darwin",
}
query2, err = ds.NewQuery(query2)
if err != nil {
initFatal(err, "creating dev queries")
}
query3 := &kolide.Query{
Name: "registry",
Query: "select * from osquery_registry",
}
query3, err = ds.NewQuery(query3)
if err != nil {
initFatal(err, "creating dev queries")
}
pack1 := &kolide.Pack{
Name: "Osquery Internal Info",
}
pack1, err = ds.NewPack(pack1)
if err != nil {
initFatal(err, "creating dev packs")
}
pack2 := &kolide.Pack{
Name: "macOS Attacks",
}
pack2, err = ds.NewPack(pack2)
if err != nil {
initFatal(err, "creating dev packs")
}
err = ds.AddQueryToPack(query1.ID, pack1.ID)
if err != nil {
initFatal(err, "creating dev packs")
}
err = ds.AddQueryToPack(query3.ID, pack1.ID)
if err != nil {
initFatal(err, "creating dev packs")
}
err = ds.AddQueryToPack(query2.ID, pack2.ID)
if err != nil {
initFatal(err, "creating dev packs")
}
}

View file

@ -6,6 +6,8 @@ import (
"testing"
"time"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/datastore/mysql"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@ -276,6 +278,22 @@ func testListHostsInLabel(t *testing.T, db kolide.Datastore) {
}
}
func testBuiltInLabels(t *testing.T, db kolide.Datastore) {
if i, ok := db.(*mysql.Datastore); ok {
err := i.Initialize()
require.Nil(t, err)
}
if i, ok := db.(*inmem.Datastore); ok {
err := i.Initialize()
require.Nil(t, err)
}
hits, err := db.SearchLabels("Mac OS X")
require.Nil(t, err)
assert.Equal(t, 1, len(hits))
assert.Equal(t, kolide.LabelTypeBuiltIn, hits[0].LabelType)
}
func testListUniqueHostsInLabels(t *testing.T, db kolide.Datastore) {
h1, err := db.NewHost(&kolide.Host{
DetailUpdateTime: time.Now(),

View file

@ -47,4 +47,5 @@ var testFunctions = [...]func(*testing.T, kolide.Datastore){
testListHost,
testGetHostsInPack,
testDistributedQueryCampaign,
testBuiltInLabels,
}

View file

@ -2,9 +2,12 @@ package inmem
import (
"errors"
"fmt"
"reflect"
"sync"
"time"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/patrickmn/sortutil"
)
@ -30,11 +33,13 @@ type Datastore struct {
distributedQueryCampaignTargets map[uint]kolide.DistributedQueryCampaignTarget
orginfo *kolide.AppConfig
config *config.KolideConfig
}
func New() (*Datastore, error) {
func New(config config.KolideConfig) (*Datastore, error) {
ds := &Datastore{
Driver: "inmem",
config: &config,
}
if err := ds.Migrate(); err != nil {
@ -88,6 +93,38 @@ func (orm *Datastore) Drop() error {
return orm.Migrate()
}
func (orm *Datastore) Initialize() error {
if err := orm.createBuiltinLabels(); err != nil {
return err
}
if err := orm.createDevUsers(); err != nil {
return err
}
if err := orm.createDevHosts(); err != nil {
return err
}
if err := orm.createDevQueries(); err != nil {
return err
}
if err := orm.createDevLabels(); err != nil {
return err
}
if err := orm.createDevOrgInfo(); err != nil {
return err
}
if err := orm.createDevPacksAndQueries(); err != nil {
return err
}
return nil
}
// getLimitOffsetSliceBounds returns the bounds that should be used for
// re-slicing the results to comply with the requested ListOptions. Lack of
// generics forces us to do this rather than reslicing in this method.
@ -115,3 +152,394 @@ func (orm *Datastore) nextID(val interface{}) uint {
orm.nextIDs[valType]++
return orm.nextIDs[valType]
}
func (orm *Datastore) createDevPacksAndQueries() error {
query1 := &kolide.Query{
Name: "Osquery Info",
Query: "select * from osquery_info",
}
query1, err := orm.NewQuery(query1)
if err != nil {
return err
}
query2 := &kolide.Query{
Name: "Launchd",
Query: "select * from launchd",
Platform: "darwin",
}
query2, err = orm.NewQuery(query2)
if err != nil {
return err
}
query3 := &kolide.Query{
Name: "registry",
Query: "select * from osquery_registry",
}
query3, err = orm.NewQuery(query3)
if err != nil {
return err
}
pack1 := &kolide.Pack{
Name: "Osquery Internal Info",
}
pack1, err = orm.NewPack(pack1)
if err != nil {
return err
}
pack2 := &kolide.Pack{
Name: "macOS Attacks",
}
pack2, err = orm.NewPack(pack2)
if err != nil {
return err
}
err = orm.AddQueryToPack(query1.ID, pack1.ID)
if err != nil {
return err
}
err = orm.AddQueryToPack(query3.ID, pack1.ID)
if err != nil {
return err
}
err = orm.AddQueryToPack(query2.ID, pack2.ID)
if err != nil {
return err
}
return nil
}
func (orm *Datastore) createBuiltinLabels() error {
labels := []kolide.Label{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().UTC(),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().UTC(),
},
},
Platform: "darwin",
Name: "Mac OS X",
Query: "select 1 from osquery_info where build_platform = 'darwin';",
LabelType: kolide.LabelTypeBuiltIn,
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().UTC(),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().UTC(),
},
},
Platform: "ubuntu",
Name: "Ubuntu Linux",
Query: "select 1 from osquery_info where build_platform = 'ubuntu';",
LabelType: kolide.LabelTypeBuiltIn,
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().UTC(),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().UTC(),
},
},
Platform: "centos",
Name: "CentOS Linux",
Query: "select 1 from osquery_info where build_platform = 'centos';",
LabelType: kolide.LabelTypeBuiltIn,
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().UTC(),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().UTC(),
},
},
Platform: "windows",
Name: "MS Windows",
Query: "select 1 from osquery_info where build_platform = 'windows';",
LabelType: kolide.LabelTypeBuiltIn,
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().UTC(),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().UTC(),
},
},
Platform: "all",
Name: "All Hosts",
Query: "select 1;",
LabelType: kolide.LabelTypeBuiltIn,
},
}
for _, label := range labels {
label := label
_, err := orm.NewLabel(&label)
if err != nil {
return err
}
}
return nil
}
// Bootstrap a few users when using the in-memory database.
// Each user's default password will just be their username.
func (orm *Datastore) createDevUsers() error {
users := []kolide.User{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 10, 0, 0, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 27, 10, 0, 0, 0, time.UTC),
},
},
Name: "Admin User",
Username: "admin",
Email: "admin@kolide.co",
Position: "Director of Security",
Admin: true,
Enabled: true,
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().Add(-3 * time.Hour),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().Add(-1 * time.Hour),
},
},
Name: "Normal User",
Username: "user",
Email: "user@kolide.co",
Position: "Security Engineer",
Admin: false,
Enabled: true,
},
}
for _, user := range users {
user := user
err := user.SetPassword(user.Username, orm.config.Auth.SaltKeySize, orm.config.Auth.BcryptCost)
if err != nil {
return nil
}
_, err = orm.NewUser(&user)
if err != nil {
return err
}
}
return nil
}
func (orm *Datastore) createDevQueries() error {
queries := []kolide.Query{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 17, 7, 6, 0, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 17, 7, 6, 0, 0, time.UTC),
},
},
Name: "dev_query_1",
Query: "select * from processes",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 4, 3, 10, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 27, 4, 3, 10, 0, time.UTC),
},
},
Name: "dev_query_2",
Query: "select * from time",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().Add(-24 * time.Hour),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().Add(-17 * time.Hour),
},
},
Name: "dev_query_3",
Query: "select * from cpuid",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().Add(-1 * time.Hour),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().Add(-30 * time.Hour),
},
},
Name: "dev_query_4",
Query: "select 1 from processes where name like '%Apache%'",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now(),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now(),
},
},
Name: "dev_query_5",
Query: "select 1 from osquery_info where build_platform='darwin'",
},
}
for _, query := range queries {
query := query
_, err := orm.NewQuery(&query)
if err != nil {
return err
}
}
return nil
}
// Bootstrap a few hosts when using the in-memory database.
func (orm *Datastore) createDevHosts() error {
hosts := []kolide.Host{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 10, 0, 0, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now().Add(-20 * time.Minute),
},
},
NodeKey: "totally-legit",
HostName: "jmeller-mbp.local",
UUID: "1234-5678-9101",
Platform: "darwin",
OsqueryVersion: "2.0.0",
OSVersion: "Mac OS X 10.11.6",
Uptime: 60 * time.Minute,
PhysicalMemory: 4145483776,
PrimaryMAC: "C0:11:1B:13:3E:15",
PrimaryIP: "192.168.1.10",
DetailUpdateTime: time.Now().Add(-20 * time.Minute),
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 4, 3, 10, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 27, 4, 3, 10, 0, time.UTC),
},
},
NodeKey: "definitely-legit",
HostName: "marpaia.local",
UUID: "1234-5678-9102",
Platform: "windows",
OsqueryVersion: "2.0.0",
OSVersion: "Windows 10.0.0",
Uptime: 60 * time.Minute,
PhysicalMemory: 17179869184,
PrimaryMAC: "7e:5c:be:ef:b4:df",
PrimaryIP: "192.168.1.11",
DetailUpdateTime: time.Now().Add(-10 * time.Second),
},
}
for _, host := range hosts {
host := host
_, err := orm.NewHost(&host)
if err != nil {
return err
}
}
return nil
}
func (orm *Datastore) createDevOrgInfo() error {
devOrgInfo := &kolide.AppConfig{
OrgName: "Kolide",
OrgLogoURL: fmt.Sprintf("%s/logo.png", orm.config.Server.Address),
}
_, err := orm.NewAppConfig(devOrgInfo)
if err != nil {
return err
}
return nil
}
func (orm *Datastore) createDevLabels() error {
labels := []kolide.Label{
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Date(2016, time.October, 27, 8, 31, 16, 0, time.UTC),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Date(2016, time.October, 27, 8, 31, 16, 0, time.UTC),
},
},
Name: "dev_label_apache",
Query: "select * from processes where name like '%Apache%'",
},
{
UpdateCreateTimestamps: kolide.UpdateCreateTimestamps{
CreateTimestamp: kolide.CreateTimestamp{
CreatedAt: time.Now().Add(-1 * time.Hour),
},
UpdateTimestamp: kolide.UpdateTimestamp{
UpdatedAt: time.Now(),
},
},
Name: "dev_label_darwin",
Query: "select * from osquery_info where build_platform='darwin'",
},
}
for _, label := range labels {
label := label
_, err := orm.NewLabel(&label)
if err != nil {
return err
}
}
return nil
}

View file

@ -3,6 +3,7 @@ package datastore
import (
"testing"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/stretchr/testify/require"
)
@ -11,7 +12,7 @@ func TestInmem(t *testing.T) {
for _, f := range testFunctions {
t.Run(functionName(f), func(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
defer func() { require.Nil(t, ds.Drop()) }()
require.Nil(t, err)
f(t, ds)

View file

@ -83,6 +83,14 @@ func (d *Datastore) Migrate() error {
}
// Initialize preload data needed by the application
func (d *Datastore) Initialize() error {
if err := d.createBuiltinLabels(); err != nil {
return err
}
return nil
}
// Drop removes database
func (d *Datastore) Drop() error {
goose.SetDialect("mysql")
@ -152,3 +160,54 @@ func GetMysqlConnectionString(conf config.MysqlConfig) string {
conf.Database,
)
}
func (d *Datastore) createBuiltinLabels() error {
// Nuke built in labels and recreate them
_, err := d.db.Exec("DELETE from labels WHERE label_type = ?", kolide.LabelTypeBuiltIn)
if err != nil {
return err
}
labels := []kolide.Label{
{
Platform: "darwin",
Name: "Mac OS X",
Query: "select 1 from osquery_info where build_platform = 'darwin';",
LabelType: kolide.LabelTypeBuiltIn,
},
{
Platform: "ubuntu",
Name: "Ubuntu Linux",
Query: "select 1 from osquery_info where build_platform = 'ubuntu';",
LabelType: kolide.LabelTypeBuiltIn,
},
{
Platform: "centos",
Name: "CentOS Linux",
Query: "select 1 from osquery_info where build_platform = 'centos';",
LabelType: kolide.LabelTypeBuiltIn,
},
{
Platform: "windows",
Name: "MS Windows",
Query: "select 1 from osquery_info where build_platform = 'windows';",
LabelType: kolide.LabelTypeBuiltIn,
},
{
Platform: "all",
Name: "All Hosts",
Query: "select 1;",
LabelType: kolide.LabelTypeBuiltIn,
},
}
for _, label := range labels {
_, err = d.NewLabel(&label)
if err != nil {
return err
}
}
return nil
}

View file

@ -17,10 +17,11 @@ func (d *Datastore) NewLabel(label *kolide.Label) (*kolide.Label, error) {
name,
description,
query,
platform
) VALUES ( ?, ?, ?, ?)
platform,
label_type
) VALUES ( ?, ?, ?, ?, ?)
`
result, err := d.db.Exec(sql, label.Name, label.Description, label.Query, label.Platform)
result, err := d.db.Exec(sql, label.Name, label.Description, label.Query, label.Platform, label.LabelType)
if err != nil {
return nil, errors.DatabaseError(err)
}

View file

@ -2,7 +2,9 @@ package migration
import (
"database/sql"
"fmt"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/pressly/goose"
)
@ -22,6 +24,7 @@ func Up_20161118212557(tx *sql.Tx) error {
"`description` varchar(255) DEFAULT NULL," +
"`query` varchar(255) NOT NULL," +
"`platform` varchar(255) DEFAULT NULL," +
fmt.Sprintf("`label_type` INT UNSIGNED NOT NULL DEFAULT %d,", kolide.LabelTypeDefault) +
"PRIMARY KEY (`id`)," +
"UNIQUE KEY `idx_label_unique_name` (`name`)," +
"FULLTEXT KEY `labels_search` (`name`)" +

View file

@ -49,14 +49,26 @@ type LabelPayload struct {
Description *string `json:"description"`
}
// LabelType is used to catagorize the kind of label
type LabelType uint
const (
// LabelTypeDefault - the label can change, this is the default
LabelTypeDefault LabelType = iota
// LabelTypeBuiltIn - this type of label is created by Kolide on start up
// and can't be removed by end user.
LabelTypeBuiltIn
)
type Label struct {
UpdateCreateTimestamps
DeleteFields
ID uint `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Query string `json:"query"`
Platform string `json:"platform"`
ID uint `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Query string `json:"query"`
Platform string `json:"platform"`
LabelType LabelType `json:"label_type" db:"label_type"`
}
type LabelQueryExecution struct {

View file

@ -4,6 +4,7 @@ import (
"testing"
"github.com/go-kit/kit/endpoint"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/contexts/viewer"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
@ -17,7 +18,7 @@ import (
// permissions to access or modify resources
func TestEndpointPermissions(t *testing.T) {
req := struct{}{}
ds, _ := inmem.New()
ds, _ := inmem.New(config.TestConfig())
createTestUsers(t, ds)
admin1, _ := ds.User("admin1")
user1, _ := ds.User("user1")
@ -184,7 +185,7 @@ func TestGetNodeKey(t *testing.T) {
}
func TestAuthenticatedHost(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
svc, err := newTestService(ds, nil)
require.Nil(t, err)

View file

@ -6,13 +6,14 @@ import (
"testing"
"github.com/gorilla/mux"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"
)
func TestAPIRoutes(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)

View file

@ -15,6 +15,7 @@ import (
kitlog "github.com/go-kit/kit/log"
kithttp "github.com/go-kit/kit/transport/http"
"github.com/gorilla/mux"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
@ -23,7 +24,7 @@ import (
)
func TestLogin(t *testing.T) {
ds, _ := inmem.New()
ds, _ := inmem.New(config.TestConfig())
svc, _ := newTestService(ds, nil)
users := createTestUsers(t, ds)
logger := kitlog.NewLogfmtLogger(os.Stdout)

View file

@ -3,6 +3,7 @@ package service
import (
"testing"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
@ -11,7 +12,7 @@ import (
)
func TestCreateAppConfig(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
svc, err := newTestService(ds, nil)
require.Nil(t, err)

View file

@ -3,6 +3,7 @@ package service
import (
"testing"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
@ -10,7 +11,7 @@ import (
)
func TestListHosts(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -33,7 +34,7 @@ func TestListHosts(t *testing.T) {
}
func TestGetHost(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -54,7 +55,7 @@ func TestGetHost(t *testing.T) {
}
func TestDeleteHost(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)

View file

@ -14,7 +14,7 @@ import (
)
func TestInviteNewUser(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
createTestUsers(t, ds)
assert.Nil(t, err)
nosuchAdminID := uint(999)

View file

@ -3,6 +3,7 @@ package service
import (
"testing"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
@ -10,7 +11,7 @@ import (
)
func TestListLabels(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -35,7 +36,7 @@ func TestListLabels(t *testing.T) {
}
func TestGetLabel(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -57,7 +58,7 @@ func TestGetLabel(t *testing.T) {
}
func TestNewLabel(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -82,7 +83,7 @@ func TestNewLabel(t *testing.T) {
}
func TestDeleteLabel(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)

View file

@ -13,6 +13,7 @@ import (
"golang.org/x/net/context"
"github.com/WatchBeam/clock"
"github.com/kolide/kolide-ose/server/config"
hostctx "github.com/kolide/kolide-ose/server/contexts/host"
"github.com/kolide/kolide-ose/server/contexts/viewer"
"github.com/kolide/kolide-ose/server/datastore/inmem"
@ -23,7 +24,7 @@ import (
)
func TestEnrollAgent(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -45,7 +46,7 @@ func TestEnrollAgent(t *testing.T) {
}
func TestEnrollAgentIncorrectEnrollSecret(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -67,7 +68,7 @@ func TestEnrollAgentIncorrectEnrollSecret(t *testing.T) {
}
func TestSubmitStatusLogs(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
mockClock := clock.NewMockClock()
@ -139,7 +140,7 @@ func TestSubmitStatusLogs(t *testing.T) {
}
func TestSubmitResultLogs(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
mockClock := clock.NewMockClock()
@ -247,7 +248,7 @@ func TestHostDetailQueries(t *testing.T) {
}
func TestLabelQueries(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
mockClock := clock.NewMockClock()
@ -374,7 +375,7 @@ func TestLabelQueries(t *testing.T) {
}
func TestGetClientConfig(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
mockClock := clock.NewMockClock()
@ -455,7 +456,7 @@ func TestGetClientConfig(t *testing.T) {
}
func TestDetailQueries(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
mockClock := clock.NewMockClock()
@ -597,7 +598,7 @@ func TestDetailQueries(t *testing.T) {
}
func TestDistributedQueries(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
mockClock := clock.NewMockClock()

View file

@ -3,6 +3,7 @@ package service
import (
"testing"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
@ -10,7 +11,7 @@ import (
)
func TestListPacks(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -33,7 +34,7 @@ func TestListPacks(t *testing.T) {
}
func TestGetPack(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -55,7 +56,7 @@ func TestGetPack(t *testing.T) {
}
func TestNewPack(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -76,7 +77,7 @@ func TestNewPack(t *testing.T) {
}
func TestModifyPack(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -102,7 +103,7 @@ func TestModifyPack(t *testing.T) {
}
func TestDeletePack(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -127,7 +128,7 @@ func TestDeletePack(t *testing.T) {
}
func TestAddQueryToPack(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -163,7 +164,7 @@ func TestAddQueryToPack(t *testing.T) {
}
func TestGetQueriesInPack(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -195,7 +196,7 @@ func TestGetQueriesInPack(t *testing.T) {
}
func TestRemoveQueryFromPack(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)

View file

@ -3,6 +3,7 @@ package service
import (
"testing"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
@ -10,7 +11,7 @@ import (
)
func TestListQueries(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -34,7 +35,7 @@ func TestListQueries(t *testing.T) {
}
func TestGetQuery(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -57,7 +58,7 @@ func TestGetQuery(t *testing.T) {
}
func TestNewQuery(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -80,7 +81,7 @@ func TestNewQuery(t *testing.T) {
}
func TestModifyQuery(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -107,7 +108,7 @@ func TestModifyQuery(t *testing.T) {
}
func TestDeleteQuery(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
svc, err := newTestService(ds, nil)

View file

@ -4,6 +4,7 @@ import (
"testing"
"time"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
@ -14,7 +15,7 @@ import (
const bcryptCost = 6
func TestAuthenticate(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
svc, err := newTestService(ds, nil)
require.Nil(t, err)

View file

@ -6,6 +6,7 @@ import (
"time"
"github.com/WatchBeam/clock"
"github.com/kolide/kolide-ose/server/config"
"github.com/kolide/kolide-ose/server/datastore/inmem"
"github.com/kolide/kolide-ose/server/kolide"
"github.com/stretchr/testify/assert"
@ -14,7 +15,7 @@ import (
)
func TestSearchTargets(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -45,7 +46,7 @@ func TestSearchTargets(t *testing.T) {
}
func TestCountHostsInTargets(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
mockClock := clock.NewMockClock()
@ -162,7 +163,7 @@ func TestCountHostsInTargets(t *testing.T) {
}
func TestSearchWithOmit(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -214,7 +215,7 @@ func TestSearchWithOmit(t *testing.T) {
}
func TestSearchHostsInLabels(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
svc, err := newTestService(ds, nil)
@ -267,7 +268,7 @@ func TestSearchHostsInLabels(t *testing.T) {
}
func TestSearchResultsLimit(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
require.Nil(t, err)
svc, err := newTestService(ds, nil)

View file

@ -18,7 +18,7 @@ import (
)
func TestAuthenticatedUser(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
createTestUsers(t, ds)
svc, err := newTestService(ds, nil)
@ -34,7 +34,7 @@ func TestAuthenticatedUser(t *testing.T) {
}
func TestRequestPasswordReset(t *testing.T) {
ds, err := inmem.New()
ds, err := inmem.New(config.TestConfig())
assert.Nil(t, err)
createTestUsers(t, ds)
admin1, err := ds.User("admin1")
@ -114,7 +114,7 @@ func TestRequestPasswordReset(t *testing.T) {
}
func TestCreateUser(t *testing.T) {
ds, _ := inmem.New()
ds, _ := inmem.New(config.TestConfig())
svc, _ := newTestService(ds, nil)
invites := setupInvites(t, ds, []string{"admin2@example.com"})
ctx := context.Background()
@ -245,7 +245,7 @@ func setupInvites(t *testing.T, ds kolide.Datastore, emails []string) map[string
}
func TestChangeUserPassword(t *testing.T) {
ds, _ := inmem.New()
ds, _ := inmem.New(config.TestConfig())
svc, _ := newTestService(ds, nil)
createTestUsers(t, ds)
var passwordChangeTests = []struct {