wire up configuration.

New config block in local.conf for controllers:

```
{
  "settings": {
    ...standard zt1 local.conf settings...
  },
  "controller": {
    "listenMode": (pgsql|redis|pubsub),
    "statusMode": (pgsql|redis|bigtable),
    "redis": {
      "hostname": ...,
      "port": 6379,
      "clusterMode": true
    },
    "pubsub": {
      "project_id": <gcp-project-id>
    },
    "bigtable": {
      "project_id": <gcp-project-id>,
      "instance_id": <bigtable-instance-id>,
      "table_id": <bigtable-table-id>
    }
  }
}
```
This commit is contained in:
Grant Limberg 2025-09-02 14:04:00 -07:00
parent a5bd262b3a
commit 0753556aa3
3 changed files with 57 additions and 13 deletions

View file

@ -184,9 +184,9 @@ CentralDB::CentralDB(
case LISTENER_MODE_PUBSUB:
if (cc->pubSubConfig != NULL) {
_membersDbWatcher =
std::make_shared<PubSubMemberListener>(_myAddressStr, cc->pubSubConfig->project, this);
std::make_shared<PubSubMemberListener>(_myAddressStr, cc->pubSubConfig->project_id, this);
_networksDbWatcher =
std::make_shared<PubSubNetworkListener>(_myAddressStr, cc->pubSubConfig->project, this);
std::make_shared<PubSubNetworkListener>(_myAddressStr, cc->pubSubConfig->project_id, this);
}
else {
throw std::runtime_error(

View file

@ -8,11 +8,7 @@
namespace ZeroTier {
struct PubSubConfig {
std::string project;
};
struct PostgresNotifyConfig {
std::string channel;
std::string project_id;
};
struct BigTableConfig {
@ -27,7 +23,6 @@ struct ControllerConfig {
std::string statusMode;
RedisConfig* redisConfig;
PubSubConfig* pubSubConfig;
PostgresNotifyConfig* postgresNotifyConfig;
BigTableConfig* bigTableConfig;
ControllerConfig()
@ -36,7 +31,6 @@ struct ControllerConfig {
, statusMode("")
, redisConfig(nullptr)
, pubSubConfig(nullptr)
, postgresNotifyConfig(nullptr)
, bigTableConfig(nullptr)
{
}
@ -51,10 +45,6 @@ struct ControllerConfig {
delete pubSubConfig;
pubSubConfig = nullptr;
}
if (postgresNotifyConfig) {
delete postgresNotifyConfig;
postgresNotifyConfig = nullptr;
}
if (bigTableConfig) {
delete bigTableConfig;
bigTableConfig = nullptr;

View file

@ -1790,6 +1790,60 @@ class OneServiceImpl : public OneService {
_node->setPhysicalPathConfiguration(
reinterpret_cast<const struct sockaddr_storage*>(&(i->first)), &(i->second));
}
#ifdef ZT1_CENTRAL_CONTROLLER
// Central Controller Mode Settings
json& cc = lc["controller"];
if (cc.is_object()) {
_controllerConfig.listenMode = OSUtils::jsonString(cc["listenMode"], "pgsql");
_controllerConfig.statusMode = OSUtils::jsonString(cc["statusMode"], "pgsql");
// redis settings
if (cc["redis"].is_object() && _rc == NULL) {
json& redis = cc["redis"];
_rc = new RedisConfig;
_rc->hostname = OSUtils::jsonString(redis["hostname"], "");
_rc->port = OSUtils::jsonInt(redis["port"], 6379);
_rc->password = OSUtils::jsonString(redis["password"], "");
_rc->clusterMode = OSUtils::jsonBool(redis["clusterMode"], false);
_controllerConfig.redisConfig = _rc;
}
else if (cc["redis"].is_object() && _rc != NULL) {
_controllerConfig.redisConfig = _rc;
}
if ((_controllerConfig.listenMode == "redis" || _controllerConfig.statusMode == "redis")
&& ! _controllerConfig.redisConfig) {
fprintf(
stderr,
"ERROR: redis listenMode or statusMode requires redis configuration in local.conf" ZT_EOL_S);
exit(1);
}
// pubsub settings
if (cc["pubsub"].is_object()) {
json& ps = cc["pubsub"];
_controllerConfig.pubSubConfig = new PubSubConfig();
_controllerConfig.pubSubConfig->project_id = OSUtils::jsonString(ps["project_id"], "");
}
if (_controllerConfig.listenMode == "pubsub" && ! _controllerConfig.pubSubConfig) {
fprintf(stderr, "ERROR: pubsub listenMode requires pubsub configuration in local.conf" ZT_EOL_S);
exit(1);
}
// bigtable settings
if (cc["bigtable"].is_object()) {
json& bt = cc["bigtable"];
_controllerConfig.bigTableConfig = new BigTableConfig();
_controllerConfig.bigTableConfig->project_id = OSUtils::jsonString(bt["project_id"], "");
_controllerConfig.bigTableConfig->instance_id = OSUtils::jsonString(bt["instance_id"], "");
_controllerConfig.bigTableConfig->table_id = OSUtils::jsonString(bt["table_id"], "");
}
if (_controllerConfig.listenMode == "bigtable" && ! _controllerConfig.bigTableConfig) {
fprintf(stderr, "ERROR: bigtable listenMode requires bigtable configuration in local.conf" ZT_EOL_S);
exit(1);
}
}
#endif
}
virtual ReasonForTermination reasonForTermination() const