buffet: Read config/state paths from commandline This allows us to use custom paths and configurations in test without altering normal system operation. BUG=brillo:172 TEST=unittests Change-Id: I1a969093683205d5f600ff88ebba8b22c05368b4 Reviewed-on: https://chromium-review.googlesource.com/247504 Tested-by: Christopher Wiley <wiley@chromium.org> Reviewed-by: Alex Vakulenko <avakulenko@chromium.org> Commit-Queue: Christopher Wiley <wiley@chromium.org>
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc index e947157..187ec39 100644 --- a/buffet/device_registration_info.cc +++ b/buffet/device_registration_info.cc
@@ -25,7 +25,6 @@ #include "buffet/commands/command_manager.h" #include "buffet/device_registration_storage_keys.h" #include "buffet/states/state_manager.h" -#include "buffet/storage_impls.h" #include "buffet/utils.h" const char buffet::kErrorDomainOAuth2[] = "oauth2"; @@ -57,9 +56,6 @@ namespace { -const base::FilePath::CharType kDeviceInfoFilePath[] = - FILE_PATH_LITERAL("/var/lib/buffet/device_reg_info"); - std::pair<std::string, std::string> BuildAuthHeader( const std::string& access_token_type, const std::string& access_token) { @@ -146,25 +142,11 @@ DeviceRegistrationInfo::DeviceRegistrationInfo( const std::shared_ptr<CommandManager>& command_manager, const std::shared_ptr<StateManager>& state_manager, - std::unique_ptr<chromeos::KeyValueStore> config_store) - : DeviceRegistrationInfo( - command_manager, - state_manager, - std::move(config_store), - chromeos::http::Transport::CreateDefault(), - // TODO(avakulenko): Figure out security implications of storing - // this data unencrypted. - std::make_shared<FileStorage>(base::FilePath{kDeviceInfoFilePath})) { -} - -DeviceRegistrationInfo::DeviceRegistrationInfo( - const std::shared_ptr<CommandManager>& command_manager, - const std::shared_ptr<StateManager>& state_manager, std::unique_ptr<chromeos::KeyValueStore> config_store, const std::shared_ptr<chromeos::http::Transport>& transport, - const std::shared_ptr<StorageInterface>& storage) + const std::shared_ptr<StorageInterface>& state_store) : transport_{transport}, - storage_{storage}, + storage_{state_store}, command_manager_{command_manager}, state_manager_{state_manager}, config_store_{std::move(config_store)} {
diff --git a/buffet/device_registration_info.h b/buffet/device_registration_info.h index 0e274c6..dc3524a 100644 --- a/buffet/device_registration_info.h +++ b/buffet/device_registration_info.h
@@ -41,19 +41,13 @@ public: // This is a helper class for unit testing. class TestHelper; - // This constructor uses CURL HTTP transport. - DeviceRegistrationInfo( - const std::shared_ptr<CommandManager>& command_manager, - const std::shared_ptr<StateManager>& state_manager, - std::unique_ptr<chromeos::KeyValueStore> config_store); - // This constructor allows to pass in a custom HTTP transport - // (mainly for testing). + DeviceRegistrationInfo( const std::shared_ptr<CommandManager>& command_manager, const std::shared_ptr<StateManager>& state_manager, std::unique_ptr<chromeos::KeyValueStore> config_store, const std::shared_ptr<chromeos::http::Transport>& transport, - const std::shared_ptr<StorageInterface>& storage); + const std::shared_ptr<StorageInterface>& state_store); ~DeviceRegistrationInfo();
diff --git a/buffet/etc/init/buffet.conf b/buffet/etc/init/buffet.conf index 0d7697e..0747ef5 100644 --- a/buffet/etc/init/buffet.conf +++ b/buffet/etc/init/buffet.conf
@@ -9,6 +9,10 @@ stop on stopping system-services respawn +env BUFFET_LOG_LEVEL=0 +env BUFFET_STATE_PATH= +env BUFFET_CONFIG_PATH= + pre-start script mkdir -m 0755 -p /var/lib/buffet chown -R buffet:buffet /var/lib/buffet @@ -17,5 +21,7 @@ # Minijail actually forks off our desired process. expect fork -exec minijail0 -i -g buffet -u buffet \ - /usr/bin/buffet --v="${V:-1}" +exec minijail0 -i -g buffet -u buffet /usr/bin/buffet \ + --v="${BUFFET_LOG_LEVEL}" \ + --config_path="${BUFFET_CONFIG_PATH}" \ + --state_path="${BUFFET_STATE_PATH}"
diff --git a/buffet/main.cc b/buffet/main.cc index 7cb37fb..1dc3388 100644 --- a/buffet/main.cc +++ b/buffet/main.cc
@@ -4,10 +4,11 @@ #include <string> -#include <base/command_line.h> +#include <base/files/file_path.h> #include <chromeos/dbus/async_event_sequencer.h> #include <chromeos/dbus/exported_object_manager.h> #include <chromeos/daemons/dbus_daemon.h> +#include <chromeos/flag_helper.h> #include <chromeos/syslog_logging.h> #include "buffet/dbus_constants.h" @@ -22,26 +23,50 @@ class Daemon : public DBusServiceDaemon { public: - Daemon() : DBusServiceDaemon(kServiceName, kRootServicePath) {} + Daemon(const base::FilePath& config_path, + const base::FilePath& state_path) + : DBusServiceDaemon(kServiceName, kRootServicePath), + config_path_{config_path}, + state_path_{state_path} {} protected: void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override { manager_.reset(new buffet::Manager(object_manager_->AsWeakPtr())); manager_->RegisterAsync( + config_path_, + state_path_, sequencer->GetHandler("Manager.RegisterAsync() failed.", true)); } private: std::unique_ptr<buffet::Manager> manager_; + const base::FilePath config_path_; + const base::FilePath state_path_; DISALLOW_COPY_AND_ASSIGN(Daemon); }; } // namespace buffet +namespace { + +const char kDefaultConfigFilePath[] = "/etc/buffet/buffet.conf"; +const char kDefaultStateFilePath[] = "/var/lib/buffet/device_reg_info"; + +} // namespace + int main(int argc, char* argv[]) { - CommandLine::Init(argc, argv); + DEFINE_string(config_path, kDefaultConfigFilePath, + "Path to file containing config information."); + DEFINE_string(state_path, kDefaultStateFilePath, + "Path to file containing state information."); + if (FLAGS_config_path.empty()) + FLAGS_config_path = kDefaultConfigFilePath; + if (FLAGS_state_path.empty()) + FLAGS_state_path = kDefaultStateFilePath; + chromeos::FlagHelper::Init(argc, argv, "Privet protocol handler daemon"); chromeos::InitLog(chromeos::kLogToSyslog | chromeos::kLogHeader); - buffet::Daemon daemon; + buffet::Daemon daemon{base::FilePath{FLAGS_config_path}, + base::FilePath{FLAGS_state_path}}; return daemon.Run(); }
diff --git a/buffet/manager.cc b/buffet/manager.cc index 04fcc36..6605770 100644 --- a/buffet/manager.cc +++ b/buffet/manager.cc
@@ -23,6 +23,7 @@ #include "buffet/commands/command_manager.h" #include "buffet/states/state_change_queue.h" #include "buffet/states/state_manager.h" +#include "buffet/storage_impls.h" using chromeos::dbus_utils::AsyncEventSequencer; using chromeos::dbus_utils::ExportedObjectManager; @@ -41,7 +42,10 @@ Manager::~Manager() {} -void Manager::RegisterAsync(const AsyncEventSequencer::CompletionAction& cb) { +void Manager::RegisterAsync( + const base::FilePath& config_path, + const base::FilePath& state_path, + const AsyncEventSequencer::CompletionAction& cb) { command_manager_ = std::make_shared<CommandManager>(dbus_object_.GetObjectManager()); command_manager_->Startup(); @@ -50,13 +54,17 @@ state_manager_ = std::make_shared<StateManager>(state_change_queue_.get()); state_manager_->Startup(); std::unique_ptr<chromeos::KeyValueStore> config_store{ - new chromeos::KeyValueStore}; - config_store->Load(base::FilePath( - FILE_PATH_LITERAL("/etc/buffet/buffet.conf"))); + new chromeos::KeyValueStore}; + std::unique_ptr<FileStorage> state_store{new FileStorage{state_path}}; + config_store->Load(config_path); + // TODO(avakulenko): Figure out security implications of storing + // device info state data unencrypted. device_info_ = std::unique_ptr<DeviceRegistrationInfo>( new DeviceRegistrationInfo(command_manager_, state_manager_, - std::move(config_store))); + std::move(config_store), + chromeos::http::Transport::CreateDefault(), + std::move(state_store))); device_info_->Load(); dbus_adaptor_.RegisterWithDBusObject(&dbus_object_); dbus_object_.RegisterAsync(cb);
diff --git a/buffet/manager.h b/buffet/manager.h index ab5171f..c0086ed 100644 --- a/buffet/manager.h +++ b/buffet/manager.h
@@ -9,6 +9,7 @@ #include <memory> #include <string> +#include <base/files/file_path.h> #include <base/macros.h> #include <base/memory/weak_ptr.h> #include <base/values.h> @@ -47,6 +48,8 @@ ~Manager(); void RegisterAsync( + const base::FilePath& config_path, + const base::FilePath& state_path, const chromeos::dbus_utils::AsyncEventSequencer::CompletionAction& cb); private: