// Copyright (C) 2016-2022 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. #ifndef CFG_DBACCESS_H #define CFG_DBACCESS_H #include #include #include #include #include namespace isc { namespace dhcp { /// @brief Holds access parameters and the configuration of the /// lease and hosts database connection. /// /// The database access strings use the same format as the strings /// passed to the @ref isc::dhcp::LeaseMgrFactory::create function. class CfgDbAccess { public: /// @brief Constructor. CfgDbAccess(); /// @brief Sets parameters which will be appended to the database /// access strings. /// /// @param appended_parameters String holding collection of parameters /// in the following format: "parameter0=value0 parameter1=value1 ...". void setAppendedParameters(const std::string& appended_parameters) { appended_parameters_ = appended_parameters; } /// @brief Retrieves lease database access string. /// /// @return Lease database access string with additional parameters /// specified with @ref CfgDbAccess::setAppendedParameters. std::string getLeaseDbAccessString() const; /// @brief Sets lease database access string. /// /// @param lease_db_access New lease database access string. void setLeaseDbAccessString(const std::string& lease_db_access) { lease_db_access_ = lease_db_access; } /// @brief Retrieves host database access string. /// /// @return Host database access string with additional parameters /// specified with @ref CfgDbAccess::setAppendedParameters. std::string getHostDbAccessString() const; /// @brief Sets host database access string. /// /// @param host_db_access New host database access string. /// @param front Add at front if true, at back if false (default). void setHostDbAccessString(const std::string& host_db_access, bool front = false) { if (front) { host_db_access_.push_front(host_db_access); } else { host_db_access_.push_back(host_db_access); } } /// @brief Retrieves host database access string. /// /// @return Database access strings with additional parameters /// specified with @ref CfgDbAccess::setAppendedParameters std::list getHostDbAccessStringList() const; /// @brief Modifies the setting imposing whether the IP reservations /// are unique or can be non unique. /// /// This flag can be set to @c false when the server is explicitly /// configured to allow multiple hosts to have the same IP reservation /// in a subnet. In that case, the @c createManagers function will /// attempt to use this setting for @c HostMgr. /// /// Note that the @c HostMgr can reject the new setting if any of the /// host backends used does not support specifying multipe hosts with /// the same IP address in a subnet. /// /// @param unique new setting to be used by @c HostMgr. void setIPReservationsUnique(const bool unique) { ip_reservations_unique_ = unique; } /// @brief Returns the setting indicating if the IP reservations are /// unique or can be non unique. /// /// @return true if the IP reservations must be unique or false if /// the reservations can be non unique. bool getIPReservationsUnique() const { return (ip_reservations_unique_); } /// @brief Modifies the setting whether the lease extended info tables /// are enabled. /// /// @param enabled new setting to be used by @c LeaseMgr. void setExtendedInfoTablesEnabled(const bool enabled) { extended_info_tables_enabled_ = enabled; } /// @brief Returns the setting indicating if lease extended info tables /// are enabled. /// /// @return true if lease extended info tables are enabled or false /// if they are disabled. bool getExtendedInfoTablesEnabled() const { return (extended_info_tables_enabled_); } /// @brief Creates instance of lease manager and host data sources /// according to the configuration specified. void createManagers() const; protected: /// @brief Returns lease or host database access string. /// /// @param access_string without additional (appended) parameters. std::string getAccessString(const std::string& access_string) const; /// @brief Parameters to be appended to the database access /// strings. std::string appended_parameters_; /// @brief Holds lease database access string. std::string lease_db_access_; /// @brief Holds host database access strings. std::list host_db_access_; /// @brief Holds the setting whether IP reservations should be unique /// or can be non-unique. bool ip_reservations_unique_; /// @brief Holds the setting whether the lease extended info tables /// are enabled or disabled. The default is disabled. bool extended_info_tables_enabled_; }; /// @brief A pointer to the @c CfgDbAccess. typedef boost::shared_ptr CfgDbAccessPtr; /// @brief A pointer to the const @c CfgDbAccess. typedef boost::shared_ptr ConstCfgDbAccessPtr; /// @brief utility class for unparsing struct CfgLeaseDbAccess : public CfgDbAccess, public isc::data::CfgToElement { /// @brief Constructor CfgLeaseDbAccess(const CfgDbAccess& super) : CfgDbAccess(super) { } /// @brief Unparse /// /// @ref isc::data::CfgToElement::toElement /// /// @result a pointer to a configuration virtual isc::data::ElementPtr toElement() const { return (db::DatabaseConnection::toElementDbAccessString(lease_db_access_)); } }; struct CfgHostDbAccess : public CfgDbAccess, public isc::data::CfgToElement { /// @brief Constructor CfgHostDbAccess(const CfgDbAccess& super) : CfgDbAccess(super) { } /// @brief Unparse /// /// @ref isc::data::CfgToElement::toElement /// /// @result a pointer to a configuration virtual isc::data::ElementPtr toElement() const { isc::data::ElementPtr result = isc::data::Element::createList(); for (const std::string& dbaccess : host_db_access_) { isc::data::ElementPtr entry = db::DatabaseConnection::toElementDbAccessString(dbaccess); if (entry->size() > 0) { result->add(entry); } } return (result); } }; } } #endif // CFG_DBACCESS_H