From af109522bb9a345c28ace3a05c785c4273fb48b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Wed, 15 Aug 2018 15:05:19 -0400 Subject: [PATCH] configuration: store Ring account config in account dir Change-Id: I56e4a8f74400f1c838bc3cd1a9b82b1e2c23ccb1 --- src/account_factory.h | 1 + src/manager.cpp | 39 ++++++++++++++++++++++++++++++++++++++- src/ringdht/ringaccount.h | 4 ++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/account_factory.h b/src/account_factory.h index 571d820d15..2b4421d4ee 100644 --- a/src/account_factory.h +++ b/src/account_factory.h @@ -28,6 +28,7 @@ #include <mutex> #include <utility> #include <functional> +#include <ciso646> namespace ring { diff --git a/src/manager.cpp b/src/manager.cpp index c877dbd8ea..48af7c3dff 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -1792,7 +1792,20 @@ Manager::saveConfig() out << YAML::Value << YAML::BeginSeq; for (const auto& account : accountFactory.getAllAccounts()) { - account->serialize(out); + if (auto ringAccount = std::dynamic_pointer_cast<RingAccount>(account)) { + try { + YAML::Emitter accountOut; + ringAccount->serialize(accountOut); + auto accountConfig = ringAccount->getPath() + DIR_SEPARATOR_STR + "config.yml"; + std::ofstream fout(accountConfig); + fout << accountOut.c_str(); + RING_DBG("Exported Ring account to %s", accountConfig.c_str()); + } catch (const std::exception& e) { + RING_ERR("Error exporting Ring account: %s", e.what()); + } + } else { + account->serialize(out); + } } out << YAML::EndSeq; @@ -2839,6 +2852,30 @@ Manager::loadAccountMap(const YAML::Node& node) pimpl_->loadAccount(a, errorCount, accountOrder); } + auto accountBaseDir = fileutils::get_data_dir(); + auto dirs = fileutils::readDirectory(accountBaseDir); + for (const auto& dir : dirs) { + if (accountFactory.hasAccount<RingAccount>(dir)) { + continue; + } + auto configFile = accountBaseDir + DIR_SEPARATOR_STR + dir + DIR_SEPARATOR_STR + "config.yml"; + if (fileutils::isFile(configFile)) { + try { + if (auto a = accountFactory.createAccount(RingAccount::ACCOUNT_TYPE, dir)) { + YAML::Node parsedConfig = YAML::LoadFile(configFile); + a->unserialize(parsedConfig); + } + } catch (const std::exception& e) { + RING_ERR("Can't import Ring account %s: %s", dir.c_str(), e.what()); + } + continue; + } + auto exportFile = accountBaseDir + DIR_SEPARATOR_STR + dir + DIR_SEPARATOR_STR + "export.gz"; + if (fileutils::isFile(exportFile)) { + RING_WARN("Found abandonned Ring account: %s", exportFile.c_str()); + } + } + return errorCount; } diff --git a/src/ringdht/ringaccount.h b/src/ringdht/ringaccount.h index c16f3cf2c4..b2b5ebb5c2 100644 --- a/src/ringdht/ringaccount.h +++ b/src/ringdht/ringaccount.h @@ -101,6 +101,10 @@ class RingAccount : public SIPAccountBase { return std::static_pointer_cast<RingAccount const>(shared_from_this()); } + const std::string& getPath() const { + return idPath_; + } + /** * Constructor * @param accountID The account identifier -- GitLab