2016-12-13 22:22:05 +00:00
|
|
|
package mysql
|
|
|
|
|
|
|
|
import (
|
2018-06-15 14:13:11 +00:00
|
|
|
"database/sql"
|
|
|
|
|
2017-06-22 19:50:45 +00:00
|
|
|
"github.com/kolide/fleet/server/kolide"
|
2016-12-22 19:29:29 +00:00
|
|
|
"github.com/pkg/errors"
|
2016-12-13 22:22:05 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func (d *Datastore) ListScheduledQueriesInPack(id uint, opts kolide.ListOptions) ([]*kolide.ScheduledQuery, error) {
|
2016-12-22 19:29:29 +00:00
|
|
|
query := `
|
2018-01-03 19:18:05 +00:00
|
|
|
SELECT
|
2018-01-10 19:38:20 +00:00
|
|
|
sq.id,
|
|
|
|
sq.pack_id,
|
2018-06-22 00:06:44 +00:00
|
|
|
sq.name,
|
2018-01-10 19:38:20 +00:00
|
|
|
sq.query_name,
|
2018-06-22 00:06:44 +00:00
|
|
|
sq.description,
|
2018-01-10 19:38:20 +00:00
|
|
|
sq.interval,
|
|
|
|
sq.snapshot,
|
|
|
|
sq.removed,
|
2018-06-22 00:06:44 +00:00
|
|
|
sq.platform,
|
2018-01-10 19:38:20 +00:00
|
|
|
sq.version,
|
|
|
|
sq.shard,
|
|
|
|
q.query,
|
|
|
|
q.id AS query_id
|
2016-12-13 22:22:05 +00:00
|
|
|
FROM scheduled_queries sq
|
|
|
|
JOIN queries q
|
2018-01-03 19:18:05 +00:00
|
|
|
ON sq.query_name = q.name
|
2016-12-13 22:22:05 +00:00
|
|
|
WHERE sq.pack_id = ?
|
|
|
|
`
|
2016-12-22 19:29:29 +00:00
|
|
|
query = appendListOptionsToSQL(query, opts)
|
2016-12-13 22:22:05 +00:00
|
|
|
results := []*kolide.ScheduledQuery{}
|
|
|
|
|
2016-12-22 19:29:29 +00:00
|
|
|
if err := d.db.Select(&results, query, id); err != nil {
|
|
|
|
return nil, errors.Wrap(err, "listing scheduled queries")
|
2016-12-13 22:22:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return results, nil
|
|
|
|
}
|
2018-06-15 14:13:11 +00:00
|
|
|
|
|
|
|
func (d *Datastore) NewScheduledQuery(sq *kolide.ScheduledQuery, opts ...kolide.OptionalArg) (*kolide.ScheduledQuery, error) {
|
|
|
|
db := d.getTransaction(opts)
|
|
|
|
|
|
|
|
// This query looks up the query name using the ID (for backwards
|
|
|
|
// compatibility with the UI)
|
|
|
|
query := `
|
|
|
|
INSERT INTO scheduled_queries (
|
|
|
|
query_name,
|
2018-06-22 00:06:44 +00:00
|
|
|
name,
|
2018-06-15 14:13:11 +00:00
|
|
|
pack_id,
|
|
|
|
snapshot,
|
|
|
|
removed,
|
|
|
|
` + "`interval`" + `,
|
|
|
|
platform,
|
|
|
|
version,
|
|
|
|
shard
|
|
|
|
)
|
2018-06-22 00:06:44 +00:00
|
|
|
SELECT name, ?, ?, ?, ?, ?, ?, ?, ?
|
2018-06-15 14:13:11 +00:00
|
|
|
FROM queries
|
|
|
|
WHERE id = ?
|
|
|
|
`
|
2018-06-22 00:06:44 +00:00
|
|
|
result, err := db.Exec(query, sq.Name, sq.PackID, sq.Snapshot, sq.Removed, sq.Interval, sq.Platform, sq.Version, sq.Shard, sq.QueryID)
|
2018-06-15 14:13:11 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "inserting scheduled query")
|
|
|
|
}
|
|
|
|
|
|
|
|
id, _ := result.LastInsertId()
|
|
|
|
sq.ID = uint(id)
|
|
|
|
|
|
|
|
query = `SELECT query, name FROM queries WHERE id = ? LIMIT 1`
|
|
|
|
metadata := []struct {
|
|
|
|
Query string
|
|
|
|
Name string
|
|
|
|
}{}
|
|
|
|
|
|
|
|
err = db.Select(&metadata, query, sq.QueryID)
|
|
|
|
if err != nil && err == sql.ErrNoRows {
|
|
|
|
return nil, notFound("Query").WithID(sq.QueryID)
|
|
|
|
} else if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "select query by ID")
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(metadata) != 1 {
|
|
|
|
return nil, errors.Wrap(err, "wrong number of results returned from database")
|
|
|
|
}
|
|
|
|
|
|
|
|
sq.Query = metadata[0].Query
|
|
|
|
sq.Name = metadata[0].Name
|
|
|
|
|
|
|
|
return sq, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Datastore) SaveScheduledQuery(sq *kolide.ScheduledQuery) (*kolide.ScheduledQuery, error) {
|
|
|
|
query := `
|
|
|
|
UPDATE scheduled_queries
|
|
|
|
SET pack_id = ?, query_id = ?, ` + "`interval`" + ` = ?, snapshot = ?, removed = ?, platform = ?, version = ?, shard = ?
|
2020-10-22 17:51:26 +00:00
|
|
|
WHERE id = ?
|
2018-06-15 14:13:11 +00:00
|
|
|
`
|
|
|
|
result, err := d.db.Exec(query, sq.PackID, sq.QueryID, sq.Interval, sq.Snapshot, sq.Removed, sq.Platform, sq.Version, sq.Shard, sq.ID)
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "saving a scheduled query")
|
|
|
|
}
|
|
|
|
rows, err := result.RowsAffected()
|
|
|
|
if err != nil {
|
|
|
|
return nil, errors.Wrap(err, "rows affected saving a scheduled query")
|
|
|
|
}
|
|
|
|
if rows == 0 {
|
|
|
|
return nil, notFound("ScheduledQueries").WithID(sq.ID)
|
|
|
|
}
|
|
|
|
return sq, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Datastore) DeleteScheduledQuery(id uint) error {
|
|
|
|
return d.deleteEntity("scheduled_queries", id)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d *Datastore) ScheduledQuery(id uint) (*kolide.ScheduledQuery, error) {
|
|
|
|
query := `
|
|
|
|
SELECT
|
|
|
|
sq.id,
|
|
|
|
sq.created_at,
|
|
|
|
sq.updated_at,
|
|
|
|
sq.pack_id,
|
|
|
|
sq.interval,
|
|
|
|
sq.snapshot,
|
|
|
|
sq.removed,
|
|
|
|
sq.platform,
|
|
|
|
sq.version,
|
|
|
|
sq.shard,
|
|
|
|
sq.query_name,
|
2018-06-22 00:06:44 +00:00
|
|
|
sq.description,
|
2018-06-15 14:13:11 +00:00
|
|
|
q.query,
|
|
|
|
q.name,
|
|
|
|
q.id AS query_id
|
|
|
|
FROM scheduled_queries sq
|
|
|
|
JOIN queries q
|
|
|
|
ON sq.query_name = q.name
|
|
|
|
WHERE sq.id = ?
|
|
|
|
`
|
|
|
|
sq := &kolide.ScheduledQuery{}
|
|
|
|
if err := d.db.Get(sq, query, id); err != nil {
|
|
|
|
return nil, errors.Wrap(err, "selecting a scheduled query")
|
|
|
|
}
|
|
|
|
|
|
|
|
return sq, nil
|
|
|
|
}
|