1cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Copyright 2015 The Android Open Source Project
2cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
3cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Licensed under the Apache License, Version 2.0 (the "License");
4cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// you may not use this file except in compliance with the License.
5cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// You may obtain a copy of the License at
6cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
7cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//      http://www.apache.org/licenses/LICENSE-2.0
8cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka//
9cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// Unless required by applicable law or agreed to in writing, software
10cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// distributed under the License is distributed on an "AS IS" BASIS,
11cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// See the License for the specific language governing permissions and
13cad20f0768bb6f2b5b647c7663e9bfc4e7ac3cb7Vitaly Buka// limitations under the License.
145bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
155bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa#include <string>
165bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
17bc64849acd031deb5920a16311e8524a7a7390c3Alex Vakulenko#include <signal.h>
18ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <sysexits.h>
19bc64849acd031deb5920a16311e8524a7a7390c3Alex Vakulenko
20357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley#include <base/files/file_path.h>
21ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <binderwrapper/binder_wrapper.h>
22ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include <brillo/binder_watcher.h>
234170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/daemons/dbus_daemon.h>
244170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/dbus/async_event_sequencer.h>
254170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/dbus/exported_object_manager.h>
264170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/flag_helper.h>
274170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/strings/string_utils.h>
284170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko#include <brillo/syslog_logging.h>
295bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
30becd461462f428f136cd5368c664a951935222e9Vitaly Buka#include "buffet/buffet_config.h"
319485896e8a842f523867cca2154607a9704586bfAlex Vakulenko#include "buffet/dbus_constants.h"
324b5f04c56a2f13b4ec178ce430ea57ddadf1225fChristopher Wiley#include "buffet/manager.h"
33ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko#include "common/binder_constants.h"
345bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
354170585fe75d99036883229081420f2972dd4ec1Alex Vakulenkousing brillo::dbus_utils::AsyncEventSequencer;
364170585fe75d99036883229081420f2972dd4ec1Alex Vakulenkousing brillo::DBusServiceDaemon;
37cf92c66d1aa30678beaa64501c9febc3933c23a9Robert Gindausing buffet::dbus_constants::kServiceName;
38cf92c66d1aa30678beaa64501c9febc3933c23a9Robert Gindausing buffet::dbus_constants::kRootServicePath;
3954028f99aaa6917511102fc0572549a966257a8aChristopher Wiley
4079e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenkonamespace buffet {
415bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
421e3a66b4603e5eecc9a0791ee91bd72a7a93ffb3Alex Vakulenkoclass Daemon final : public DBusServiceDaemon {
4379e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko public:
442915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  explicit Daemon(const Manager::Options& options)
452915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko      : DBusServiceDaemon(kServiceName, kRootServicePath), options_{options} {}
46ea6456d3db72097b2d5ad071202cfd01c05b288aChris Sosa
4779e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko protected:
48ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko  int OnInit() override {
49ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko    android::BinderWrapper::Create();
50ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko    if (!binder_watcher_.Init())
51ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko      return EX_OSERR;
52ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
53ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko    return brillo::DBusServiceDaemon::OnInit();
54ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko  }
55ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko
5679e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko  void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override {
57ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko    manager_ = new Manager{options_, bus_};
58ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko    android::BinderWrapper::Get()->RegisterService(
59ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko        weaved::binder::kWeaveServiceName,
60ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko        android::IInterface::asBinder(manager_));
612915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko    manager_->Start(sequencer);
625bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa  }
635bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
6484fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  void OnShutdown(int* return_code) override { manager_->Stop(); }
6584fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka
6679e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko private:
670022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  Manager::Options options_;
68ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko  brillo::BinderWatcher binder_watcher_;
69ae29f7d91a0b4178556eeb6b99fd05d90fcefd3dAlex Vakulenko  android::sp<buffet::Manager> manager_;
7058a288b5b10aec975c7bc4fbfdcbcb80d5899c12Vitaly Buka
7179e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko  DISALLOW_COPY_AND_ASSIGN(Daemon);
7279e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko};
7354028f99aaa6917511102fc0572549a966257a8aChristopher Wiley
7479e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko}  // namespace buffet
755bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa
76357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wileynamespace {
77357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley
788e34636ec3a3ff33b041a30805b310e17ec3c8efAlex Vakulenkoconst char kDefaultConfigFilePath[] = "/etc/weaved/weaved.conf";
79d42e09d85b2bc48028edd79993bfd30631b9e475Alex Vakulenkoconst char kDefaultStateFilePath[] = "/data/misc/weaved/device_reg_info";
80357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley
81357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley}  // namespace
82357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley
835bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosaint main(int argc, char* argv[]) {
84b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka  DEFINE_bool(log_to_stderr, false, "log trace messages to stderr as well");
85357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley  DEFINE_string(config_path, kDefaultConfigFilePath,
86357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley                "Path to file containing config information.");
87357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley  DEFINE_string(state_path, kDefaultStateFilePath,
88357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley                "Path to file containing state information.");
891d35ecce32826b7a8aeb4a040a8621ddc95f4eb9Christopher Wiley  DEFINE_bool(enable_xmpp, true,
901d35ecce32826b7a8aeb4a040a8621ddc95f4eb9Christopher Wiley              "Connect to GCD via a persistent XMPP connection.");
9149c36eecb39618ee15ec212cd31235645d1ffea2Alex Vakulenko  DEFINE_bool(disable_privet, false, "disable Privet protocol");
9284fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  DEFINE_bool(enable_ping, false, "enable test HTTP handler at /privet/ping");
9384fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  DEFINE_string(device_whitelist, "",
9484fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka                "Comma separated list of network interfaces to monitor for "
9584fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka                "connectivity (an empty list enables all interfaces).");
968b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka
978b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka  DEFINE_string(test_privet_ssid, "",
988b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka                "Fixed SSID for WiFi bootstrapping. For test only.");
998b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka  DEFINE_string(test_definitions_path, "",
1008b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka                "Path to directory containing additional command "
1018b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka                "and state definitions. For test only.");
1028b511e9ecab910d0b6db30dc2a8a08733ac7e90eVitaly Buka
1034170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko  brillo::FlagHelper::Init(argc, argv, "Privet protocol handler daemon");
104357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley  if (FLAGS_config_path.empty())
105357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley    FLAGS_config_path = kDefaultConfigFilePath;
106357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley  if (FLAGS_state_path.empty())
107357deca5ddee619afb0d6fe24ab8bdeed6c3c43eChristopher Wiley    FLAGS_state_path = kDefaultStateFilePath;
1084170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko  int flags = brillo::kLogToSyslog | brillo::kLogHeader;
109b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka  if (FLAGS_log_to_stderr)
1104170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko    flags |= brillo::kLogToStderr;
1114170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko  brillo::InitLog(flags);
112b12e995d8771e4970ff349cd9759b16e1d386696Vitaly Buka
11384fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  auto device_whitelist =
1144170585fe75d99036883229081420f2972dd4ec1Alex Vakulenko      brillo::string_utils::Split(FLAGS_device_whitelist, ",", true, true);
11584fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka
116bc64849acd031deb5920a16311e8524a7a7390c3Alex Vakulenko  // We are handling write errors on closed sockets correctly and not relying on
117bc64849acd031deb5920a16311e8524a7a7390c3Alex Vakulenko  // (nor handling) SIGPIPE signal, which just kills the process.
118bc64849acd031deb5920a16311e8524a7a7390c3Alex Vakulenko  // Mark it to be ignored.
119bc64849acd031deb5920a16311e8524a7a7390c3Alex Vakulenko  signal(SIGPIPE, SIG_IGN);
120bc64849acd031deb5920a16311e8524a7a7390c3Alex Vakulenko
1210022b7523bca3bde23c0f982384f83a39791e88bAlex Vakulenko  buffet::Manager::Options options;
12284fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka  options.xmpp_enabled = FLAGS_enable_xmpp;
1230c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka  options.disable_privet = FLAGS_disable_privet;
1240c6dcd2dacc3d4f0024973d938f0537bb93773a4Vitaly Buka  options.enable_ping = FLAGS_enable_ping;
1252915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  options.device_whitelist = {device_whitelist.begin(), device_whitelist.end()};
1262915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko
1272915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  options.config_options.defaults = base::FilePath{FLAGS_config_path};
1282915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  options.config_options.settings = base::FilePath{FLAGS_state_path};
1292915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  options.config_options.definitions = base::FilePath{"/etc/weaved"};
1302915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  options.config_options.test_definitions =
1312915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko      base::FilePath{FLAGS_test_definitions_path};
1322915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  options.config_options.test_privet_ssid = FLAGS_test_privet_ssid;
13384fd6dd850ac58a0f17f8d30a683b1f983e52435Vitaly Buka
1342915a7b9a45821a7530d2fea8a982bc1b6efc7d3Alex Vakulenko  buffet::Daemon daemon{options};
13579e6a281e95a1226c90ff90084415df13fd858dbAlex Vakulenko  return daemon.Run();
1365bac949c8339cd271a11b5b3bc5e16f7e8a0f2fChris Sosa}
137