Ejemplo n.º 1
0
void SchedulerRunner::start() {
  // Start the counter at the second.
  auto i = osquery::getUnixTime();
  for (; (timeout_ == 0) || (i <= timeout_); ++i) {
    Config::get().scheduledQueries(
        ([&i](const std::string& name, const ScheduledQuery& query) {
          if (query.splayed_interval > 0 && i % query.splayed_interval == 0) {
            TablePlugin::kCacheInterval = query.splayed_interval;
            TablePlugin::kCacheStep = i;
            launchQuery(name, query);
          }
        }));
    // Configuration decorators run on 60 second intervals only.
    if ((i % 60) == 0) {
      runDecorators(DECORATE_INTERVAL, i);
    }
    if (FLAGS_schedule_reload > 0 && (i % FLAGS_schedule_reload) == 0) {
      if (FLAGS_schedule_reload_sql) {
        SQLiteDBManager::resetPrimary();
      }
      resetDatabase();
    }

    // GLog is not re-entrant, so logs must be flushed in a dedicated thread.
    if ((i % 3) == 0) {
      relayStatusLogs(true);
    }

    // Put the thread into an interruptible sleep without a config instance.
    pauseMilli(interval_ * 1000);
    if (interrupted()) {
      break;
    }
  }
}
Ejemplo n.º 2
0
TEST_F(RocksDBDatabasePluginTests, test_corruption) {
  ASSERT_TRUE(pathExists(path_));
  ASSERT_FALSE(pathExists(path_ + ".backup"));

  // Mark the database as corrupted
  RocksDBDatabasePlugin::setCorrupted();
  printf("set corrupt\n");
  resetDatabase();
  printf("did reset\n");

  EXPECT_TRUE(pathExists(path_ + ".backup"));

  // Remove the backup and expect another reload to not create one.
  removePath(path_ + ".backup");
  ASSERT_FALSE(pathExists(path_ + ".backup"));

  resetDatabase();
  EXPECT_FALSE(pathExists(path_ + ".backup"));
}
Ejemplo n.º 3
0
void DatabasePluginTests::testReset() {
  RegistryFactory::get().setActive("database", getName());
  setDatabaseValue(kLogs, "reset", "1");
  resetDatabase();

  if ("ephemeral" != getName()) {
    // The ephemeral plugin is special and does not persist after reset.
    std::string value;
    EXPECT_TRUE(getDatabaseValue(kLogs, "reset", value));
    EXPECT_EQ(value, "1");
  }
}
Ejemplo n.º 4
0
namespace osquery {

class EphemeralDatabasePluginTests : public DatabasePluginTests {
 protected:
  std::string name() override {
    return "ephemeral";
  }
};

// Define the default set of database plugin operation tests.
CREATE_DATABASE_TESTS(EphemeralDatabasePluginTests);

void DatabasePluginTests::testPluginCheck() {
  auto& rf = RegistryFactory::get();

  // Do not worry about multiple set-active calls.
  // For testing purposes they should be idempotent.
  EXPECT_TRUE(rf.setActive("database", getName()));

  // Get an instance of the database plugin and call check.
  auto plugin = rf.plugin("database", getName());
  auto db_plugin = std::dynamic_pointer_cast<DatabasePlugin>(plugin);
  EXPECT_TRUE(db_plugin->checkDB());

  // Testing relies on database resetting too.
  EXPECT_TRUE(db_plugin->reset());
}

auto kTestReseter = ([]() { resetDatabase(); });

void DatabasePluginTests::testReset() {
  RegistryFactory::get().setActive("database", getName());
  setDatabaseValue(kLogs, "reset", "1");
  resetDatabase();

  if ("ephemeral" != getName()) {
    // The ephemeral plugin is special and does not persist after reset.
    std::string value;
    EXPECT_TRUE(getDatabaseValue(kLogs, "reset", value));
    EXPECT_EQ(value, "1");
  }
}

void DatabasePluginTests::testPut() {
  auto s = getPlugin()->put(kQueries, "test_put", "bar");
  EXPECT_TRUE(s.ok());
  EXPECT_EQ(s.getMessage(), "OK");

  s = setDatabaseValue(kQueries, "test_put", "");
  EXPECT_TRUE(s.ok());

  PluginRequest req = {{"action", "put"},
                       {"domain", kQueries},
                       {"key", "test_put"},
                       {"value", "bar"}};
  s = Registry::call("database", getName(), req);
  EXPECT_TRUE(s.ok());

  auto reset = std::async(std::launch::async, kTestReseter);
  reset.get();
}

void DatabasePluginTests::testGet() {
  getPlugin()->put(kQueries, "test_get", "bar");

  std::string r;
  auto s = getPlugin()->get(kQueries, "test_get", r);
  EXPECT_TRUE(s.ok());
  EXPECT_EQ(s.getMessage(), "OK");
  EXPECT_EQ(r, "bar");

  auto reset = std::async(std::launch::async, kTestReseter);
  reset.get();
}

void DatabasePluginTests::testDelete() {
  getPlugin()->put(kQueries, "test_delete", "baz");
  auto s = getPlugin()->remove(kQueries, "test_delete");
  EXPECT_TRUE(s.ok());
  EXPECT_EQ(s.getMessage(), "OK");
}

void DatabasePluginTests::testDeleteRange() {
  getPlugin()->put(kQueries, "test_delete", "baz");
  getPlugin()->put(kQueries, "test1", "1");
  getPlugin()->put(kQueries, "test2", "2");
  getPlugin()->put(kQueries, "test3", "3");
  getPlugin()->put(kQueries, "test4", "4");
  auto s = getPlugin()->removeRange(kQueries, "test1", "test3");
  EXPECT_TRUE(s.ok());
  EXPECT_EQ(s.getMessage(), "OK");

  std::string r;
  getPlugin()->get(kQueries, "test4", r);
  EXPECT_EQ(r, "4");
  getPlugin()->get(kQueries, "test_delete", r);
  EXPECT_EQ(r, "baz");
  s = getPlugin()->get(kQueries, "test1", r);
  EXPECT_FALSE(s.ok());
  s = getPlugin()->get(kQueries, "test2", r);
  EXPECT_FALSE(s.ok());
  s = getPlugin()->get(kQueries, "test3", r);
  EXPECT_FALSE(s.ok());

  // Expect invalid logically ranges to have no effect.
  getPlugin()->put(kQueries, "new_test1", "1");
  getPlugin()->put(kQueries, "new_test2", "2");
  getPlugin()->put(kQueries, "new_test3", "3");
  getPlugin()->put(kQueries, "new_test4", "4");
  s = getPlugin()->removeRange(kQueries, "new_test3", "new_test2");
  EXPECT_TRUE(s.ok());
  getPlugin()->get(kQueries, "new_test2", r);
  EXPECT_EQ(r, "2");
  getPlugin()->get(kQueries, "new_test3", r);
  EXPECT_EQ(r, "3");

  // An equality range will not delete that single item.
  s = getPlugin()->removeRange(kQueries, "new_test2", "new_test2");
  EXPECT_TRUE(s.ok());
  s = getPlugin()->get(kQueries, "new_test2", r);
  EXPECT_FALSE(s.ok());
}

void DatabasePluginTests::testScan() {
  getPlugin()->put(kQueries, "test_scan_foo1", "baz");
  getPlugin()->put(kQueries, "test_scan_foo2", "baz");
  getPlugin()->put(kQueries, "test_scan_foo3", "baz");

  std::vector<std::string> keys;
  std::vector<std::string> expected = {
      "test_scan_foo1", "test_scan_foo2", "test_scan_foo3"};
  auto s = getPlugin()->scan(kQueries, keys, "");
  EXPECT_TRUE(s.ok());
  EXPECT_EQ(s.getMessage(), "OK");
  EXPECT_EQ(keys.size(), 3U);
  for (const auto& i : expected) {
    EXPECT_NE(std::find(keys.begin(), keys.end(), i), keys.end());
  }
}

void DatabasePluginTests::testScanLimit() {
  getPlugin()->put(kQueries, "test_scan_foo1", "baz");
  getPlugin()->put(kQueries, "test_scan_foo2", "baz");
  getPlugin()->put(kQueries, "test_scan_foo3", "baz");

  std::vector<std::string> keys;
  auto s = getPlugin()->scan(kQueries, keys, "", 2);
  EXPECT_TRUE(s.ok());
  EXPECT_EQ(s.getMessage(), "OK");
  EXPECT_EQ(keys.size(), 2U);
}
}
Ejemplo n.º 5
0
MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent), dtFormat("MMM dd | hh:mm"),
	ui(new Ui::MainWindow)
{
	ui->setupUi(this);
	
	QLocale::setDefault(QLocale(QLocale::English, QLocale::UnitedStates));
    
	abbrevs << "AK" << "AL" << "AR" << "AZ" << "CA" << "CO" << "CT" << "DE" << "FL" << 
	           "GA" << "HI" << "IA" << "ID" << "IL" << "IN" << "KS" << "KY" << "LA" <<
	           "MA" << "MD" << "ME" << "MI" << "MN" << "MO" << "MS" << "MT" << "NC" <<
	           "ND" << "NE" << "NH" << "NJ" << "NM" << "NV" << "NY" << "OH" << "OK" <<
	           "OR" << "PA" << "RI" << "SC" << "SD" << "TN" << "TX" << "UT" << "VA" <<
	           "VT" << "WA" << "WI" << "WV" << "WY";
	names << "Alaska" << "Alabama" << "Arkansas" << "Arizona" <<
	         "California" << "Colorado" << "Connecticut" << "Delaware" <<
	         "Florida" << "Georgia" << "Hawaii" << "Iowa" << "Idaho" <<
	         "Illinois" << "Indiana" << "Kansas" << "Kentucky" << "Louisiana" <<
	         "Massachusetts" << "Maryland" << "Maine" << "Michigan" << "Minnesota" <<
	         "Missouri" << "Mississippi" << "Montana" << "North Carolina" <<
	         "North Dakota" << "Nebraska" << "New Hampshire" << "New Jersey" <<
	         "New Mexico" << "Nevada" << "New York" << "Ohio" << "Oklahoma" <<
	         "Oregon" << "Pennsylvania" << "Rhode Island" << "South Carolina" <<
	         "South Dakota" << "Tennessee" << "Texas" << "Utah" << "Virginia" <<
	         "Vermont" << "Washington" << "Wisconsin" << "West Virginia" << "Wyoming";
	
	// open the database for use
	QString e;
	e = validateDatabase();
	if( !e.isEmpty() ){
		QMessageBox::critical(this, "Critical Error",
			QString("Error %1")
			.arg(e)
		);
		db.close();
		this->deleteLater();
	}
	
	// set up the table model to pass the sql data through
	model = new QSqlTableModel(this,db);
	model->setTable("States");
	model->setEditStrategy(QSqlTableModel::OnManualSubmit);
	model->setFilter("Mileage<>0 OR GasAmt<>0");
	model->setHeaderData(0, Qt::Horizontal, "Name");
	model->setHeaderData(1, Qt::Horizontal, "");
	model->setHeaderData(2, Qt::Horizontal, "Mileage");
	model->setHeaderData(3, Qt::Horizontal, "Fuel\nPurchased");
	model->setHeaderData(4, Qt::Horizontal, "Fuel\nVolume");
	model->setHeaderData(5, Qt::Horizontal, "Refuel\nCount");
	model->setHeaderData(6, Qt::Horizontal, "Visit\nCount");
	
	// set up the table view
	ui->tableView->setModel( model );
	ui->tableView->setItemDelegateForColumn(2,
		new FormatDelegate(0, FormatDelegate::TSeparator));
	ui->tableView->setItemDelegateForColumn(3,
		new FormatDelegate(0, FormatDelegate::Currency));
	ui->tableView->setItemDelegateForColumn(4,
		new FormatDelegate(0, FormatDelegate::FixedFloat));
	ui->tableView->setItemDelegateForColumn(5,
		new FormatDelegate(0));
	ui->tableView->setItemDelegateForColumn(6,
		new FormatDelegate(0));
	ui->tableView->setColumnWidth(0, 125);
	ui->tableView->setColumnWidth(1,  50);
	ui->tableView->sortByColumn(2);
	
	// set the widgets
	updateCombos();
	updateStatistics();
	setInitialValues();

	connect(ui->pushAddCrossing, SIGNAL(clicked()),
			this,                SLOT(addCrossing())
	);
	connect(ui->pushAddFillup, SIGNAL(clicked()),
			this,              SLOT(addRefuel())
	);
	connect(ui->action_Reset_Statistics, SIGNAL(triggered()),
			this,                        SLOT(resetDatabase())
	);
	
	connect(this, SIGNAL(dataUpdated()),
	        this, SLOT(updateStatistics())
	);
	
	connect(ui->actionBugReport, SIGNAL(triggered()),
	        this,                SLOT(bugReport())
	);
	connect(ui->actionAbout_MileStat, SIGNAL(triggered()),
	        this,                      SLOT(aboutMileStat())
	);
	connect(ui->actionAbout_Qt, SIGNAL(triggered()),
	        qApp,                SLOT(aboutQt())
	);
	connect(ui->action_Undo, SIGNAL(triggered()),
	        this,            SLOT(undoLastCommand())
	);
	connect(ui->action_Hide_Unvisited_States, SIGNAL(toggled(bool)),
	        this, SLOT(hideUnvisited(bool))
	);
	
}