buffet: Rename privetd::Daemon into privetd::Manager

privetd::Manager is going to be controlled from buffet::Manager
Also cc file with in-line code is split into cc and h files.

BUG=brillo:1161
TEST=`FEATURES=test emerge-gizmo buffet`

Change-Id: I63b3d71a1cda3c8efe13ff0fa6f3266b688e8f43
Reviewed-on: https://chromium-review.googlesource.com/276503
Reviewed-by: Vitaly Buka <vitalybuka@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index c1f5205..1dd7218 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -54,10 +54,10 @@
         'privet/constants.cc',
         'privet/daemon_state.cc',
         'privet/device_delegate.cc',
-        'privet/main.cc',
         'privet/openssl_utils.cc',
         'privet/peerd_client.cc',
         'privet/privet_handler.cc',
+        'privet/privet_manager.cc',
         'privet/privetd_conf_parser.cc',
         'privet/security_manager.cc',
         'privet/shill_client.cc',
diff --git a/buffet/privet/main.cc b/buffet/privet/main.cc
deleted file mode 100644
index 2088e37..0000000
--- a/buffet/privet/main.cc
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <set>
-#include <string>
-#include <sysexits.h>
-
-#include <base/bind.h>
-#include <base/command_line.h>
-#include <base/json/json_reader.h>
-#include <base/memory/weak_ptr.h>
-#include <base/scoped_observer.h>
-#include <base/strings/string_number_conversions.h>
-#include <base/values.h>
-#include <chromeos/daemons/dbus_daemon.h>
-#include <chromeos/flag_helper.h>
-#include <chromeos/http/http_request.h>
-#include <chromeos/key_value_store.h>
-#include <chromeos/mime_utils.h>
-#include <chromeos/strings/string_utils.h>
-#include <chromeos/syslog_logging.h>
-#include <libwebserv/protocol_handler.h>
-#include <libwebserv/request.h>
-#include <libwebserv/response.h>
-#include <libwebserv/server.h>
-
-#include "buffet/privet/ap_manager_client.h"
-#include "buffet/privet/cloud_delegate.h"
-#include "buffet/privet/constants.h"
-#include "buffet/privet/daemon_state.h"
-#include "buffet/privet/device_delegate.h"
-#include "buffet/privet/peerd_client.h"
-#include "buffet/privet/privet_handler.h"
-#include "buffet/privet/privetd_conf_parser.h"
-#include "buffet/privet/security_manager.h"
-#include "buffet/privet/shill_client.h"
-#include "buffet/privet/wifi_bootstrap_manager.h"
-
-namespace privetd {
-
-namespace {
-
-using chromeos::dbus_utils::AsyncEventSequencer;
-using libwebserv::ProtocolHandler;
-using libwebserv::Request;
-using libwebserv::Response;
-
-const char kDefaultConfigFilePath[] = "/etc/privetd/privetd.conf";
-const char kDefaultStateFilePath[] = "/var/lib/privetd/privetd.state";
-
-std::string GetFirstHeader(const Request& request, const std::string& name) {
-  std::vector<std::string> headers = request.GetHeader(name);
-  return headers.empty() ? std::string() : headers.front();
-}
-
-const char kServiceName[] = "org.chromium.privetd";
-const char kRootPath[] = "/org/chromium/privetd";
-
-class Daemon : public chromeos::DBusServiceDaemon,
-               public CloudDelegate::Observer {
- public:
-  Daemon(bool disable_security,
-         bool enable_ping,
-         const std::set<std::string>& device_whitelist,
-         const base::FilePath& config_path,
-         const base::FilePath& state_path)
-      : DBusServiceDaemon(kServiceName, kRootPath),
-        disable_security_(disable_security),
-        enable_ping_(enable_ping),
-        device_whitelist_(device_whitelist),
-        config_path_(config_path),
-        state_store_(new DaemonState(state_path)) {}
-
-  void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override {
-    chromeos::KeyValueStore config_store;
-    if (!config_store.Load(config_path_)) {
-      LOG(ERROR) << "Failed to read privetd config file from "
-                 << config_path_.value();
-    } else {
-      CHECK(parser_.Parse(config_store))
-          << "Failed to read configuration file.";
-    }
-    state_store_->Init();
-    // This state store key doesn't exist naturally, but developers
-    // sometime put it in their state store to cause the device to bring
-    // up WiFi bootstrapping while being connected to an ethernet interface.
-    std::string test_device_whitelist;
-    if (device_whitelist_.empty() &&
-        state_store_->GetString(kWiFiBootstrapInterfaces,
-                                &test_device_whitelist)) {
-      auto interfaces =
-          chromeos::string_utils::Split(test_device_whitelist, ",", true, true);
-      device_whitelist_.insert(interfaces.begin(), interfaces.end());
-    }
-    device_ = DeviceDelegate::CreateDefault();
-    cloud_ = CloudDelegate::CreateDefault(
-        bus_, parser_.gcd_bootstrap_mode() != GcdBootstrapMode::kDisabled);
-    cloud_observer_.Add(cloud_.get());
-    security_.reset(new SecurityManager(parser_.pairing_modes(),
-                                        parser_.embedded_code_path(),
-                                        disable_security_));
-    shill_client_.reset(new ShillClient(
-        bus_, device_whitelist_.empty() ? parser_.automatic_wifi_interfaces()
-                                        : device_whitelist_));
-    shill_client_->RegisterConnectivityListener(
-        base::Bind(&Daemon::OnConnectivityChanged, base::Unretained(this)));
-    ap_manager_client_.reset(new ApManagerClient(bus_));
-
-    if (parser_.wifi_bootstrap_mode() != WiFiBootstrapMode::kDisabled) {
-      VLOG(1) << "Enabling WiFi bootstrapping.";
-      wifi_bootstrap_manager_.reset(new WifiBootstrapManager(
-          state_store_.get(), shill_client_.get(), ap_manager_client_.get(),
-          cloud_.get(), parser_.connect_timeout_seconds(),
-          parser_.bootstrap_timeout_seconds(),
-          parser_.monitor_timeout_seconds()));
-      wifi_bootstrap_manager_->Init();
-    }
-
-    peerd_client_.reset(new PeerdClient(bus_, device_.get(), cloud_.get(),
-                                        wifi_bootstrap_manager_.get()));
-
-    privet_handler_.reset(
-        new PrivetHandler(cloud_.get(), device_.get(), security_.get(),
-                          wifi_bootstrap_manager_.get(), peerd_client_.get()));
-
-    web_server_.OnProtocolHandlerConnected(base::Bind(
-        &Daemon::OnProtocolHandlerConnected, weak_ptr_factory_.GetWeakPtr()));
-    web_server_.OnProtocolHandlerDisconnected(
-        base::Bind(&Daemon::OnProtocolHandlerDisconnected,
-                   weak_ptr_factory_.GetWeakPtr()));
-
-    web_server_.Connect(bus_, kServiceName,
-                        sequencer->GetHandler("Server::Connect failed.", true),
-                        base::Bind(&base::DoNothing),
-                        base::Bind(&base::DoNothing));
-
-    web_server_.GetDefaultHttpHandler()->AddHandlerCallback(
-        "/privet/", "",
-        base::Bind(&Daemon::PrivetRequestHandler, base::Unretained(this)));
-    web_server_.GetDefaultHttpsHandler()->AddHandlerCallback(
-        "/privet/", "",
-        base::Bind(&Daemon::PrivetRequestHandler, base::Unretained(this)));
-    if (enable_ping_) {
-      web_server_.GetDefaultHttpHandler()->AddHandlerCallback(
-          "/privet/ping", chromeos::http::request_type::kGet,
-          base::Bind(&Daemon::HelloWorldHandler, base::Unretained(this)));
-      web_server_.GetDefaultHttpsHandler()->AddHandlerCallback(
-          "/privet/ping", chromeos::http::request_type::kGet,
-          base::Bind(&Daemon::HelloWorldHandler, base::Unretained(this)));
-    }
-  }
-
-  void OnShutdown(int* return_code) override {
-    web_server_.Disconnect();
-    DBusDaemon::OnShutdown(return_code);
-  }
-
-  void OnDeviceInfoChanged() override { OnChanged(); };
-
- private:
-  void PrivetRequestHandler(std::unique_ptr<Request> request,
-                            std::unique_ptr<Response> response) {
-    std::string auth_header = GetFirstHeader(
-        *request, chromeos::http::request_header::kAuthorization);
-    if (auth_header.empty() && disable_security_)
-      auth_header = "Privet anonymous";
-    std::string data(request->GetData().begin(), request->GetData().end());
-    VLOG(3) << "Input: " << data;
-
-    base::DictionaryValue empty;
-    std::unique_ptr<base::Value> value;
-    const base::DictionaryValue* dictionary = nullptr;
-
-    if (data.empty()) {
-      dictionary = &empty;
-    } else {
-      std::string content_type =
-          chromeos::mime::RemoveParameters(GetFirstHeader(
-              *request, chromeos::http::request_header::kContentType));
-      if (content_type == chromeos::mime::application::kJson) {
-        value.reset(base::JSONReader::Read(data));
-        if (value)
-          value->GetAsDictionary(&dictionary);
-      }
-    }
-
-    privet_handler_->HandleRequest(
-        request->GetPath(), auth_header, dictionary,
-        base::Bind(&Daemon::PrivetResponseHandler, base::Unretained(this),
-                   base::Passed(&response)));
-  }
-
-  void PrivetResponseHandler(std::unique_ptr<Response> response,
-                             int status,
-                             const base::DictionaryValue& output) {
-    VLOG(3) << "status: " << status << ", Output: " << output;
-    response->ReplyWithJson(status, &output);
-  }
-
-  void HelloWorldHandler(std::unique_ptr<Request> request,
-                         std::unique_ptr<Response> response) {
-    response->ReplyWithText(chromeos::http::status_code::Ok, "Hello, world!",
-                            chromeos::mime::text::kPlain);
-  }
-
-  void OnChanged() {
-    if (peerd_client_)
-      peerd_client_->Update();
-  }
-
-  void OnConnectivityChanged(bool online) { OnChanged(); }
-
-  void OnProtocolHandlerConnected(ProtocolHandler* protocol_handler) {
-    if (protocol_handler->GetName() == ProtocolHandler::kHttp) {
-      device_->SetHttpPort(*protocol_handler->GetPorts().begin());
-      if (peerd_client_)
-        peerd_client_->Update();
-    } else if (protocol_handler->GetName() == ProtocolHandler::kHttps) {
-      device_->SetHttpsPort(*protocol_handler->GetPorts().begin());
-      security_->SetCertificateFingerprint(
-          protocol_handler->GetCertificateFingerprint());
-    }
-  }
-
-  void OnProtocolHandlerDisconnected(ProtocolHandler* protocol_handler) {
-    if (protocol_handler->GetName() == ProtocolHandler::kHttp) {
-      device_->SetHttpPort(0);
-      if (peerd_client_)
-        peerd_client_->Update();
-    } else if (protocol_handler->GetName() == ProtocolHandler::kHttps) {
-      device_->SetHttpsPort(0);
-      security_->SetCertificateFingerprint({});
-    }
-  }
-
-  bool disable_security_;
-  bool enable_ping_;
-  PrivetdConfigParser parser_;
-  std::set<std::string> device_whitelist_;
-  base::FilePath config_path_;
-  std::unique_ptr<DaemonState> state_store_;
-  std::unique_ptr<CloudDelegate> cloud_;
-  std::unique_ptr<DeviceDelegate> device_;
-  std::unique_ptr<SecurityManager> security_;
-  std::unique_ptr<ShillClient> shill_client_;
-  std::unique_ptr<ApManagerClient> ap_manager_client_;
-  std::unique_ptr<WifiBootstrapManager> wifi_bootstrap_manager_;
-  std::unique_ptr<PeerdClient> peerd_client_;
-  std::unique_ptr<PrivetHandler> privet_handler_;
-  ScopedObserver<CloudDelegate, CloudDelegate::Observer> cloud_observer_{this};
-  libwebserv::Server web_server_;
-
-  base::WeakPtrFactory<Daemon> weak_ptr_factory_{this};
-  DISALLOW_COPY_AND_ASSIGN(Daemon);
-};
-
-}  // anonymous namespace
-
-}  // namespace privetd
-
-int old_main(int argc, char* argv[]) {
-  DEFINE_bool(disable_security, false, "disable Privet security for tests");
-  DEFINE_bool(enable_ping, false, "enable test HTTP handler at /privet/ping");
-  DEFINE_bool(log_to_stderr, false, "log trace messages to stderr as well");
-  DEFINE_string(config_path, privetd::kDefaultConfigFilePath,
-                "Path to file containing config information.");
-  DEFINE_string(state_path, privetd::kDefaultStateFilePath,
-                "Path to file containing state information.");
-  DEFINE_string(device_whitelist, "",
-                "Comma separated list of network interfaces to monitor for "
-                "connectivity (an empty list enables all interfaces).");
-
-  chromeos::FlagHelper::Init(argc, argv, "Privet protocol handler daemon");
-
-  int flags = chromeos::kLogToSyslog;
-  if (FLAGS_log_to_stderr)
-    flags |= chromeos::kLogToStderr;
-  chromeos::InitLog(flags | chromeos::kLogHeader);
-
-  if (FLAGS_config_path.empty())
-    FLAGS_config_path = privetd::kDefaultConfigFilePath;
-
-  if (FLAGS_state_path.empty())
-    FLAGS_state_path = privetd::kDefaultStateFilePath;
-
-  auto device_whitelist =
-      chromeos::string_utils::Split(FLAGS_device_whitelist, ",", true, true);
-
-  privetd::Daemon daemon(
-      FLAGS_disable_security, FLAGS_enable_ping,
-      std::set<std::string>(device_whitelist.begin(), device_whitelist.end()),
-      base::FilePath(FLAGS_config_path), base::FilePath(FLAGS_state_path));
-  return daemon.Run();
-}
diff --git a/buffet/privet/privet_manager.cc b/buffet/privet/privet_manager.cc
new file mode 100644
index 0000000..36aaa7e
--- /dev/null
+++ b/buffet/privet/privet_manager.cc
@@ -0,0 +1,277 @@
+// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "buffet/privet/privet_manager.h"
+
+#include <memory>
+#include <set>
+#include <string>
+#include <sysexits.h>
+
+#include <base/bind.h>
+#include <base/command_line.h>
+#include <base/json/json_reader.h>
+#include <base/memory/weak_ptr.h>
+#include <base/scoped_observer.h>
+#include <base/strings/string_number_conversions.h>
+#include <base/values.h>
+#include <chromeos/daemons/dbus_daemon.h>
+#include <chromeos/flag_helper.h>
+#include <chromeos/http/http_request.h>
+#include <chromeos/key_value_store.h>
+#include <chromeos/mime_utils.h>
+#include <chromeos/strings/string_utils.h>
+#include <chromeos/syslog_logging.h>
+#include <libwebserv/protocol_handler.h>
+#include <libwebserv/request.h>
+#include <libwebserv/response.h>
+#include <libwebserv/server.h>
+
+#include "buffet/privet/ap_manager_client.h"
+#include "buffet/privet/cloud_delegate.h"
+#include "buffet/privet/constants.h"
+#include "buffet/privet/daemon_state.h"
+#include "buffet/privet/device_delegate.h"
+#include "buffet/privet/peerd_client.h"
+#include "buffet/privet/privet_handler.h"
+#include "buffet/privet/privetd_conf_parser.h"
+#include "buffet/privet/security_manager.h"
+#include "buffet/privet/shill_client.h"
+#include "buffet/privet/wifi_bootstrap_manager.h"
+
+namespace privetd {
+
+namespace {
+
+using chromeos::dbus_utils::AsyncEventSequencer;
+using libwebserv::ProtocolHandler;
+using libwebserv::Request;
+using libwebserv::Response;
+
+const char kDefaultConfigFilePath[] = "/etc/privetd/privetd.conf";
+const char kDefaultStateFilePath[] = "/var/lib/privetd/privetd.state";
+
+std::string GetFirstHeader(const Request& request, const std::string& name) {
+  std::vector<std::string> headers = request.GetHeader(name);
+  return headers.empty() ? std::string() : headers.front();
+}
+
+const char kServiceName[] = "org.chromium.privetd";
+const char kRootPath[] = "/org/chromium/privetd";
+
+}  // namespace
+
+Manager::Manager(bool disable_security,
+                 bool enable_ping,
+                 const std::set<std::string>& device_whitelist,
+                 const base::FilePath& config_path,
+                 const base::FilePath& state_path)
+    : DBusServiceDaemon(kServiceName, kRootPath),
+      disable_security_(disable_security),
+      enable_ping_(enable_ping),
+      device_whitelist_(device_whitelist),
+      config_path_(config_path),
+      state_store_(new DaemonState(state_path)) {
+}
+
+void Manager::RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) {
+  parser_.reset(new PrivetdConfigParser);
+
+  chromeos::KeyValueStore config_store;
+  if (!config_store.Load(config_path_)) {
+    LOG(ERROR) << "Failed to read privetd config file from "
+               << config_path_.value();
+  } else {
+    CHECK(parser_->Parse(config_store)) << "Failed to read configuration file.";
+  }
+  state_store_->Init();
+  // This state store key doesn't exist naturally, but developers
+  // sometime put it in their state store to cause the device to bring
+  // up WiFi bootstrapping while being connected to an ethernet interface.
+  std::string test_device_whitelist;
+  if (device_whitelist_.empty() &&
+      state_store_->GetString(kWiFiBootstrapInterfaces,
+                              &test_device_whitelist)) {
+    auto interfaces =
+        chromeos::string_utils::Split(test_device_whitelist, ",", true, true);
+    device_whitelist_.insert(interfaces.begin(), interfaces.end());
+  }
+  device_ = DeviceDelegate::CreateDefault();
+  cloud_ = CloudDelegate::CreateDefault(
+      bus_, parser_->gcd_bootstrap_mode() != GcdBootstrapMode::kDisabled);
+  cloud_observer_.Add(cloud_.get());
+  security_.reset(new SecurityManager(parser_->pairing_modes(),
+                                      parser_->embedded_code_path(),
+                                      disable_security_));
+  shill_client_.reset(new ShillClient(
+      bus_, device_whitelist_.empty() ? parser_->automatic_wifi_interfaces()
+                                      : device_whitelist_));
+  shill_client_->RegisterConnectivityListener(
+      base::Bind(&Manager::OnConnectivityChanged, base::Unretained(this)));
+  ap_manager_client_.reset(new ApManagerClient(bus_));
+
+  if (parser_->wifi_bootstrap_mode() != WiFiBootstrapMode::kDisabled) {
+    VLOG(1) << "Enabling WiFi bootstrapping.";
+    wifi_bootstrap_manager_.reset(new WifiBootstrapManager(
+        state_store_.get(), shill_client_.get(), ap_manager_client_.get(),
+        cloud_.get(), parser_->connect_timeout_seconds(),
+        parser_->bootstrap_timeout_seconds(),
+        parser_->monitor_timeout_seconds()));
+    wifi_bootstrap_manager_->Init();
+  }
+
+  peerd_client_.reset(new PeerdClient(bus_, device_.get(), cloud_.get(),
+                                      wifi_bootstrap_manager_.get()));
+
+  privet_handler_.reset(
+      new PrivetHandler(cloud_.get(), device_.get(), security_.get(),
+                        wifi_bootstrap_manager_.get(), peerd_client_.get()));
+  web_server_.reset(new libwebserv::Server);
+  web_server_->OnProtocolHandlerConnected(base::Bind(
+      &Manager::OnProtocolHandlerConnected, weak_ptr_factory_.GetWeakPtr()));
+  web_server_->OnProtocolHandlerDisconnected(base::Bind(
+      &Manager::OnProtocolHandlerDisconnected, weak_ptr_factory_.GetWeakPtr()));
+
+  web_server_->Connect(bus_, kServiceName,
+                       sequencer->GetHandler("Server::Connect failed.", true),
+                       base::Bind(&base::DoNothing),
+                       base::Bind(&base::DoNothing));
+
+  web_server_->GetDefaultHttpHandler()->AddHandlerCallback(
+      "/privet/", "",
+      base::Bind(&Manager::PrivetRequestHandler, base::Unretained(this)));
+  web_server_->GetDefaultHttpsHandler()->AddHandlerCallback(
+      "/privet/", "",
+      base::Bind(&Manager::PrivetRequestHandler, base::Unretained(this)));
+  if (enable_ping_) {
+    web_server_->GetDefaultHttpHandler()->AddHandlerCallback(
+        "/privet/ping", chromeos::http::request_type::kGet,
+        base::Bind(&Manager::HelloWorldHandler, base::Unretained(this)));
+    web_server_->GetDefaultHttpsHandler()->AddHandlerCallback(
+        "/privet/ping", chromeos::http::request_type::kGet,
+        base::Bind(&Manager::HelloWorldHandler, base::Unretained(this)));
+  }
+}
+
+void Manager::OnShutdown(int* return_code) {
+  web_server_->Disconnect();
+  DBusDaemon::OnShutdown(return_code);
+}
+
+void Manager::OnDeviceInfoChanged() {
+  OnChanged();
+}
+
+void Manager::PrivetRequestHandler(std::unique_ptr<Request> request,
+                                   std::unique_ptr<Response> response) {
+  std::string auth_header =
+      GetFirstHeader(*request, chromeos::http::request_header::kAuthorization);
+  if (auth_header.empty() && disable_security_)
+    auth_header = "Privet anonymous";
+  std::string data(request->GetData().begin(), request->GetData().end());
+  VLOG(3) << "Input: " << data;
+
+  base::DictionaryValue empty;
+  std::unique_ptr<base::Value> value;
+  const base::DictionaryValue* dictionary = nullptr;
+
+  if (data.empty()) {
+    dictionary = &empty;
+  } else {
+    std::string content_type = chromeos::mime::RemoveParameters(
+        GetFirstHeader(*request, chromeos::http::request_header::kContentType));
+    if (content_type == chromeos::mime::application::kJson) {
+      value.reset(base::JSONReader::Read(data));
+      if (value)
+        value->GetAsDictionary(&dictionary);
+    }
+  }
+
+  privet_handler_->HandleRequest(
+      request->GetPath(), auth_header, dictionary,
+      base::Bind(&Manager::PrivetResponseHandler, base::Unretained(this),
+                 base::Passed(&response)));
+}
+
+void Manager::PrivetResponseHandler(std::unique_ptr<Response> response,
+                                    int status,
+                                    const base::DictionaryValue& output) {
+  VLOG(3) << "status: " << status << ", Output: " << output;
+  response->ReplyWithJson(status, &output);
+}
+
+void Manager::HelloWorldHandler(std::unique_ptr<Request> request,
+                                std::unique_ptr<Response> response) {
+  response->ReplyWithText(chromeos::http::status_code::Ok, "Hello, world!",
+                          chromeos::mime::text::kPlain);
+}
+
+void Manager::OnChanged() {
+  if (peerd_client_)
+    peerd_client_->Update();
+}
+
+void Manager::OnConnectivityChanged(bool online) {
+  OnChanged();
+}
+
+void Manager::OnProtocolHandlerConnected(ProtocolHandler* protocol_handler) {
+  if (protocol_handler->GetName() == ProtocolHandler::kHttp) {
+    device_->SetHttpPort(*protocol_handler->GetPorts().begin());
+    if (peerd_client_)
+      peerd_client_->Update();
+  } else if (protocol_handler->GetName() == ProtocolHandler::kHttps) {
+    device_->SetHttpsPort(*protocol_handler->GetPorts().begin());
+    security_->SetCertificateFingerprint(
+        protocol_handler->GetCertificateFingerprint());
+  }
+}
+
+void Manager::OnProtocolHandlerDisconnected(ProtocolHandler* protocol_handler) {
+  if (protocol_handler->GetName() == ProtocolHandler::kHttp) {
+    device_->SetHttpPort(0);
+    if (peerd_client_)
+      peerd_client_->Update();
+  } else if (protocol_handler->GetName() == ProtocolHandler::kHttps) {
+    device_->SetHttpsPort(0);
+    security_->SetCertificateFingerprint({});
+  }
+}
+
+}  // namespace privetd
+
+int old_main(int argc, char* argv[]) {
+  DEFINE_bool(disable_security, false, "disable Privet security for tests");
+  DEFINE_bool(enable_ping, false, "enable test HTTP handler at /privet/ping");
+  DEFINE_bool(log_to_stderr, false, "log trace messages to stderr as well");
+  DEFINE_string(config_path, privetd::kDefaultConfigFilePath,
+                "Path to file containing config information.");
+  DEFINE_string(state_path, privetd::kDefaultStateFilePath,
+                "Path to file containing state information.");
+  DEFINE_string(device_whitelist, "",
+                "Comma separated list of network interfaces to monitor for "
+                "connectivity (an empty list enables all interfaces).");
+
+  chromeos::FlagHelper::Init(argc, argv, "Privet protocol handler daemon");
+
+  int flags = chromeos::kLogToSyslog;
+  if (FLAGS_log_to_stderr)
+    flags |= chromeos::kLogToStderr;
+  chromeos::InitLog(flags | chromeos::kLogHeader);
+
+  if (FLAGS_config_path.empty())
+    FLAGS_config_path = privetd::kDefaultConfigFilePath;
+
+  if (FLAGS_state_path.empty())
+    FLAGS_state_path = privetd::kDefaultStateFilePath;
+
+  auto device_whitelist =
+      chromeos::string_utils::Split(FLAGS_device_whitelist, ",", true, true);
+
+  privetd::Manager daemon(
+      FLAGS_disable_security, FLAGS_enable_ping,
+      std::set<std::string>(device_whitelist.begin(), device_whitelist.end()),
+      base::FilePath(FLAGS_config_path), base::FilePath(FLAGS_state_path));
+  return daemon.Run();
+}
diff --git a/buffet/privet/privet_manager.h b/buffet/privet/privet_manager.h
new file mode 100644
index 0000000..23e19d4
--- /dev/null
+++ b/buffet/privet/privet_manager.h
@@ -0,0 +1,107 @@
+// Copyright 2014 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef BUFFET_PRIVET_PRIVET_MANAGER_H_
+#define BUFFET_PRIVET_PRIVET_MANAGER_H_
+
+#include <memory>
+#include <set>
+#include <string>
+#include <vector>
+
+#include <base/memory/weak_ptr.h>
+#include <base/scoped_observer.h>
+#include <chromeos/daemons/dbus_daemon.h>
+
+#include "buffet/privet/cloud_delegate.h"
+
+namespace chromeos {
+namespace dbus_utils {
+class AsyncEventSequencer;
+}
+}
+
+namespace libwebserv {
+class ProtocolHandler;
+class Request;
+class Response;
+class Server;
+}
+
+namespace privetd {
+
+class PrivetdConfigParser;
+class DaemonState;
+class CloudDelegate;
+class DeviceDelegate;
+class SecurityManager;
+class ShillClient;
+class ApManagerClient;
+class WifiBootstrapManager;
+class PeerdClient;
+class PrivetHandler;
+
+class Manager : public chromeos::DBusServiceDaemon,
+                public CloudDelegate::Observer {
+ public:
+  Manager(bool disable_security,
+          bool enable_ping,
+          const std::set<std::string>& device_whitelist,
+          const base::FilePath& config_path,
+          const base::FilePath& state_path);
+  ~Manager() override;
+
+  void RegisterDBusObjectsAsync(
+      chromeos::dbus_utils::AsyncEventSequencer* sequencer) override;
+
+  void OnShutdown(int* return_code) override;
+
+  void OnDeviceInfoChanged() override;
+
+ private:
+  void PrivetRequestHandler(std::unique_ptr<libwebserv::Request> request,
+                            std::unique_ptr<libwebserv::Response> response);
+
+  void PrivetResponseHandler(std::unique_ptr<libwebserv::Response> response,
+                             int status,
+                             const base::DictionaryValue& output);
+
+  void HelloWorldHandler(std::unique_ptr<libwebserv::Request> request,
+                         std::unique_ptr<libwebserv::Response> response);
+
+  void OnChanged();
+
+  void OnConnectivityChanged(bool online);
+
+  void OnProtocolHandlerConnected(
+      libwebserv::ProtocolHandler* protocol_handler);
+
+  void OnProtocolHandlerDisconnected(
+      libwebserv::ProtocolHandler* protocol_handler);
+
+  bool disable_security_;
+  bool enable_ping_;
+  std::unique_ptr<PrivetdConfigParser> parser_;
+  std::set<std::string> device_whitelist_;
+  base::FilePath config_path_;
+  std::unique_ptr<DaemonState> state_store_;
+  std::unique_ptr<CloudDelegate> cloud_;
+  std::unique_ptr<DeviceDelegate> device_;
+  std::unique_ptr<SecurityManager> security_;
+  std::unique_ptr<ShillClient> shill_client_;
+  std::unique_ptr<ApManagerClient> ap_manager_client_;
+  std::unique_ptr<WifiBootstrapManager> wifi_bootstrap_manager_;
+  std::unique_ptr<PeerdClient> peerd_client_;
+  std::unique_ptr<PrivetHandler> privet_handler_;
+  std::unique_ptr<libwebserv::Server> web_server_;
+
+  ScopedObserver<CloudDelegate, CloudDelegate::Observer> cloud_observer_{this};
+
+  base::WeakPtrFactory<Manager> weak_ptr_factory_{this};
+  DISALLOW_COPY_AND_ASSIGN(Manager);
+};
+
+}  // namespace privetd
+
+#endif  // BUFFET_PRIVET_PRIVET_MANAGER_H_