summaryrefslogtreecommitdiff
path: root/controller/PostgreSQL.cpp
diff options
context:
space:
mode:
authorGrant Limberg <[email protected]>2021-10-05 17:02:50 -0700
committerGrant Limberg <[email protected]>2021-10-05 17:02:50 -0700
commit4d26b5a8688f38f125409f65d51d935b35aacd6b (patch)
tree05b96ee9ddd329a9a804aea9bf23662b1a6563c0 /controller/PostgreSQL.cpp
parentac0dc7844fb2373497a708b7df9bd69747771d06 (diff)
no reason for this to be a pointer
Diffstat (limited to 'controller/PostgreSQL.cpp')
-rw-r--r--controller/PostgreSQL.cpp118
1 files changed, 62 insertions, 56 deletions
diff --git a/controller/PostgreSQL.cpp b/controller/PostgreSQL.cpp
index 6a7ea219..53d88d6f 100644
--- a/controller/PostgreSQL.cpp
+++ b/controller/PostgreSQL.cpp
@@ -1040,20 +1040,32 @@ void PostgreSQL::commitThread()
}
try {
- nlohmann::json *config = &(qitem.first);
- const std::string objtype = (*config)["objtype"];
+ nlohmann::json &config = (qitem.first);
+ const std::string objtype = config["objtype"];
if (objtype == "member") {
// fprintf(stderr, "%s: commitThread: member\n", _myAddressStr.c_str());
+ std::string memberId;
+ std::string networkId;
try {
pqxx::work w(*c->c);
- std::string memberId = (*config)["id"];
- std::string networkId = (*config)["nwid"];
+ memberId = config["id"];
+ networkId = config["nwid"];
+
std::string target = "NULL";
- if (!(*config)["remoteTraceTarget"].is_null()) {
- target = (*config)["remoteTraceTarget"];
+ if (!config["remoteTraceTarget"].is_null()) {
+ target = config["remoteTraceTarget"];
}
+ pqxx::row nwrow = w.exec_params1("SELECT COUNT(id) FROM ztc_network WHERE id = $1", networkId);
+ int nwcount = nwrow[0].as<int>();
+
+ if (nwcount != 1) {
+ fprintf(stderr, "network %s does not exist. skipping member upsert\n", networkId.c_str());
+ w.abort();
+ _pool->unborrow(c);
+ continue;
+ }
pqxx::result res = w.exec_params0(
"INSERT INTO ztc_member (id, network_id, active_bridge, authorized, capabilities, "
@@ -1070,21 +1082,21 @@ void PostgreSQL::commitThread()
"v_minor = EXCLUDED.v_minor, v_rev = EXCLUDED.v_rev, v_proto = EXCLUDED.v_proto",
memberId,
networkId,
- (bool)(*config)["activeBridge"],
- (bool)(*config)["authorized"],
- OSUtils::jsonDump((*config)["capabilities"], -1),
- OSUtils::jsonString((*config)["identity"], ""),
- (uint64_t)(*config)["lastAuthorizedTime"],
- (uint64_t)(*config)["lastDeauthorizedTime"],
- (bool)(*config)["noAutoAssignIps"],
- (int)(*config)["remoteTraceLevel"],
+ (bool)config["activeBridge"],
+ (bool)config["authorized"],
+ OSUtils::jsonDump(config["capabilities"], -1),
+ OSUtils::jsonString(config["identity"], ""),
+ (uint64_t)config["lastAuthorizedTime"],
+ (uint64_t)config["lastDeauthorizedTime"],
+ (bool)config["noAutoAssignIps"],
+ (int)config["remoteTraceLevel"],
target,
- (uint64_t)(*config)["revision"],
- OSUtils::jsonDump((*config)["tags"], -1),
- (int)(*config)["vMajor"],
- (int)(*config)["vMinor"],
- (int)(*config)["vRev"],
- (int)(*config)["vProto"]);
+ (uint64_t)config["revision"],
+ OSUtils::jsonDump(config["tags"], -1),
+ (int)config["vMajor"],
+ (int)config["vMinor"],
+ (int)config["vRev"],
+ (int)config["vProto"]);
res = w.exec_params0("DELETE FROM ztc_member_ip_assignment WHERE member_id = $1 AND network_id = $2",
@@ -1092,7 +1104,7 @@ void PostgreSQL::commitThread()
std::vector<std::string> assignments;
bool ipAssignError = false;
- for (auto i = (*config)["ipAssignments"].begin(); i != (*config)["ipAssignments"].end(); ++i) {
+ for (auto i = config["ipAssignments"].begin(); i != config["ipAssignments"].end(); ++i) {
std::string addr = *i;
if (std::find(assignments.begin(), assignments.end(), addr) != assignments.end()) {
@@ -1107,8 +1119,6 @@ void PostgreSQL::commitThread()
}
if (ipAssignError) {
fprintf(stderr, "%s: ipAssignError\n", _myAddressStr.c_str());
- delete config;
- config = nullptr;
w.abort();
_pool->unborrow(c);
c.reset();
@@ -1117,13 +1127,13 @@ void PostgreSQL::commitThread()
w.commit();
- const uint64_t nwidInt = OSUtils::jsonIntHex((*config)["nwid"], 0ULL);
- const uint64_t memberidInt = OSUtils::jsonIntHex((*config)["id"], 0ULL);
+ const uint64_t nwidInt = OSUtils::jsonIntHex(config["nwid"], 0ULL);
+ const uint64_t memberidInt = OSUtils::jsonIntHex(config["id"], 0ULL);
if (nwidInt && memberidInt) {
nlohmann::json nwOrig;
nlohmann::json memOrig;
- nlohmann::json memNew(*config);
+ nlohmann::json memNew(config);
get(nwidInt, nwOrig, memberidInt, memOrig);
@@ -1131,23 +1141,22 @@ void PostgreSQL::commitThread()
} else {
fprintf(stderr, "%s: Can't notify of change. Error parsing nwid or memberid: %llu-%llu\n", _myAddressStr.c_str(), (unsigned long long)nwidInt, (unsigned long long)memberidInt);
}
-
} catch (std::exception &e) {
- fprintf(stderr, "%s ERROR: Error updating member: %s\n", _myAddressStr.c_str(), e.what());
+ fprintf(stderr, "%s ERROR: Error updating member %s-%s: %s\n", _myAddressStr.c_str(), networkId.c_str(), memberId.c_str(), e.what());
}
} else if (objtype == "network") {
try {
// fprintf(stderr, "%s: commitThread: network\n", _myAddressStr.c_str());
pqxx::work w(*c->c);
- std::string id = (*config)["id"];
+ std::string id = config["id"];
std::string remoteTraceTarget = "";
- if(!(*config)["remoteTraceTarget"].is_null()) {
- remoteTraceTarget = (*config)["remoteTraceTarget"];
+ if(!config["remoteTraceTarget"].is_null()) {
+ remoteTraceTarget = config["remoteTraceTarget"];
}
std::string rulesSource = "";
- if ((*config)["rulesSource"].is_string()) {
- rulesSource = (*config)["rulesSource"];
+ if (config["rulesSource"].is_string()) {
+ rulesSource = config["rulesSource"];
}
// This ugly query exists because when we want to mirror networks to/from
@@ -1176,25 +1185,25 @@ void PostgreSQL::commitThread()
"sso_enabled = EXCLUDED.sso_enabled",
id,
_myAddressStr,
- OSUtils::jsonDump((*config)["capabilitles"], -1),
- (bool)(*config)["enableBroadcast"],
+ OSUtils::jsonDump(config["capabilitles"], -1),
+ (bool)config["enableBroadcast"],
OSUtils::now(),
- (int)(*config)["mtu"],
- (int)(*config)["multicastLimit"],
- OSUtils::jsonString((*config)["name"],""),
- (bool)(*config)["private"],
- (int)(*config)["remoteTraceLevel"],
+ (int)config["mtu"],
+ (int)config["multicastLimit"],
+ OSUtils::jsonString(config["name"],""),
+ (bool)config["private"],
+ (int)config["remoteTraceLevel"],
remoteTraceTarget,
- OSUtils::jsonDump((*config)["rules"], -1),
+ OSUtils::jsonDump(config["rules"], -1),
rulesSource,
- OSUtils::jsonDump((*config)["tags"], -1),
- OSUtils::jsonDump((*config)["v4AssignMode"],-1),
- OSUtils::jsonDump((*config)["v6AssignMode"], -1),
- OSUtils::jsonBool((*config)["ssoEnabled"], false));
+ OSUtils::jsonDump(config["tags"], -1),
+ OSUtils::jsonDump(config["v4AssignMode"],-1),
+ OSUtils::jsonDump(config["v6AssignMode"], -1),
+ OSUtils::jsonBool(config["ssoEnabled"], false));
res = w.exec_params0("DELETE FROM ztc_network_assignment_pool WHERE network_id = $1", 0);
- auto pool = (*config)["ipAssignmentPools"];
+ auto pool = config["ipAssignmentPools"];
bool err = false;
for (auto i = pool.begin(); i != pool.end(); ++i) {
std::string start = (*i)["ipRangeStart"];
@@ -1207,7 +1216,7 @@ void PostgreSQL::commitThread()
res = w.exec_params0("DELETE FROM ztc_network_route WHERE network_id = $1", id);
- auto routes = (*config)["routes"];
+ auto routes = config["routes"];
err = false;
for (auto i = routes.begin(); i != routes.end(); ++i) {
std::string t = (*i)["target"];
@@ -1234,12 +1243,10 @@ void PostgreSQL::commitThread()
fprintf(stderr, "%s: route add error\n", _myAddressStr.c_str());
w.abort();
_pool->unborrow(c);
- delete config;
- config = nullptr;
continue;
}
- auto dns = (*config)["dns"];
+ auto dns = config["dns"];
std::string domain = dns["domain"];
std::stringstream servers;
servers << "{";
@@ -1258,10 +1265,10 @@ void PostgreSQL::commitThread()
w.commit();
- const uint64_t nwidInt = OSUtils::jsonIntHex((*config)["nwid"], 0ULL);
+ const uint64_t nwidInt = OSUtils::jsonIntHex(config["nwid"], 0ULL);
if (nwidInt) {
nlohmann::json nwOrig;
- nlohmann::json nwNew(*config);
+ nlohmann::json nwNew(config);
get(nwidInt, nwOrig);
@@ -1269,7 +1276,6 @@ void PostgreSQL::commitThread()
} else {
fprintf(stderr, "%s: Can't notify network changed: %llu\n", _myAddressStr.c_str(), (unsigned long long)nwidInt);
}
-
} catch (std::exception &e) {
fprintf(stderr, "%s ERROR: Error updating network: %s\n", _myAddressStr.c_str(), e.what());
}
@@ -1278,7 +1284,7 @@ void PostgreSQL::commitThread()
try {
pqxx::work w(*c->c);
- std::string networkId = (*config)["nwid"];
+ std::string networkId = config["nwid"];
pqxx::result res = w.exec_params0("UPDATE ztc_network SET deleted = true WHERE id = $1",
networkId);
@@ -1293,8 +1299,8 @@ void PostgreSQL::commitThread()
try {
pqxx::work w(*c->c);
- std::string memberId = (*config)["id"];
- std::string networkId = (*config)["nwid"];
+ std::string memberId = config["id"];
+ std::string networkId = config["nwid"];
pqxx::result res = w.exec_params0(
"UPDATE ztc_member SET hidden = true, deleted = true WHERE id = $1 AND network_id = $2",