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