|
|
|
|
@ -701,7 +701,187 @@ void PostgreSQL::commitThread()
|
|
|
|
|
|
|
|
|
|
PQclear(res); |
|
|
|
|
} else if (objtype == "network") { |
|
|
|
|
std::string id = (*config)["id"]; |
|
|
|
|
std::string controllerId = _myAddressStr.c_str(); |
|
|
|
|
std::string name = (*config)["name"]; |
|
|
|
|
std::string remoteTraceTarget("NULL"); |
|
|
|
|
if (!(*config)["remoteTraceTarget"].is_null()) { |
|
|
|
|
remoteTraceTarget = (*config)["remoteTraceTarget"]; |
|
|
|
|
} |
|
|
|
|
std::string rulesSource = (*config)["rulesSource"]; |
|
|
|
|
const char *values[16] = { |
|
|
|
|
id.c_str(), |
|
|
|
|
controllerId.c_str(), |
|
|
|
|
OSUtils::jsonDump((*config)["capabilitles"], -1).c_str(), |
|
|
|
|
((*config)["enableBroadcast"] ? "true" : "false"), |
|
|
|
|
std::to_string(OSUtils::now()).c_str(), |
|
|
|
|
std::to_string((int)(*config)["mtu"]).c_str(), |
|
|
|
|
std::to_string((int)(*config)["multicastLimit"]).c_str(), |
|
|
|
|
name.c_str(), |
|
|
|
|
((*config)["private"] ? "true" : "false"), |
|
|
|
|
std::to_string((int)(*config)["remoteTraceLevel"]).c_str(), |
|
|
|
|
(remoteTraceTarget == "NULL" ? NULL : remoteTraceTarget.c_str()), |
|
|
|
|
OSUtils::jsonDump((*config)["rules"], -1).c_str(), |
|
|
|
|
rulesSource.c_str(), |
|
|
|
|
OSUtils::jsonDump((*config)["tags"], -1).c_str(), |
|
|
|
|
OSUtils::jsonDump((*config)["v4AssignMode"],-1).c_str(), |
|
|
|
|
OSUtils::jsonDump((*config)["v6AssignMode"], -1).c_str(), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
PGresult *res = PQexecParams(conn, |
|
|
|
|
"UPDATE ztc_network SET controller_id = $2, capabilities = $3, enable_broadcast = $4, " |
|
|
|
|
"last_updated = $5, mtu = $6, multicast_limit = $7, name = $8, private = $9, " |
|
|
|
|
"remote_trace_level = $10, remote_trace_target = $11, rules = $12, rules_source = $13, " |
|
|
|
|
"tags = $14, v4_assign_mode = $15, v6_assign_mode = $16 " |
|
|
|
|
"WHERE id = $1", |
|
|
|
|
16, |
|
|
|
|
NULL, |
|
|
|
|
values, |
|
|
|
|
NULL, |
|
|
|
|
NULL, |
|
|
|
|
0); |
|
|
|
|
|
|
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
|
fprintf(stderr, "ERROR: Error updating network record: %s\n", PQresultErrorMessage(res)); |
|
|
|
|
PQclear(res); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
|
res = PQexec(conn, "BEGIN"); |
|
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
|
fprintf(stderr, "ERROR: Error beginnning transaction: %s\n", PQresultErrorMessage(res)); |
|
|
|
|
PQclear(res); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
|
const char *params[1] = { |
|
|
|
|
id.c_str() |
|
|
|
|
}; |
|
|
|
|
res = PQexecParams(conn,
|
|
|
|
|
"DELETE FROM ztc_network_assignment_pool WHERE network_id = $1", |
|
|
|
|
1, |
|
|
|
|
NULL, |
|
|
|
|
params, |
|
|
|
|
NULL, |
|
|
|
|
NULL, |
|
|
|
|
0); |
|
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
|
fprintf(stderr, "ERROR: Error updating assignment pool: %s\n", PQresultErrorMessage(res)); |
|
|
|
|
PQclear(res); |
|
|
|
|
PQclear(PQexec(conn, "ROLLBACK")); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PQclear(res); |
|
|
|
|
|
|
|
|
|
auto pool = (*config)["ipAssignmentPools"]; |
|
|
|
|
bool err = false; |
|
|
|
|
for (auto i = pool.begin(); i != pool.end(); ++i) { |
|
|
|
|
std::string start = (*i)["ipRangeStart"]; |
|
|
|
|
std::string end = (*i)["ipRangeEnd"]; |
|
|
|
|
const char *p[3] = { |
|
|
|
|
id.c_str(), |
|
|
|
|
start.c_str(), |
|
|
|
|
end.c_str() |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
res = PQexecParams(conn, |
|
|
|
|
"INSERT INTO ztc_network_assignment_pool (network_id, ip_range_start, ip_range_end) " |
|
|
|
|
"VALUES ($1, $2, $3)", |
|
|
|
|
3, |
|
|
|
|
NULL, |
|
|
|
|
p, |
|
|
|
|
NULL, |
|
|
|
|
NULL, |
|
|
|
|
0); |
|
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
|
fprintf(stderr, "ERROR: Error updating assignment pool: %s\n", PQresultErrorMessage(res)); |
|
|
|
|
PQclear(res); |
|
|
|
|
err = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
PQclear(res); |
|
|
|
|
} |
|
|
|
|
if (err) { |
|
|
|
|
PQclear(PQexec(conn, "ROLLBACK")); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
res = PQexecParams(conn,
|
|
|
|
|
"DELETE FROM ztc_network_route WHERE network_id = $1", |
|
|
|
|
1, |
|
|
|
|
NULL, |
|
|
|
|
params, |
|
|
|
|
NULL, |
|
|
|
|
NULL, |
|
|
|
|
0); |
|
|
|
|
|
|
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
|
fprintf(stderr, "ERROR: Error updating routes: %s\n", PQresultErrorMessage(res)); |
|
|
|
|
PQclear(res); |
|
|
|
|
PQclear(PQexec(conn, "ROLLBACK")); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto routes = (*config)["routes"]; |
|
|
|
|
err = false; |
|
|
|
|
for (auto i = routes.begin(); i != routes.end(); ++i) { |
|
|
|
|
std::string t = (*i)["target"]; |
|
|
|
|
std::vector<std::string> target; |
|
|
|
|
std::istringstream f(t); |
|
|
|
|
std::string s; |
|
|
|
|
while(std::getline(f, s, '/')) { |
|
|
|
|
target.push_back(s); |
|
|
|
|
} |
|
|
|
|
if (target.empty() || target.size() != 2) { |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
std::string targetAddr = target[0]; |
|
|
|
|
std::string targetBits = target[1]; |
|
|
|
|
std::string via = "NULL"; |
|
|
|
|
if (!(*i)["via"].is_null()) { |
|
|
|
|
via = (*i)["via"]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const char *p[4] = { |
|
|
|
|
id.c_str(), |
|
|
|
|
targetAddr.c_str(), |
|
|
|
|
targetBits.c_str(), |
|
|
|
|
(via == "NULL" ? NULL : via.c_str()), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
res = PQexecParams(conn, |
|
|
|
|
"INSERT INTO ztc_network_route (network_id, address, bits, via) VALUES ($1, $2, $3, $4)", |
|
|
|
|
4, |
|
|
|
|
NULL, |
|
|
|
|
p, |
|
|
|
|
NULL, |
|
|
|
|
NULL, |
|
|
|
|
0); |
|
|
|
|
|
|
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
|
fprintf(stderr, "ERROR: Error updating routes: %s\n", PQresultErrorMessage(res)); |
|
|
|
|
PQclear(res); |
|
|
|
|
err = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
PQclear(res); |
|
|
|
|
} |
|
|
|
|
if (err) { |
|
|
|
|
PQclear(PQexec(conn, "ROLLBAcK")); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
res = PQexec(conn, "COMMIT"); |
|
|
|
|
if (PQresultStatus(res) != PGRES_COMMAND_OK) { |
|
|
|
|
fprintf(stderr, "ERROR: Error committing network update: %s\n", PQresultErrorMessage(res)); |
|
|
|
|
} |
|
|
|
|
PQclear(res); |
|
|
|
|
} else if (objtype == "trace") { |
|
|
|
|
fprintf(stderr, "ERROR: Trace not yet implemented"); |
|
|
|
|
} else if (objtype == "_delete_network") { |
|
|
|
|
@ -747,6 +927,8 @@ void PostgreSQL::commitThread()
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
PQclear(res); |
|
|
|
|
} else { |
|
|
|
|
fprintf(stderr, "ERROR: unknown objtype"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
delete config; |
|
|
|
|
|