osquery-1/osquery/main/daemon.cpp

112 lines
2.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
* 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
#include <boost/thread.hpp>
#include <osquery/config.h>
#include <osquery/core.h>
#include <osquery/events.h>
#include <osquery/logger.h>
#include <osquery/scheduler.h>
2014-07-31 00:35:19 +00:00
#include "osquery/core/watcher.h"
const std::string kWatcherWorkerName = "osqueryd-worker";
2015-01-05 03:27:04 +00:00
#ifndef __APPLE__
namespace osquery {
DEFINE_osquery_flag(bool, daemonize, false, "Run as daemon (osqueryd only).");
}
#endif
namespace osquery {
DEFINE_osquery_flag(bool,
config_check,
false,
"Check the format and accessibility of the daemon");
DEFINE_osquery_flag(bool,
disable_watchdog,
false,
"Do not use a userland watchdog process.");
}
2014-08-30 11:06:21 +00:00
int main(int argc, char* argv[]) {
2014-11-09 04:27:28 +00:00
osquery::initOsquery(argc, argv, osquery::OSQUERY_TOOL_DAEMON);
2014-07-31 00:35:19 +00:00
if (osquery::FLAGS_config_check) {
auto s = osquery::Config::checkConfig();
if (!s.ok()) {
std::cerr << "Error reading config: " << s.toString() << "\n";
}
return s.getCode();
}
2015-01-05 03:27:04 +00:00
#ifndef __APPLE__
// OSX uses launchd to daemonize.
if (osquery::FLAGS_daemonize) {
if (daemon(0, 0) == -1) {
::exit(EXIT_FAILURE);
}
}
#endif
2014-11-18 02:42:36 +00:00
auto pid_status = osquery::createPidFile();
if (!pid_status.ok()) {
LOG(ERROR) << "Could not start osqueryd: " << pid_status.toString();
2014-12-08 18:40:10 +00:00
::exit(EXIT_FAILURE);
2014-11-18 02:42:36 +00:00
}
try {
osquery::DBHandle::getInstance();
} catch (std::exception& e) {
LOG(ERROR) << "osqueryd failed to start: " << e.what();
2015-01-05 03:27:04 +00:00
::exit(EXIT_FAILURE);
}
if (!osquery::FLAGS_disable_watchdog) {
// When a watcher is used, the current watcher will fork into a worker.
osquery::initWorkerWatcher(kWatcherWorkerName, argc, argv);
}
LOG(INFO) << "Listing all plugins";
LOG(INFO) << "Logger plugins:";
for (const auto& name : osquery::Registry::names("logger")) {
2015-01-30 18:44:25 +00:00
LOG(INFO) << " - " << name;
}
LOG(INFO) << "Config plugins:";
for (const auto& name : osquery::Registry::names("config")) {
2015-01-30 18:44:25 +00:00
LOG(INFO) << " - " << name;
}
2014-11-09 04:27:28 +00:00
LOG(INFO) << "Event Publishers:";
2015-02-03 22:27:17 +00:00
for (const auto& name : osquery::Registry::names("event_publisher")) {
2015-01-30 18:44:25 +00:00
LOG(INFO) << " - " << name;
2014-09-24 18:25:05 +00:00
}
2014-11-09 04:27:28 +00:00
LOG(INFO) << "Event Subscribers:";
2015-02-03 22:27:17 +00:00
for (const auto& name : osquery::Registry::names("event_subscriber")) {
2015-01-30 18:44:25 +00:00
LOG(INFO) << " - " << name;
2014-09-24 18:25:05 +00:00
}
// Start event threads.
osquery::EventFactory::delay();
2014-07-31 00:35:19 +00:00
boost::thread scheduler_thread(osquery::initializeScheduler);
2014-07-31 00:35:19 +00:00
scheduler_thread.join();
// Finally shutdown.
osquery::shutdownOsquery();
2014-07-31 00:35:19 +00:00
return 0;
}