diff --git a/src/account_factory.h b/src/account_factory.h index 571d820d151582a140ea408a23848194fa6f51ef..2b4421d4eef27b23702176cf58ebca53bfddd2c0 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 c877dbd8ea4989e064439114f46cfd9bb185a884..48af7c3dff5100b9ceeb21933f17b95b38410f21 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 c16f3cf2c4ea6a077beb96e62c7c91eef852e813..b2b5ebb5c2e8725e4b399c7fad08f22009c43ead 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