blob: bda526b7d57d56c85e93b2fa37c2a835044a2b41 [file] [log] [blame]
Chris Sosa5bac9492014-03-24 11:18:54 -07001// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string>
6
Alex Vakulenkobc648492015-09-08 15:39:18 -07007#include <signal.h>
8
Christopher Wiley357deca2015-02-07 18:29:32 -08009#include <base/files/file_path.h>
Vitaly Bukacd478bb2015-08-16 01:29:30 -070010#include <chromeos/daemons/dbus_daemon.h>
Alex Vakulenko24e5f5d2014-08-27 11:00:57 -070011#include <chromeos/dbus/async_event_sequencer.h>
12#include <chromeos/dbus/exported_object_manager.h>
Christopher Wiley357deca2015-02-07 18:29:32 -080013#include <chromeos/flag_helper.h>
Vitaly Buka84fd6dd2015-06-09 17:22:18 -070014#include <chromeos/strings/string_utils.h>
Alex Vakulenko79e6a282014-09-08 17:07:19 -070015#include <chromeos/syslog_logging.h>
Chris Sosa5bac9492014-03-24 11:18:54 -070016
Vitaly Bukabecd4612015-08-16 23:31:55 -070017#include "buffet/buffet_config.h"
Alex Vakulenko94858962014-12-01 17:53:27 -080018#include "buffet/dbus_constants.h"
Christopher Wiley4b5f04c2014-03-27 14:45:37 -070019#include "buffet/manager.h"
Chris Sosa5bac9492014-03-24 11:18:54 -070020
Christopher Wiley68c07cc2014-07-29 14:07:10 -070021using chromeos::dbus_utils::AsyncEventSequencer;
Alex Vakulenko79e6a282014-09-08 17:07:19 -070022using chromeos::DBusServiceDaemon;
Robert Gindacf92c662015-08-20 09:30:11 -070023using buffet::dbus_constants::kServiceName;
24using buffet::dbus_constants::kRootServicePath;
Christopher Wiley54028f92014-04-01 17:33:29 -070025
Alex Vakulenko79e6a282014-09-08 17:07:19 -070026namespace buffet {
Chris Sosa5bac9492014-03-24 11:18:54 -070027
Alex Vakulenko1e3a66b2015-05-22 15:48:53 -070028class Daemon final : public DBusServiceDaemon {
Alex Vakulenko79e6a282014-09-08 17:07:19 -070029 public:
Alex Vakulenko0022b752015-10-02 11:09:59 -070030 Daemon(const Manager::Options& options,
31 const BuffetConfig::Options& config_options,
Vitaly Buka58a288b2015-07-31 00:33:31 -070032 const std::set<std::string>& device_whitelist)
33 : DBusServiceDaemon(kServiceName, kRootServicePath),
34 options_{options},
Alex Vakulenko0022b752015-10-02 11:09:59 -070035 config_options_{config_options},
Vitaly Buka58a288b2015-07-31 00:33:31 -070036 device_whitelist_{device_whitelist} {}
Chris Sosaea6456d2014-04-09 15:42:01 -070037
Alex Vakulenko79e6a282014-09-08 17:07:19 -070038 protected:
39 void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override {
Alex Vakulenko0022b752015-10-02 11:09:59 -070040 manager_.reset(new Manager(object_manager_->AsWeakPtr()));
41 manager_->Start(options_, config_options_, device_whitelist_, sequencer);
Chris Sosa5bac9492014-03-24 11:18:54 -070042 }
Chris Sosa5bac9492014-03-24 11:18:54 -070043
Vitaly Buka84fd6dd2015-06-09 17:22:18 -070044 void OnShutdown(int* return_code) override { manager_->Stop(); }
Chris Sosa5bac9492014-03-24 11:18:54 -070045
Vitaly Buka84fd6dd2015-06-09 17:22:18 -070046 private:
Alex Vakulenko0022b752015-10-02 11:09:59 -070047 Manager::Options options_;
48 BuffetConfig::Options config_options_;
Vitaly Buka58a288b2015-07-31 00:33:31 -070049 std::set<std::string> device_whitelist_;
50
Vitaly Buka84fd6dd2015-06-09 17:22:18 -070051 std::unique_ptr<buffet::Manager> manager_;
Alex Vakulenko79e6a282014-09-08 17:07:19 -070052 DISALLOW_COPY_AND_ASSIGN(Daemon);
53};
Chris Sosa5bac9492014-03-24 11:18:54 -070054
Alex Vakulenko79e6a282014-09-08 17:07:19 -070055} // namespace buffet
Chris Sosa5bac9492014-03-24 11:18:54 -070056
Christopher Wiley357deca2015-02-07 18:29:32 -080057namespace {
58
Alex Vakulenko8e346362015-08-21 10:01:57 -070059const char kDefaultConfigFilePath[] = "/etc/weaved/weaved.conf";
Alex Vakulenkod42e09d2015-08-21 18:23:32 -070060const char kDefaultStateFilePath[] = "/data/misc/weaved/device_reg_info";
Christopher Wiley357deca2015-02-07 18:29:32 -080061
62} // namespace
63
Chris Sosa5bac9492014-03-24 11:18:54 -070064int main(int argc, char* argv[]) {
Vitaly Bukab12e9952015-03-13 23:54:21 -070065 DEFINE_bool(log_to_stderr, false, "log trace messages to stderr as well");
Christopher Wiley357deca2015-02-07 18:29:32 -080066 DEFINE_string(config_path, kDefaultConfigFilePath,
67 "Path to file containing config information.");
68 DEFINE_string(state_path, kDefaultStateFilePath,
69 "Path to file containing state information.");
Christopher Wiley1d35ecc2015-04-07 11:11:18 -070070 DEFINE_bool(enable_xmpp, true,
71 "Connect to GCD via a persistent XMPP connection.");
Alex Vakulenko49c36ee2015-08-19 11:06:04 -070072 DEFINE_bool(disable_privet, false, "disable Privet protocol");
Vitaly Buka84fd6dd2015-06-09 17:22:18 -070073 DEFINE_bool(enable_ping, false, "enable test HTTP handler at /privet/ping");
74 DEFINE_string(device_whitelist, "",
75 "Comma separated list of network interfaces to monitor for "
76 "connectivity (an empty list enables all interfaces).");
Vitaly Buka8b511e92015-07-18 20:43:58 -070077
78 DEFINE_bool(disable_security, false,
79 "disable Privet security for tests. For test only.");
80 DEFINE_string(test_privet_ssid, "",
81 "Fixed SSID for WiFi bootstrapping. For test only.");
82 DEFINE_string(test_definitions_path, "",
83 "Path to directory containing additional command "
84 "and state definitions. For test only.");
85
Aaron Kemp4a4be072015-02-11 08:00:06 -080086 chromeos::FlagHelper::Init(argc, argv, "Privet protocol handler daemon");
Christopher Wiley357deca2015-02-07 18:29:32 -080087 if (FLAGS_config_path.empty())
88 FLAGS_config_path = kDefaultConfigFilePath;
89 if (FLAGS_state_path.empty())
90 FLAGS_state_path = kDefaultStateFilePath;
Vitaly Bukab12e9952015-03-13 23:54:21 -070091 int flags = chromeos::kLogToSyslog | chromeos::kLogHeader;
92 if (FLAGS_log_to_stderr)
93 flags |= chromeos::kLogToStderr;
94 chromeos::InitLog(flags);
95
Vitaly Buka84fd6dd2015-06-09 17:22:18 -070096 auto device_whitelist =
97 chromeos::string_utils::Split(FLAGS_device_whitelist, ",", true, true);
98
Alex Vakulenkobc648492015-09-08 15:39:18 -070099 // We are handling write errors on closed sockets correctly and not relying on
100 // (nor handling) SIGPIPE signal, which just kills the process.
101 // Mark it to be ignored.
102 signal(SIGPIPE, SIG_IGN);
103
Alex Vakulenko0022b752015-10-02 11:09:59 -0700104 buffet::BuffetConfig::Options config_options;
105 config_options.defaults = base::FilePath{FLAGS_config_path};
106 config_options.settings = base::FilePath{FLAGS_state_path};
107 config_options.definitions = base::FilePath{"/etc/weaved"};
108 config_options.test_definitions = base::FilePath{FLAGS_test_definitions_path};
109 config_options.disable_security = FLAGS_disable_security;
110 config_options.test_privet_ssid = FLAGS_test_privet_ssid;
Vitaly Bukabecd4612015-08-16 23:31:55 -0700111
Alex Vakulenko0022b752015-10-02 11:09:59 -0700112 buffet::Manager::Options options;
Vitaly Buka84fd6dd2015-06-09 17:22:18 -0700113 options.xmpp_enabled = FLAGS_enable_xmpp;
Vitaly Buka0c6dcd22015-07-10 00:12:25 -0700114 options.disable_privet = FLAGS_disable_privet;
Vitaly Buka0c6dcd22015-07-10 00:12:25 -0700115 options.enable_ping = FLAGS_enable_ping;
Vitaly Buka84fd6dd2015-06-09 17:22:18 -0700116
Vitaly Buka7b9ebee2015-08-16 01:55:41 -0700117 buffet::Daemon daemon{
Alex Vakulenko0022b752015-10-02 11:09:59 -0700118 options, config_options,
Vitaly Buka7b9ebee2015-08-16 01:55:41 -0700119 std::set<std::string>{device_whitelist.begin(), device_whitelist.end()}};
Alex Vakulenko79e6a282014-09-08 17:07:19 -0700120 return daemon.Run();
Chris Sosa5bac9492014-03-24 11:18:54 -0700121}