main.cc revision d42e09d85b2bc48028edd79993bfd30631b9e475
15bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa// Copyright 2014 The Chromium OS Authors. All rights reserved.
25bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa// Use of this source code is governed by a BSD-style license that can be
35bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa// found in the LICENSE file.
45bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
55bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa#include <string>
65bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
7357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley#include <base/files/file_path.h>
8cd478bb44404d3cdafdf47b9aaa9fd1f27bbd503Vitaly Buka#include <chromeos/daemons/dbus_daemon.h>
924e5f5d44b25c1ad61e5f07f951467e3c2870871Alex Vakulenko#include <chromeos/dbus/async_event_sequencer.h>
1024e5f5d44b25c1ad61e5f07f951467e3c2870871Alex Vakulenko#include <chromeos/dbus/exported_object_manager.h>
11357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley#include <chromeos/flag_helper.h>
1284fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka#include <chromeos/strings/string_utils.h>
1379e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko#include <chromeos/syslog_logging.h>
145bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
15becd461462f428f136cd5368c664a951935222e9Vitaly Buka#include "buffet/buffet_config.h"
169485896e8a842f523867cca2154607a9704586bfAlex Vakulenko#include "buffet/dbus_constants.h"
174b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley#include "buffet/manager.h"
185bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
1968c07ccd298fb44bd0965ccbe0479ea2bc1c129bChristopher Wileyusing chromeos::dbus_utils::AsyncEventSequencer;
2079e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenkousing chromeos::DBusServiceDaemon;
21cf92c66d1aa30678beaa64501c9febc3933c23a9Robert Gindausing buffet::dbus_constants::kServiceName;
22cf92c66d1aa30678beaa64501c9febc3933c23a9Robert Gindausing buffet::dbus_constants::kRootServicePath;
2354028f99aaa6917511102fc0572549a966257a8aChristopher Wiley
2479e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenkonamespace buffet {
255bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
261e3a66b4603e5eecc9a0791ee91bd72a7a93ffb3Alex Vakulenkoclass Daemon final : public DBusServiceDaemon {
2779e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko public:
2858a288b5b10aec975c7bc4fbfdcbcb80d5899c12Vitaly Buka  Daemon(const weave::Device::Options& options,
29becd461462f428f136cd5368c664a951935222e9Vitaly Buka         const BuffetConfigPaths& paths,
3058a288b5b10aec975c7bc4fbfdcbcb80d5899c12Vitaly Buka         const std::set<std::string>& device_whitelist)
3158a288b5b10aec975c7bc4fbfdcbcb80d5899c12Vitaly Buka      : DBusServiceDaemon(kServiceName, kRootServicePath),
3258a288b5b10aec975c7bc4fbfdcbcb80d5899c12Vitaly Buka        options_{options},
33becd461462f428f136cd5368c664a951935222e9Vitaly Buka        paths_(paths),
3458a288b5b10aec975c7bc4fbfdcbcb80d5899c12Vitaly Buka        device_whitelist_{device_whitelist} {}
35ea6456d3db72097b2d5ad071202cfd01c05b288aChris Sosa
3679e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko protected:
3779e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko  void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override {
3879e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko    manager_.reset(new buffet::Manager(object_manager_->AsWeakPtr()));
39becd461462f428f136cd5368c664a951935222e9Vitaly Buka    manager_->Start(options_, paths_, device_whitelist_, sequencer);
405bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa  }
415bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
4284fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  void OnShutdown(int* return_code) override { manager_->Stop(); }
4384fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka
4479e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko private:
450c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka  weave::Device::Options options_;
46becd461462f428f136cd5368c664a951935222e9Vitaly Buka  BuffetConfigPaths paths_;
4758a288b5b10aec975c7bc4fbfdcbcb80d5899c12Vitaly Buka  std::set<std::string> device_whitelist_;
4858a288b5b10aec975c7bc4fbfdcbcb80d5899c12Vitaly Buka
4979e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko  std::unique_ptr<buffet::Manager> manager_;
5079e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko  DISALLOW_COPY_AND_ASSIGN(Daemon);
5179e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko};
5254028f99aaa6917511102fc0572549a966257a8aChristopher Wiley
5379e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko}  // namespace buffet
545bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
55357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wileynamespace {
56357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley
578e34636ec3a3ff33b041a30805b310e17ec3c8efAlex Vakulenkoconst char kDefaultConfigFilePath[] = "/etc/weaved/weaved.conf";
58d42e09d85b2bc48028edd79993bfd30631b9e475Alex Vakulenkoconst char kDefaultStateFilePath[] = "/data/misc/weaved/device_reg_info";
59357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley
60357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley}  // namespace
61357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley
625bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosaint main(int argc, char* argv[]) {
63b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka  DEFINE_bool(log_to_stderr, false, "log trace messages to stderr as well");
64357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley  DEFINE_string(config_path, kDefaultConfigFilePath,
65357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley                "Path to file containing config information.");
66357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley  DEFINE_string(state_path, kDefaultStateFilePath,
67357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley                "Path to file containing state information.");
681d35ecce32826b7a8aeb4a040a8621ddc95f4eb9Christopher Wiley  DEFINE_bool(enable_xmpp, true,
691d35ecce32826b7a8aeb4a040a8621ddc95f4eb9Christopher Wiley              "Connect to GCD via a persistent XMPP connection.");
7049c36eecb39618ee15ec212cd31235645d1ffea2Alex Vakulenko  DEFINE_bool(disable_privet, false, "disable Privet protocol");
7184fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  DEFINE_bool(enable_ping, false, "enable test HTTP handler at /privet/ping");
7284fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  DEFINE_string(device_whitelist, "",
7384fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka                "Comma separated list of network interfaces to monitor for "
7484fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka                "connectivity (an empty list enables all interfaces).");
758b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka
768b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka  DEFINE_bool(disable_security, false,
778b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka              "disable Privet security for tests. For test only.");
788b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka  DEFINE_string(test_privet_ssid, "",
798b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka                "Fixed SSID for WiFi bootstrapping. For test only.");
808b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka  DEFINE_string(test_definitions_path, "",
818b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka                "Path to directory containing additional command "
828b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka                "and state definitions. For test only.");
838b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka
844a4be07dd0e87377be7726f033456ef483c61718Aaron Kemp  chromeos::FlagHelper::Init(argc, argv, "Privet protocol handler daemon");
85357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley  if (FLAGS_config_path.empty())
86357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley    FLAGS_config_path = kDefaultConfigFilePath;
87357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley  if (FLAGS_state_path.empty())
88357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley    FLAGS_state_path = kDefaultStateFilePath;
89b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka  int flags = chromeos::kLogToSyslog | chromeos::kLogHeader;
90b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka  if (FLAGS_log_to_stderr)
91b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka    flags |= chromeos::kLogToStderr;
92b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka  chromeos::InitLog(flags);
93b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka
9484fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  auto device_whitelist =
9584fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka      chromeos::string_utils::Split(FLAGS_device_whitelist, ",", true, true);
9684fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka
97becd461462f428f136cd5368c664a951935222e9Vitaly Buka  buffet::BuffetConfigPaths paths;
98becd461462f428f136cd5368c664a951935222e9Vitaly Buka  paths.defaults = base::FilePath{FLAGS_config_path};
99becd461462f428f136cd5368c664a951935222e9Vitaly Buka  paths.settings = base::FilePath{FLAGS_state_path};
1008e34636ec3a3ff33b041a30805b310e17ec3c8efAlex Vakulenko  paths.definitions = base::FilePath{"/etc/weaved"};
101becd461462f428f136cd5368c664a951935222e9Vitaly Buka  paths.test_definitions = base::FilePath{FLAGS_test_definitions_path};
102becd461462f428f136cd5368c664a951935222e9Vitaly Buka
1030c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka  weave::Device::Options options;
10484fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  options.xmpp_enabled = FLAGS_enable_xmpp;
1050c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka  options.disable_privet = FLAGS_disable_privet;
1060c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka  options.disable_security = FLAGS_disable_security;
1070c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka  options.enable_ping = FLAGS_enable_ping;
1088b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka  options.test_privet_ssid = FLAGS_test_privet_ssid;
10984fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka
1107b9ebeea8658473ec823ff5ff6521e7e641bc2ebVitaly Buka  buffet::Daemon daemon{
111becd461462f428f136cd5368c664a951935222e9Vitaly Buka      options, paths,
1127b9ebeea8658473ec823ff5ff6521e7e641bc2ebVitaly Buka      std::set<std::string>{device_whitelist.begin(), device_whitelist.end()}};
11379e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko  return daemon.Run();
1145bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa}
115