osquery-1/osquery/database/query.h

273 lines
8.8 KiB
C
Raw Normal View History

/*
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
2015-05-12 06:31:13 +00:00
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
2014-07-31 00:35:19 +00:00
#pragma once
2014-07-31 00:35:19 +00:00
#include <memory>
#include <string>
#include <vector>
2014-07-31 00:35:19 +00:00
2015-04-27 21:57:04 +00:00
#include <osquery/status.h>
2015-05-24 01:52:42 +00:00
#include <osquery/database.h>
#include "osquery/database/db_handle.h"
2015-02-03 05:21:36 +00:00
2014-08-15 07:25:30 +00:00
namespace osquery {
2014-07-31 00:35:19 +00:00
2014-09-16 00:13:22 +00:00
/// Error message used when a query name isn't found in the database
2014-07-31 00:35:19 +00:00
extern const std::string kQueryNameNotFoundError;
/**
* @brief A class that is used to interact with the historical on-disk storage
* for a given query.
2014-09-16 00:13:22 +00:00
*/
2014-07-31 00:35:19 +00:00
class Query {
2014-08-15 07:25:30 +00:00
public:
/**
* @brief Constructor which sets up necessary parameters of a Query object
2014-09-16 00:13:22 +00:00
*
* Given a query, this constructor calculates the value of columnFamily_,
* which can be accessed via the getColumnFamilyName getter method.
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @param q a SheduledQuery struct
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
explicit Query(const std::string& name, const ScheduledQuery& q)
: query_(q), name_(name) {}
2014-07-31 00:35:19 +00:00
/////////////////////////////////////////////////////////////////////////////
// Getters and setters
/////////////////////////////////////////////////////////////////////////////
/**
* @brief Getter for the name of a given scheduled query
2014-09-16 00:13:22 +00:00
*
* @return the name of the scheduled query which is being operated on
2014-09-16 00:13:22 +00:00
*/
std::string getQueryName();
2014-07-31 00:35:19 +00:00
/**
* @brief Getter for the SQL query of a scheduled query
2014-09-16 00:13:22 +00:00
*
* @return the SQL of the scheduled query which is being operated on
2014-09-16 00:13:22 +00:00
*/
2014-07-31 00:35:19 +00:00
std::string getQuery();
/**
* @brief Getter for the interval of a scheduled query
2014-09-16 00:13:22 +00:00
*
* @return the interval of the scheduled query which is being operated on
2014-09-16 00:13:22 +00:00
*/
2014-07-31 00:35:19 +00:00
int getInterval();
/////////////////////////////////////////////////////////////////////////////
// Data access methods
/////////////////////////////////////////////////////////////////////////////
2014-08-15 07:25:30 +00:00
public:
/**
* @brief Serialize the data in RocksDB into a useful data structure
2014-09-16 00:13:22 +00:00
*
* This method retrieves the data from RocksDB and returns the data in a
* HistoricalQueryResults struct.
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @param hQR the output HistoricalQueryResults struct
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @return the success or failure of the operation
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
Status getPreviousQueryResults(QueryData& results);
2014-08-15 07:25:30 +00:00
private:
/**
* @brief Serialize the data in RocksDB into a useful data structure using a
2014-09-16 00:13:22 +00:00
* custom database handle
*
2015-04-27 21:57:04 +00:00
* This method is the same as getHistoricalQueryResults, but with the
* addition of a parameter which allows you to pass a custom RocksDB
2015-04-27 21:57:04 +00:00
* database handle.
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @param hQR the output HistoricalQueryResults struct
* @param db a shared pointer to a custom DBHandle
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @return the success or failure of the operation
* @see getHistoricalQueryResults
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
Status getPreviousQueryResults(QueryData& results, DBHandleRef db);
2014-07-31 00:35:19 +00:00
2014-08-15 07:25:30 +00:00
public:
/**
* @brief Get the names of all historical queries that are stored in RocksDB
2014-09-16 00:13:22 +00:00
*
* If you'd like to perform some database maintenance, getStoredQueryNames()
* allows you to get a vector of the names of all queries which are
* currently stored in RocksDB
2014-09-16 00:13:22 +00:00
*
* @return a vector containing the string names of all scheduled queries
* which currently exist in the database
2014-09-16 00:13:22 +00:00
*/
2014-07-31 00:35:19 +00:00
static std::vector<std::string> getStoredQueryNames();
2014-08-15 07:25:30 +00:00
private:
/**
* @brief Get the names of all historical queries that are stored in RocksDB
* using a custom database handle
2014-09-16 00:13:22 +00:00
*
* This method is the same as getStoredQueryNames(), but with the addition
* of a parameter which allows you to pass a custom RocksDB database handle.
2014-09-16 00:13:22 +00:00
*
* @param db a custom RocksDB database handle
2014-09-16 00:13:22 +00:00
*
* @return a vector containing the string names of all scheduled queries
2014-09-16 00:13:22 +00:00
*
* @see getStoredQueryNames()
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
static std::vector<std::string> getStoredQueryNames(DBHandleRef db);
2014-07-31 00:35:19 +00:00
2014-08-15 07:25:30 +00:00
public:
/**
* @brief Accessor method for checking if a given scheduled query exists in
* the database
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @return does the scheduled query which is already exists in the database
2014-09-16 00:13:22 +00:00
*/
2014-07-31 00:35:19 +00:00
bool isQueryNameInDatabase();
2014-08-15 07:25:30 +00:00
private:
/**
* @brief Accessor method for checking if a given scheduled query exists in
* the database, using a custom database handle
2014-09-16 00:13:22 +00:00
*
* This method is the same as isQueryNameInDatabase(), but with the addition
* of a parameter which allows you to pass a custom RocksDB database handle
2014-09-16 00:13:22 +00:00
*
* @param db a custom RocksDB database handle
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @return does the scheduled query which is already exists in the database
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
bool isQueryNameInDatabase(DBHandleRef db);
2014-07-31 00:35:19 +00:00
2014-08-15 07:25:30 +00:00
public:
/**
* @brief Add a new set of results to the persistant storage
2014-09-16 00:13:22 +00:00
*
* Given the results of the execution of a scheduled query, add the results
* to the database using addNewResults
2014-09-16 00:13:22 +00:00
*
* @param qd the QueryData object, which has the results of the query which
* you would like to store
* @param unix_time the time that the query was executed
2014-09-16 00:13:22 +00:00
*
* @return an instance of osquery::Status indicating the success or failure
* of the operation
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
Status addNewResults(const QueryData& qd);
2014-08-15 07:25:30 +00:00
private:
/**
* @brief Add a new set of results to the persistant storage using a custom
* database handle
2014-09-16 00:13:22 +00:00
*
* This method is the same as addNewResults(), but with the addition of a
* parameter which allows you to pass a custom RocksDB database handle
2014-09-16 00:13:22 +00:00
*
* @param qd the QueryData object, which has the results of the query which
* you would like to store
* @param unix_time the time that the query was executed
* @param db a custom RocksDB database handle
2014-09-16 00:13:22 +00:00
*
* @return an instance of osquery::Status indicating the success or failure
* of the operation
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
Status addNewResults(const QueryData& qd, DBHandleRef db);
2014-08-15 07:25:30 +00:00
public:
/**
2015-04-27 21:57:04 +00:00
* @brief Add a new set of results to the persistent storage and get back
* the differential results.
*
2015-04-27 21:57:04 +00:00
* Given the results of an execution of a scheduled query, add the results
* to the database using addNewResults and get back a data structure
* indicating what rows in the query's results have changed.
*
2015-04-27 21:57:04 +00:00
* @param qd the QueryData object containing query results to store
* @param dr an output to a DiffResults object populated based on last run
*
2015-04-27 21:57:04 +00:00
* @return the success or failure of the operation
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
Status addNewResults(const QueryData& qd, DiffResults& dr);
2014-08-15 07:25:30 +00:00
private:
/**
2015-04-27 21:57:04 +00:00
* @brief Add a new set of results to the persistent storage and get back
* the differential results, using a custom database handle.
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* This method is the same as Query::addNewResults, but with the addition of a
2014-09-16 00:13:22 +00:00
* parameter which allows you to pass a custom RocksDB database handle
*
2015-04-27 21:57:04 +00:00
* @param qd the QueryData object containing query results to store
* @param dr an output to a DiffResults object populated based on last run
*
2015-04-27 21:57:04 +00:00
* @return the success or failure of the operation
2014-09-16 00:13:22 +00:00
*/
Status addNewResults(const QueryData& qd,
DiffResults& dr,
bool calculate_diff,
2015-04-27 21:57:04 +00:00
DBHandleRef db);
2014-07-31 00:35:19 +00:00
2014-08-15 07:25:30 +00:00
public:
/**
* @brief A getter for the most recent result set for a scheduled query
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @param qd the output QueryData object
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @return the success or failure of the operation
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
Status getCurrentResults(QueryData& qd);
2014-07-31 00:35:19 +00:00
2014-08-15 07:25:30 +00:00
private:
/**
* @brief A getter for the most recent result set for a scheduled query,
* but with the addition of a parameter which allows you to pass a custom
2015-04-27 21:57:04 +00:00
* RocksDB database handle.
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* This method is the same as Query::getCurrentResults, but with addition of a
* parameter which allows you to pass a custom RocksDB database handle.
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @param qd the output QueryData object
* @param db a custom RocksDB database handle
2014-09-16 00:13:22 +00:00
*
2015-04-27 21:57:04 +00:00
* @return the success or failure of the operation
2014-09-16 00:13:22 +00:00
*/
2015-04-27 21:57:04 +00:00
Status getCurrentResults(QueryData& qd, DBHandleRef db);
2014-08-15 07:25:30 +00:00
private:
2014-07-31 00:35:19 +00:00
/////////////////////////////////////////////////////////////////////////////
// Private members
/////////////////////////////////////////////////////////////////////////////
/// The scheduled query and internal
ScheduledQuery query_;
/// The scheduled query name.
std::string name_;
2014-07-31 00:35:19 +00:00
2014-08-15 07:25:30 +00:00
private:
2014-07-31 00:35:19 +00:00
/////////////////////////////////////////////////////////////////////////////
// Unit tests which can access private members
/////////////////////////////////////////////////////////////////////////////
FRIEND_TEST(QueryTests, test_private_members);
FRIEND_TEST(QueryTests, test_add_and_get_current_results);
FRIEND_TEST(QueryTests, test_is_query_name_in_database);
FRIEND_TEST(QueryTests, test_get_stored_query_names);
FRIEND_TEST(QueryTests, test_get_executions);
2015-04-27 21:57:04 +00:00
FRIEND_TEST(QueryTests, test_get_query_results);
2014-07-31 00:35:19 +00:00
FRIEND_TEST(QueryTests, test_query_name_not_found_in_db);
};
2014-08-15 07:25:30 +00:00
}