mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-09-07 07:12:52 +02:00
Wiring through initialization of the CentralDB version of the controller
Still need to do the actual configuration from local.conf
This commit is contained in:
parent
4ddb1fbe58
commit
a5bd262b3a
13 changed files with 230 additions and 52 deletions
|
@ -54,7 +54,7 @@ if(ZT1_CENTRAL_CONTROLLER)
|
||||||
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to" FORCE)
|
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to" FORCE)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED True CACHE BOOL "C++ standard required" FORCE)
|
set(CMAKE_CXX_STANDARD_REQUIRED True CACHE BOOL "C++ standard required" FORCE)
|
||||||
set(CMAKE_CXX_EXTENSIONS ON CACHE BOOL "Enable compiler-specific extensions" FORCE)
|
set(CMAKE_CXX_EXTENSIONS ON CACHE BOOL "Enable compiler-specific extensions" FORCE)
|
||||||
add_definitions(-DZT_CONTROLLER_USE_LIBPQ -DZT1_CENTRAL_CONTROLLER)
|
add_definitions(-DZT_NONFREE_CONTROLLER=1 -DZT_CONTROLLER_USE_LIBPQ=1 -DZT1_CENTRAL_CONTROLLER=1)
|
||||||
set(CONTROLLER_RUST_FEATURES ztcontroller)
|
set(CONTROLLER_RUST_FEATURES ztcontroller)
|
||||||
set(RUST_BUILD_COMMAND cargo build --release -F ${CONTROLLER_RUST_FEATURES})
|
set(RUST_BUILD_COMMAND cargo build --release -F ${CONTROLLER_RUST_FEATURES})
|
||||||
else()
|
else()
|
||||||
|
|
|
@ -7,11 +7,6 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace ZeroTier {
|
namespace ZeroTier {
|
||||||
struct BigTableConfig {
|
|
||||||
std::string project_id;
|
|
||||||
std::string instance_id;
|
|
||||||
std::string table_id;
|
|
||||||
};
|
|
||||||
|
|
||||||
class BigTableStatusWriter : public StatusWriter {
|
class BigTableStatusWriter : public StatusWriter {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -41,6 +41,7 @@ if (ZT1_CENTRAL_CONTROLLER)
|
||||||
CV2.hpp
|
CV2.hpp
|
||||||
CentralDB.cpp
|
CentralDB.cpp
|
||||||
CentralDB.hpp
|
CentralDB.hpp
|
||||||
|
ControllerConfig.hpp
|
||||||
NotificationListener.hpp
|
NotificationListener.hpp
|
||||||
PostgreSQL.cpp
|
PostgreSQL.cpp
|
||||||
PostgreSQL.hpp
|
PostgreSQL.hpp
|
||||||
|
@ -55,6 +56,7 @@ if (ZT1_CENTRAL_CONTROLLER)
|
||||||
BigTableStatusWriter.hpp
|
BigTableStatusWriter.hpp
|
||||||
PostgresStatusWriter.cpp
|
PostgresStatusWriter.cpp
|
||||||
PostgresStatusWriter.hpp
|
PostgresStatusWriter.hpp
|
||||||
|
Redis.hpp
|
||||||
RedisStatusWriter.cpp
|
RedisStatusWriter.cpp
|
||||||
RedisStatusWriter.hpp
|
RedisStatusWriter.hpp
|
||||||
)
|
)
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "../../node/SHA512.hpp"
|
#include "../../node/SHA512.hpp"
|
||||||
#include "../../version.h"
|
#include "../../version.h"
|
||||||
#include "BigTableStatusWriter.hpp"
|
#include "BigTableStatusWriter.hpp"
|
||||||
|
#include "ControllerConfig.hpp"
|
||||||
#include "CtlUtil.hpp"
|
#include "CtlUtil.hpp"
|
||||||
#include "EmbeddedNetworkController.hpp"
|
#include "EmbeddedNetworkController.hpp"
|
||||||
#include "PostgresStatusWriter.hpp"
|
#include "PostgresStatusWriter.hpp"
|
||||||
|
@ -55,15 +56,15 @@ using ItemStream = std::vector<Item>;
|
||||||
|
|
||||||
CentralDB::CentralDB(
|
CentralDB::CentralDB(
|
||||||
const Identity& myId,
|
const Identity& myId,
|
||||||
const char* path,
|
const char* connString,
|
||||||
int listenPort,
|
int listenPort,
|
||||||
CentralDB::ListenerMode listenMode,
|
CentralDB::ListenerMode listenMode,
|
||||||
CentralDB::StatusWriterMode statusMode,
|
CentralDB::StatusWriterMode statusMode,
|
||||||
ControllerConfig* cc)
|
const ControllerConfig* cc)
|
||||||
: DB()
|
: DB()
|
||||||
, _listenerMode(listenMode)
|
, _listenerMode(listenMode)
|
||||||
, _statusWriterMode(statusMode)
|
, _statusWriterMode(statusMode)
|
||||||
, _controllerConfig(cc)
|
, _cc(cc)
|
||||||
, _pool()
|
, _pool()
|
||||||
, _myId(myId)
|
, _myId(myId)
|
||||||
, _myAddress(myId.address())
|
, _myAddress(myId.address())
|
||||||
|
@ -72,7 +73,6 @@ CentralDB::CentralDB(
|
||||||
, _run(1)
|
, _run(1)
|
||||||
, _waitNoticePrinted(false)
|
, _waitNoticePrinted(false)
|
||||||
, _listenPort(listenPort)
|
, _listenPort(listenPort)
|
||||||
, _rc(cc->redisConfig)
|
|
||||||
, _redis(NULL)
|
, _redis(NULL)
|
||||||
, _cluster(NULL)
|
, _cluster(NULL)
|
||||||
, _redisMemberStatus(false)
|
, _redisMemberStatus(false)
|
||||||
|
@ -87,7 +87,7 @@ CentralDB::CentralDB(
|
||||||
|
|
||||||
char myAddress[64];
|
char myAddress[64];
|
||||||
_myAddressStr = myId.address().toString(myAddress);
|
_myAddressStr = myId.address().toString(myAddress);
|
||||||
_connString = std::string(path);
|
_connString = std::string(connString);
|
||||||
auto f = std::make_shared<PostgresConnFactory>(_connString);
|
auto f = std::make_shared<PostgresConnFactory>(_connString);
|
||||||
_pool =
|
_pool =
|
||||||
std::make_shared<ConnectionPool<PostgresConnection> >(15, 5, std::static_pointer_cast<ConnectionFactory>(f));
|
std::make_shared<ConnectionPool<PostgresConnection> >(15, 5, std::static_pointer_cast<ConnectionFactory>(f));
|
||||||
|
@ -126,15 +126,15 @@ CentralDB::CentralDB(
|
||||||
}
|
}
|
||||||
_pool->unborrow(c);
|
_pool->unborrow(c);
|
||||||
|
|
||||||
if ((listenMode == LISTENER_MODE_REDIS || statusMode == STATUS_WRITER_MODE_REDIS) && _rc != NULL) {
|
if ((listenMode == LISTENER_MODE_REDIS || statusMode == STATUS_WRITER_MODE_REDIS) && _cc->redisConfig != NULL) {
|
||||||
auto innerspan = tracer->StartSpan("CentralDB::CentralDB::configureRedis");
|
auto innerspan = tracer->StartSpan("CentralDB::CentralDB::configureRedis");
|
||||||
auto innerscope = tracer->WithActiveSpan(innerspan);
|
auto innerscope = tracer->WithActiveSpan(innerspan);
|
||||||
|
|
||||||
sw::redis::ConnectionOptions opts;
|
sw::redis::ConnectionOptions opts;
|
||||||
sw::redis::ConnectionPoolOptions poolOpts;
|
sw::redis::ConnectionPoolOptions poolOpts;
|
||||||
opts.host = _rc->hostname;
|
opts.host = _cc->redisConfig->hostname;
|
||||||
opts.port = _rc->port;
|
opts.port = _cc->redisConfig->port;
|
||||||
opts.password = _rc->password;
|
opts.password = _cc->redisConfig->password;
|
||||||
opts.db = 0;
|
opts.db = 0;
|
||||||
opts.keep_alive = true;
|
opts.keep_alive = true;
|
||||||
opts.connect_timeout = std::chrono::seconds(3);
|
opts.connect_timeout = std::chrono::seconds(3);
|
||||||
|
@ -142,7 +142,7 @@ CentralDB::CentralDB(
|
||||||
poolOpts.wait_timeout = std::chrono::seconds(5);
|
poolOpts.wait_timeout = std::chrono::seconds(5);
|
||||||
poolOpts.connection_lifetime = std::chrono::minutes(3);
|
poolOpts.connection_lifetime = std::chrono::minutes(3);
|
||||||
poolOpts.connection_idle_time = std::chrono::minutes(1);
|
poolOpts.connection_idle_time = std::chrono::minutes(1);
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
innerspan->SetAttribute("cluster_mode", "true");
|
innerspan->SetAttribute("cluster_mode", "true");
|
||||||
fprintf(stderr, "Using Redis in Cluster Mode\n");
|
fprintf(stderr, "Using Redis in Cluster Mode\n");
|
||||||
_cluster = std::make_shared<sw::redis::RedisCluster>(opts, poolOpts);
|
_cluster = std::make_shared<sw::redis::RedisCluster>(opts, poolOpts);
|
||||||
|
@ -168,8 +168,8 @@ CentralDB::CentralDB(
|
||||||
|
|
||||||
switch (listenMode) {
|
switch (listenMode) {
|
||||||
case LISTENER_MODE_REDIS:
|
case LISTENER_MODE_REDIS:
|
||||||
if (_rc != NULL) {
|
if (_cc->redisConfig != NULL) {
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
_membersDbWatcher = std::make_shared<RedisMemberListener>(_myAddressStr, _cluster, this);
|
_membersDbWatcher = std::make_shared<RedisMemberListener>(_myAddressStr, _cluster, this);
|
||||||
_networksDbWatcher = std::make_shared<RedisNetworkListener>(_myAddressStr, _cluster, this);
|
_networksDbWatcher = std::make_shared<RedisNetworkListener>(_myAddressStr, _cluster, this);
|
||||||
}
|
}
|
||||||
|
@ -202,8 +202,8 @@ CentralDB::CentralDB(
|
||||||
|
|
||||||
switch (statusMode) {
|
switch (statusMode) {
|
||||||
case STATUS_WRITER_MODE_REDIS:
|
case STATUS_WRITER_MODE_REDIS:
|
||||||
if (_rc != NULL) {
|
if (_cc->redisConfig != NULL) {
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
_statusWriter = std::make_shared<RedisStatusWriter>(_cluster, _myAddressStr);
|
_statusWriter = std::make_shared<RedisStatusWriter>(_cluster, _myAddressStr);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -441,7 +441,7 @@ void CentralDB::nodeIsOnline(const uint64_t networkId, const uint64_t memberId,
|
||||||
|
|
||||||
AuthInfo CentralDB::getSSOAuthInfo(const nlohmann::json& member, const std::string& redirectURL)
|
AuthInfo CentralDB::getSSOAuthInfo(const nlohmann::json& member, const std::string& redirectURL)
|
||||||
{
|
{
|
||||||
if (_controllerConfig->ssoEnabled) {
|
if (_cc->ssoEnabled) {
|
||||||
auto provider = opentelemetry::trace::Provider::GetTracerProvider();
|
auto provider = opentelemetry::trace::Provider::GetTracerProvider();
|
||||||
auto tracer = provider->GetTracer("CentralDB");
|
auto tracer = provider->GetTracer("CentralDB");
|
||||||
auto span = tracer->StartSpan("CentralDB::getSSOAuthInfo");
|
auto span = tracer->StartSpan("CentralDB::getSSOAuthInfo");
|
||||||
|
@ -797,7 +797,7 @@ void CentralDB::initializeMembers()
|
||||||
|
|
||||||
if (! deletes.empty()) {
|
if (! deletes.empty()) {
|
||||||
try {
|
try {
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
auto tx = _cluster->transaction(_myAddressStr, true, false);
|
auto tx = _cluster->transaction(_myAddressStr, true, false);
|
||||||
for (std::string k : deletes) {
|
for (std::string k : deletes) {
|
||||||
tx.del(k);
|
tx.del(k);
|
||||||
|
@ -961,7 +961,7 @@ void CentralDB::initializeMembers()
|
||||||
if (! networkMembers.empty()) {
|
if (! networkMembers.empty()) {
|
||||||
if (_redisMemberStatus) {
|
if (_redisMemberStatus) {
|
||||||
fprintf(stderr, "Load member data into redis...\n");
|
fprintf(stderr, "Load member data into redis...\n");
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
auto tx = _cluster->transaction(_myAddressStr, true, false);
|
auto tx = _cluster->transaction(_myAddressStr, true, false);
|
||||||
uint64_t count = 0;
|
uint64_t count = 0;
|
||||||
for (auto it : networkMembers) {
|
for (auto it : networkMembers) {
|
||||||
|
@ -1071,7 +1071,7 @@ void CentralDB::heartbeat()
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (_listenerMode == LISTENER_MODE_REDIS && _redisMemberStatus) {
|
if (_listenerMode == LISTENER_MODE_REDIS && _redisMemberStatus) {
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
_cluster->zadd("controllers", "controllerId", ts);
|
_cluster->zadd("controllers", "controllerId", ts);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1298,7 +1298,7 @@ void CentralDB::commitThread()
|
||||||
std::string id = config["id"];
|
std::string id = config["id"];
|
||||||
std::string controllerId = _myAddressStr.c_str();
|
std::string controllerId = _myAddressStr.c_str();
|
||||||
std::string key = "networks:{" + controllerId + "}";
|
std::string key = "networks:{" + controllerId + "}";
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
_cluster->sadd(key, id);
|
_cluster->sadd(key, id);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1340,7 +1340,7 @@ void CentralDB::commitThread()
|
||||||
std::string id = config["id"];
|
std::string id = config["id"];
|
||||||
std::string controllerId = _myAddressStr.c_str();
|
std::string controllerId = _myAddressStr.c_str();
|
||||||
std::string key = "networks:{" + controllerId + "}";
|
std::string key = "networks:{" + controllerId + "}";
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
_cluster->srem(key, id);
|
_cluster->srem(key, id);
|
||||||
_cluster->del("network-nodes-online:{" + controllerId + "}:" + id);
|
_cluster->del("network-nodes-online:{" + controllerId + "}:" + id);
|
||||||
}
|
}
|
||||||
|
@ -1392,7 +1392,7 @@ void CentralDB::commitThread()
|
||||||
std::string networkId = config["nwid"];
|
std::string networkId = config["nwid"];
|
||||||
std::string controllerId = _myAddressStr.c_str();
|
std::string controllerId = _myAddressStr.c_str();
|
||||||
std::string key = "network-nodes-all:{" + controllerId + "}:" + networkId;
|
std::string key = "network-nodes-all:{" + controllerId + "}:" + networkId;
|
||||||
if (_rc->clusterMode) {
|
if (_cc->redisConfig->clusterMode) {
|
||||||
_cluster->srem(key, memberId);
|
_cluster->srem(key, memberId);
|
||||||
_cluster->del("member:{" + controllerId + "}:" + networkId + ":" + memberId);
|
_cluster->del("member:{" + controllerId + "}:" + networkId + ":" + memberId);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,19 +21,8 @@ struct SmeeClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ZeroTier {
|
namespace ZeroTier {
|
||||||
|
|
||||||
struct RedisConfig;
|
struct RedisConfig;
|
||||||
struct PubSubConfig;
|
struct ControllerConfig;
|
||||||
struct PostgresNotifyConfig;
|
|
||||||
struct BigTableConfig;
|
|
||||||
|
|
||||||
struct ControllerConfig {
|
|
||||||
bool ssoEnabled;
|
|
||||||
RedisConfig* redisConfig;
|
|
||||||
PubSubConfig* pubSubConfig;
|
|
||||||
PostgresNotifyConfig* postgresNotifyConfig;
|
|
||||||
BigTableConfig* bigTableConfig;
|
|
||||||
};
|
|
||||||
|
|
||||||
class CentralDB : public DB {
|
class CentralDB : public DB {
|
||||||
public:
|
public:
|
||||||
|
@ -51,11 +40,11 @@ class CentralDB : public DB {
|
||||||
|
|
||||||
CentralDB(
|
CentralDB(
|
||||||
const Identity& myId,
|
const Identity& myId,
|
||||||
const char* path,
|
const char* connString,
|
||||||
int listenPort,
|
int listenPort,
|
||||||
CentralDB::ListenerMode mode,
|
CentralDB::ListenerMode mode,
|
||||||
CentralDB::StatusWriterMode statusMode,
|
CentralDB::StatusWriterMode statusMode,
|
||||||
ControllerConfig* cc);
|
const ControllerConfig* cc);
|
||||||
virtual ~CentralDB();
|
virtual ~CentralDB();
|
||||||
|
|
||||||
virtual bool waitForReady();
|
virtual bool waitForReady();
|
||||||
|
@ -109,7 +98,7 @@ class CentralDB : public DB {
|
||||||
|
|
||||||
ListenerMode _listenerMode;
|
ListenerMode _listenerMode;
|
||||||
StatusWriterMode _statusWriterMode;
|
StatusWriterMode _statusWriterMode;
|
||||||
ControllerConfig* _controllerConfig;
|
const ControllerConfig* _cc;
|
||||||
std::shared_ptr<ConnectionPool<PostgresConnection> > _pool;
|
std::shared_ptr<ConnectionPool<PostgresConnection> > _pool;
|
||||||
|
|
||||||
const Identity _myId;
|
const Identity _myId;
|
||||||
|
@ -136,7 +125,6 @@ class CentralDB : public DB {
|
||||||
int _listenPort;
|
int _listenPort;
|
||||||
uint8_t _ssoPsk[48];
|
uint8_t _ssoPsk[48];
|
||||||
|
|
||||||
RedisConfig* _rc;
|
|
||||||
std::shared_ptr<sw::redis::Redis> _redis;
|
std::shared_ptr<sw::redis::Redis> _redis;
|
||||||
std::shared_ptr<sw::redis::RedisCluster> _cluster;
|
std::shared_ptr<sw::redis::RedisCluster> _cluster;
|
||||||
bool _redisMemberStatus;
|
bool _redisMemberStatus;
|
||||||
|
|
66
nonfree/controller/ControllerConfig.hpp
Normal file
66
nonfree/controller/ControllerConfig.hpp
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
#ifndef CONTROLLER_CONFIG_HPP
|
||||||
|
#define CONTROLLER_CONFIG_HPP
|
||||||
|
|
||||||
|
#include "Redis.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace ZeroTier {
|
||||||
|
|
||||||
|
struct PubSubConfig {
|
||||||
|
std::string project;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PostgresNotifyConfig {
|
||||||
|
std::string channel;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct BigTableConfig {
|
||||||
|
std::string project_id;
|
||||||
|
std::string instance_id;
|
||||||
|
std::string table_id;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ControllerConfig {
|
||||||
|
bool ssoEnabled;
|
||||||
|
std::string listenMode;
|
||||||
|
std::string statusMode;
|
||||||
|
RedisConfig* redisConfig;
|
||||||
|
PubSubConfig* pubSubConfig;
|
||||||
|
PostgresNotifyConfig* postgresNotifyConfig;
|
||||||
|
BigTableConfig* bigTableConfig;
|
||||||
|
|
||||||
|
ControllerConfig()
|
||||||
|
: ssoEnabled(false)
|
||||||
|
, listenMode("")
|
||||||
|
, statusMode("")
|
||||||
|
, redisConfig(nullptr)
|
||||||
|
, pubSubConfig(nullptr)
|
||||||
|
, postgresNotifyConfig(nullptr)
|
||||||
|
, bigTableConfig(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~ControllerConfig()
|
||||||
|
{
|
||||||
|
if (redisConfig) {
|
||||||
|
delete redisConfig;
|
||||||
|
redisConfig = nullptr;
|
||||||
|
}
|
||||||
|
if (pubSubConfig) {
|
||||||
|
delete pubSubConfig;
|
||||||
|
pubSubConfig = nullptr;
|
||||||
|
}
|
||||||
|
if (postgresNotifyConfig) {
|
||||||
|
delete postgresNotifyConfig;
|
||||||
|
postgresNotifyConfig = nullptr;
|
||||||
|
}
|
||||||
|
if (bigTableConfig) {
|
||||||
|
delete bigTableConfig;
|
||||||
|
bigTableConfig = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace ZeroTier
|
||||||
|
#endif // CONTROLLER_CONFIG_HPP
|
|
@ -26,6 +26,10 @@
|
||||||
#ifdef ZT_CONTROLLER_USE_LIBPQ
|
#ifdef ZT_CONTROLLER_USE_LIBPQ
|
||||||
#include "CV1.hpp"
|
#include "CV1.hpp"
|
||||||
#include "CV2.hpp"
|
#include "CV2.hpp"
|
||||||
|
#include "CentralDB.hpp"
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
#include "ControllerConfig.hpp"
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "../../node/CertificateOfMembership.hpp"
|
#include "../../node/CertificateOfMembership.hpp"
|
||||||
|
@ -559,6 +563,61 @@ EmbeddedNetworkController::EmbeddedNetworkController(
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
EmbeddedNetworkController::EmbeddedNetworkController(
|
||||||
|
Node* node,
|
||||||
|
const char* ztPath,
|
||||||
|
const char* dbPath,
|
||||||
|
int listenPort,
|
||||||
|
const ControllerConfig* cc)
|
||||||
|
: _startTime(OSUtils::now())
|
||||||
|
, _listenPort(listenPort)
|
||||||
|
, _node(node)
|
||||||
|
, _ztPath(ztPath)
|
||||||
|
, _path(dbPath)
|
||||||
|
, _signingId()
|
||||||
|
, _signingIdAddressString()
|
||||||
|
, _sender((NetworkController::Sender*)0)
|
||||||
|
, _db(this)
|
||||||
|
, _queue()
|
||||||
|
, _threads()
|
||||||
|
, _threads_l()
|
||||||
|
, _memberStatus()
|
||||||
|
, _memberStatus_l()
|
||||||
|
, _expiringSoon()
|
||||||
|
, _expiringSoon_l()
|
||||||
|
, _rc(nullptr)
|
||||||
|
, _cc(cc)
|
||||||
|
, _ssoExpiryRunning(true)
|
||||||
|
, _ssoExpiry(std::thread(&EmbeddedNetworkController::_ssoExpiryThread, this))
|
||||||
|
#ifdef CENTRAL_CONTROLLER_REQUEST_BENCHMARK
|
||||||
|
, _member_status_lookup { "nc_member_status_lookup", "" }
|
||||||
|
, _member_status_lookup_count { "nc_member_status_lookup_count", "" }
|
||||||
|
, _node_is_online { "nc_node_is_online", "" }
|
||||||
|
, _node_is_online_count { "nc_node_is_online_count", "" }
|
||||||
|
, _get_and_init_member { "nc_get_and_init_member", "" }
|
||||||
|
, _get_and_init_member_count { "nc_get_and_init_member_count", "" }
|
||||||
|
, _have_identity { "nc_have_identity", "" }
|
||||||
|
, _have_identity_count { "nc_have_identity_count", "" }
|
||||||
|
, _determine_auth { "nc_determine_auth", "" }
|
||||||
|
, _determine_auth_count { "nc_determine_auth_count", "" }
|
||||||
|
, _sso_check { "nc_sso_check", "" }
|
||||||
|
, _sso_check_count { "nc_sso_check_count", "" }
|
||||||
|
, _auth_check { "nc_auth_check", "" }
|
||||||
|
, _auth_check_count { "nc_auth_check_count", "" }
|
||||||
|
, _json_schlep { "nc_json_schlep", "" }
|
||||||
|
, _json_schlep_count { "nc_json_schlep_count", "" }
|
||||||
|
, _issue_certificate { "nc_issue_certificate", "" }
|
||||||
|
, _issue_certificate_count { "nc_issue_certificate_count", "" }
|
||||||
|
, _save_member { "nc_save_member", "" }
|
||||||
|
, _save_member_count { "nc_save_member_count", "" }
|
||||||
|
, _send_netconf { "nc_send_netconf2", "" }
|
||||||
|
, _send_netconf_count { "nc_send_netconf2_count", "" }
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
EmbeddedNetworkController::~EmbeddedNetworkController()
|
EmbeddedNetworkController::~EmbeddedNetworkController()
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> l(_threads_l);
|
std::lock_guard<std::mutex> l(_threads_l);
|
||||||
|
@ -587,6 +646,47 @@ void EmbeddedNetworkController::init(const Identity& signingId, Sender* sender)
|
||||||
_sender = sender;
|
_sender = sender;
|
||||||
_signingIdAddressString = signingId.address().toString(tmp);
|
_signingIdAddressString = signingId.address().toString(tmp);
|
||||||
|
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
if (! _cc) {
|
||||||
|
throw std::runtime_error("controller config required");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_path.length() > 9 || (_path.substr(0, 9) != "postgres:")) {
|
||||||
|
throw std::runtime_error("central controller requires postgres db");
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* connString = _path.substr(9).c_str();
|
||||||
|
|
||||||
|
CentralDB::ListenerMode lm;
|
||||||
|
if (_cc->listenMode == "pgsql") {
|
||||||
|
lm = CentralDB::LISTENER_MODE_PGSQL;
|
||||||
|
}
|
||||||
|
else if (_cc->listenMode == "redis") {
|
||||||
|
lm = CentralDB::LISTENER_MODE_REDIS;
|
||||||
|
}
|
||||||
|
else if (_cc->listenMode == "pubsub") {
|
||||||
|
lm = CentralDB::LISTENER_MODE_PUBSUB;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw std::runtime_error("unsupported listen mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
CentralDB::StatusWriterMode sm;
|
||||||
|
if (_cc->statusMode == "pgsql") {
|
||||||
|
sm = CentralDB::STATUS_WRITER_MODE_PGSQL;
|
||||||
|
}
|
||||||
|
else if (_cc->statusMode == "redis") {
|
||||||
|
sm = CentralDB::STATUS_WRITER_MODE_REDIS;
|
||||||
|
}
|
||||||
|
else if (_cc->statusMode == "bigtable") {
|
||||||
|
sm = CentralDB::STATUS_WRITER_MODE_BIGTABLE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw std::runtime_error("unsupported status mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
_db.addDB(std::shared_ptr<CentralDB>(new CentralDB(_signingId, connString, _listenPort, lm, sm, _cc)));
|
||||||
|
#else
|
||||||
#ifdef ZT_CONTROLLER_USE_LIBPQ
|
#ifdef ZT_CONTROLLER_USE_LIBPQ
|
||||||
if ((_path.length() > 9) && (_path.substr(0, 9) == "postgres:")) {
|
if ((_path.length() > 9) && (_path.substr(0, 9) == "postgres:")) {
|
||||||
fprintf(stderr, "CV1\n");
|
fprintf(stderr, "CV1\n");
|
||||||
|
@ -603,6 +703,7 @@ void EmbeddedNetworkController::init(const Identity& signingId, Sender* sender)
|
||||||
#ifdef ZT_CONTROLLER_USE_LIBPQ
|
#ifdef ZT_CONTROLLER_USE_LIBPQ
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif // ZT1_CENTRAL_CONTROLLER
|
||||||
|
|
||||||
_db.waitForReady();
|
_db.waitForReady();
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,10 @@ namespace ZeroTier {
|
||||||
class Node;
|
class Node;
|
||||||
struct RedisConfig;
|
struct RedisConfig;
|
||||||
|
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
class ControllerConfig;
|
||||||
|
#endif
|
||||||
|
|
||||||
class EmbeddedNetworkController
|
class EmbeddedNetworkController
|
||||||
: public NetworkController
|
: public NetworkController
|
||||||
, public DB::ChangeListener {
|
, public DB::ChangeListener {
|
||||||
|
@ -39,6 +43,14 @@ class EmbeddedNetworkController
|
||||||
* @param dbPath Database path (file path or database credentials)
|
* @param dbPath Database path (file path or database credentials)
|
||||||
*/
|
*/
|
||||||
EmbeddedNetworkController(Node* node, const char* ztPath, const char* dbPath, int listenPort, RedisConfig* rc);
|
EmbeddedNetworkController(Node* node, const char* ztPath, const char* dbPath, int listenPort, RedisConfig* rc);
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
EmbeddedNetworkController(
|
||||||
|
Node* node,
|
||||||
|
const char* ztPath,
|
||||||
|
const char* dbPath,
|
||||||
|
int listenPort,
|
||||||
|
const ControllerConfig* cc);
|
||||||
|
#endif
|
||||||
virtual ~EmbeddedNetworkController();
|
virtual ~EmbeddedNetworkController();
|
||||||
|
|
||||||
virtual void init(const Identity& signingId, Sender* sender);
|
virtual void init(const Identity& signingId, Sender* sender);
|
||||||
|
@ -146,6 +158,9 @@ class EmbeddedNetworkController
|
||||||
std::mutex _expiringSoon_l;
|
std::mutex _expiringSoon_l;
|
||||||
|
|
||||||
RedisConfig* _rc;
|
RedisConfig* _rc;
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
const ControllerConfig* _cc;
|
||||||
|
#endif
|
||||||
std::string _ssoRedirectURL;
|
std::string _ssoRedirectURL;
|
||||||
|
|
||||||
bool _ssoExpiryRunning;
|
bool _ssoExpiryRunning;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#ifdef ZT_CONTROLLER_USE_LIBPQ
|
#ifdef ZT_CONTROLLER_USE_LIBPQ
|
||||||
#include "PubSubListener.hpp"
|
#include "PubSubListener.hpp"
|
||||||
|
|
||||||
|
#include "ControllerConfig.hpp"
|
||||||
#include "DB.hpp"
|
#include "DB.hpp"
|
||||||
#include "member.pb.h"
|
#include "member.pb.h"
|
||||||
#include "network.pb.h"
|
#include "network.pb.h"
|
||||||
|
|
|
@ -15,13 +15,6 @@
|
||||||
namespace ZeroTier {
|
namespace ZeroTier {
|
||||||
class DB;
|
class DB;
|
||||||
|
|
||||||
struct PubSubConfig {
|
|
||||||
const char* controller_id;
|
|
||||||
std::string project;
|
|
||||||
std::string topic;
|
|
||||||
uint64_t listen_timeout;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for GCP PubSub listeners
|
* Base class for GCP PubSub listeners
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace ZeroTier {
|
||||||
*/
|
*/
|
||||||
class StatusWriter {
|
class StatusWriter {
|
||||||
public:
|
public:
|
||||||
virtual ~StatusWriter() = 0;
|
virtual ~StatusWriter() = default;
|
||||||
|
|
||||||
virtual void updateNodeStatus(
|
virtual void updateNodeStatus(
|
||||||
const std::string& network_id,
|
const std::string& network_id,
|
||||||
|
|
|
@ -35,6 +35,7 @@ if(ZT1_CENTRAL_CONTROLLER)
|
||||||
)
|
)
|
||||||
list(APPEND LINK_LIBS
|
list(APPEND LINK_LIBS
|
||||||
pqxx
|
pqxx
|
||||||
|
redis++::redis++_static
|
||||||
opentelemetry-cpp::sdk
|
opentelemetry-cpp::sdk
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -130,6 +130,10 @@ using json = nlohmann::json;
|
||||||
#include "../nonfree/controller/EmbeddedNetworkController.hpp"
|
#include "../nonfree/controller/EmbeddedNetworkController.hpp"
|
||||||
#include "../nonfree/controller/PostgreSQL.hpp"
|
#include "../nonfree/controller/PostgreSQL.hpp"
|
||||||
#include "../nonfree/controller/Redis.hpp"
|
#include "../nonfree/controller/Redis.hpp"
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
#include "../nonfree/controller/CentralDB.hpp"
|
||||||
|
#include "../nonfree/controller/ControllerConfig.hpp"
|
||||||
|
#endif
|
||||||
#include "../osdep/EthernetTap.hpp"
|
#include "../osdep/EthernetTap.hpp"
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
#include "../osdep/WindowsEthernetTap.hpp"
|
#include "../osdep/WindowsEthernetTap.hpp"
|
||||||
|
@ -1009,6 +1013,10 @@ class OneServiceImpl : public OneService {
|
||||||
double _exporterSampleRate;
|
double _exporterSampleRate;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
ControllerConfig _controllerConfig;
|
||||||
|
#endif
|
||||||
|
|
||||||
// end member variables ----------------------------------------------------
|
// end member variables ----------------------------------------------------
|
||||||
|
|
||||||
OneServiceImpl(const char* hp, unsigned int port)
|
OneServiceImpl(const char* hp, unsigned int port)
|
||||||
|
@ -1055,6 +1063,9 @@ class OneServiceImpl : public OneService {
|
||||||
, _traceProvider(nullptr)
|
, _traceProvider(nullptr)
|
||||||
, _exporterEndpoint()
|
, _exporterEndpoint()
|
||||||
, _exporterSampleRate(1.0)
|
, _exporterSampleRate(1.0)
|
||||||
|
#endif
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
, _controllerConfig()
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
_ports[0] = 0;
|
_ports[0] = 0;
|
||||||
|
@ -1351,10 +1362,15 @@ class OneServiceImpl : public OneService {
|
||||||
// Delete legacy iddb.d if present (cleanup)
|
// Delete legacy iddb.d if present (cleanup)
|
||||||
OSUtils::rmDashRf((_homePath + ZT_PATH_SEPARATOR_S "iddb.d").c_str());
|
OSUtils::rmDashRf((_homePath + ZT_PATH_SEPARATOR_S "iddb.d").c_str());
|
||||||
|
|
||||||
// Network controller is now enabled by default for desktop and server
|
// Network controller is now disabled by default for desktop and server
|
||||||
#ifdef ZT_NONFREE_CONTROLLER
|
#ifdef ZT_NONFREE_CONTROLLER
|
||||||
|
#ifdef ZT1_CENTRAL_CONTROLLER
|
||||||
|
_controller = new EmbeddedNetworkController(
|
||||||
|
_node, _homePath.c_str(), _controllerDbPath.c_str(), _ports[0], &_controllerConfig);
|
||||||
|
#else
|
||||||
_controller =
|
_controller =
|
||||||
new EmbeddedNetworkController(_node, _homePath.c_str(), _controllerDbPath.c_str(), _ports[0], _rc);
|
new EmbeddedNetworkController(_node, _homePath.c_str(), _controllerDbPath.c_str(), _ports[0], _rc);
|
||||||
|
#endif
|
||||||
if (! _ssoRedirectURL.empty()) {
|
if (! _ssoRedirectURL.empty()) {
|
||||||
_controller->setSSORedirectURL(_ssoRedirectURL);
|
_controller->setSSORedirectURL(_ssoRedirectURL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue