Ver código fonte

throwing stuff at the wall cuz I can't actually debug this right now

Grant Limberg 3 semanas atrás
pai
commit
fb75369597
1 arquivos alterados com 67 adições e 44 exclusões
  1. 67 44
      nonfree/controller/PubSubWriter.cpp

+ 67 - 44
nonfree/controller/PubSubWriter.cpp

@@ -17,9 +17,9 @@ namespace pubsub = ::google::cloud::pubsub;
 
 namespace ZeroTier {
 
-pbmessages::NetworkChange
+pbmessages::NetworkChange*
 networkChangeFromJson(std::string controllerID, const nlohmann::json& oldNetwork, const nlohmann::json& newNetwork);
-pbmessages::MemberChange
+pbmessages::MemberChange*
 memberChangeFromJson(std::string controllerID, const nlohmann::json& oldMember, const nlohmann::json& newMember);
 
 PubSubWriter::PubSubWriter(std::string project, std::string topic, std::string controller_id)
@@ -53,6 +53,7 @@ PubSubWriter::~PubSubWriter()
 
 bool PubSubWriter::publishMessage(const std::string& payload, const std::string& frontend)
 {
+	fprintf(stderr, "Publishing message to %s\n", _topic.c_str());
 	std::vector<std::pair<std::string, std::string> > attributes;
 	attributes.emplace_back("controller_id", _controller_id);
 
@@ -76,13 +77,15 @@ bool PubSubWriter::publishNetworkChange(
 	const nlohmann::json& newNetwork,
 	const std::string& frontend)
 {
-	pbmessages::NetworkChange nc = networkChangeFromJson(_controller_id, oldNetwork, newNetwork);
+	fprintf(stderr, "Publishing network change\n");
+	pbmessages::NetworkChange* nc = networkChangeFromJson(_controller_id, oldNetwork, newNetwork);
 	std::string payload;
-	if (! nc.SerializeToString(&payload)) {
+	if (! nc->SerializeToString(&payload)) {
 		fprintf(stderr, "Failed to serialize NetworkChange protobuf message\n");
+		delete nc;
 		return false;
 	}
-
+	delete nc;
 	return publishMessage(payload, frontend);
 }
 
@@ -91,13 +94,16 @@ bool PubSubWriter::publishMemberChange(
 	const nlohmann::json& newMember,
 	const std::string& frontend)
 {
-	pbmessages::MemberChange mc = memberChangeFromJson(_controller_id, oldMember, newMember);
+	fprintf(stderr, "Publishing member change\n");
+	pbmessages::MemberChange* mc = memberChangeFromJson(_controller_id, oldMember, newMember);
 	std::string payload;
-	if (! mc.SerializeToString(&payload)) {
+	if (! mc->SerializeToString(&payload)) {
 		fprintf(stderr, "Failed to serialize MemberChange protobuf message\n");
+		delete mc;
 		return false;
 	}
 
+	delete mc;
 	return publishMessage(payload, frontend);
 }
 
@@ -224,18 +230,19 @@ pbmessages::NetworkChange_Network* networkFromJson(const nlohmann::json& j)
 	return n;
 }
 
-pbmessages::NetworkChange
+pbmessages::NetworkChange*
 networkChangeFromJson(std::string controllerID, const nlohmann::json& oldNetwork, const nlohmann::json& newNetwork)
 {
-	pbmessages::NetworkChange nc;
-	nc.set_allocated_old(networkFromJson(oldNetwork));
-	nc.set_allocated_new_(networkFromJson(newNetwork));
-	nc.set_change_source(pbmessages::NetworkChange_ChangeSource::NetworkChange_ChangeSource_CONTROLLER);
+	pbmessages::NetworkChange* nc = new pbmessages::NetworkChange();
+
+	nc->set_allocated_old(networkFromJson(oldNetwork));
+	nc->set_allocated_new_(networkFromJson(newNetwork));
+	nc->set_change_source(pbmessages::NetworkChange_ChangeSource::NetworkChange_ChangeSource_CONTROLLER);
 
 	pbmessages::NetworkChange_NetworkChangeMetadata* metadata = new pbmessages::NetworkChange_NetworkChangeMetadata();
 	metadata->set_controller_id(controllerID);
 	metadata->set_trace_id("");	  // TODO: generate a trace ID
-	nc.set_allocated_metadata(metadata);
+	nc->set_allocated_metadata(metadata);
 
 	return nc;
 }
@@ -243,6 +250,7 @@ networkChangeFromJson(std::string controllerID, const nlohmann::json& oldNetwork
 pbmessages::MemberChange_Member* memberFromJson(const nlohmann::json& j)
 {
 	if (! j.is_object()) {
+		fprintf(stderr, "memberFromJson: JSON is not an object\n");
 		return nullptr;
 	}
 
@@ -254,33 +262,40 @@ pbmessages::MemberChange_Member* memberFromJson(const nlohmann::json& j)
 		m->set_device_id(j.value("id", ""));
 		m->set_identity(j.value("identity", ""));
 		m->set_authorized(j.value("authorized", false));
-		for (const auto& addr : j.value("ipAssignments", nlohmann::json::array())) {
-			if (addr.is_string()) {
-				auto a = m->add_ip_assignments();
-				*a = addr;
+		if (j["ipAssignments"].is_array()) {
+			fprintf(stderr, "memberFromJSON: has ipAssignments\n");
+			for (const auto& addr : j["ipAssignments"]) {
+				if (addr.is_string()) {
+					auto a = m->add_ip_assignments();
+					std::string address = addr.get<std::string>();
+					*a = address;
+				}
 			}
 		}
+		else {
+			fprintf(stderr, "memberFromJSON: no ipAssignments\n");
+		}
 		m->set_active_bridge(j.value("activeBridge", false));
-		// if (j["tags"].is_array()) {
-		// 	nlohmann::json tags = j["tags"];
-		// 	std::string tagsStr = OSUtils::jsonDump(tags, -1);
-		// 	m->set_tags(tagsStr);
-		// }
-		// else {
-		// 	nlohmann::json tags = nlohmann::json::array();
-		// 	std::string tagsStr = OSUtils::jsonDump(tags, -1);
-		// 	m->set_tags(tagsStr);
-		// }
-		// if (j["capabilities"].is_array()) {
-		// 	nlohmann::json caps = j["capabilities"];
-		// 	std::string capsStr = OSUtils::jsonDump(caps, -1);
-		// 	m->set_capabilities(capsStr);
-		// }
-		// else {
-		// 	nlohmann::json caps = nlohmann::json::array();
-		// 	std::string capsStr = OSUtils::jsonDump(caps, -1);
-		// 	m->set_capabilities(capsStr);
-		// }
+		if (j["tags"].is_array()) {
+			nlohmann::json tags = j["tags"];
+			std::string tagsStr = OSUtils::jsonDump(tags, -1);
+			m->set_tags(tagsStr);
+		}
+		else {
+			nlohmann::json tags = nlohmann::json::array();
+			std::string tagsStr = OSUtils::jsonDump(tags, -1);
+			m->set_tags(tagsStr);
+		}
+		if (j["capabilities"].is_array()) {
+			nlohmann::json caps = j["capabilities"];
+			std::string capsStr = OSUtils::jsonDump(caps, -1);
+			m->set_capabilities(capsStr);
+		}
+		else {
+			nlohmann::json caps = nlohmann::json::array();
+			std::string capsStr = OSUtils::jsonDump(caps, -1);
+			m->set_capabilities(capsStr);
+		}
 		m->set_creation_time(j.value("creationTime", 0));
 		m->set_no_auto_assign_ips(j.value("noAutoAssignIps", false));
 		m->set_revision(j.value("revision", 0));
@@ -302,22 +317,30 @@ pbmessages::MemberChange_Member* memberFromJson(const nlohmann::json& j)
 		delete m;
 		return nullptr;
 	}
-
+	fprintf(stderr, "memberFromJSON complete\n");
 	return m;
 }
 
-pbmessages::MemberChange
+pbmessages::MemberChange*
 memberChangeFromJson(std::string controllerID, const nlohmann::json& oldMember, const nlohmann::json& newMember)
 {
-	pbmessages::MemberChange mc;
-	mc.set_allocated_old(memberFromJson(oldMember));
-	mc.set_allocated_new_(memberFromJson(newMember));
-	mc.set_change_source(pbmessages::MemberChange_ChangeSource::MemberChange_ChangeSource_CONTROLLER);
+	fprintf(stderr, "memberrChangeFromJson: old: %s\n", oldMember.dump().c_str());
+	fprintf(stderr, "memberrChangeFromJson: new: %s\n", newMember.dump().c_str());
+	pbmessages::MemberChange* mc = new pbmessages::MemberChange();
+	pbmessages::MemberChange_Member* om = memberFromJson(oldMember);
+	if (om != nullptr) {
+		mc->set_allocated_old(om);
+	}
+	pbmessages::MemberChange_Member* nm = memberFromJson(newMember);
+	if (nm != nullptr) {
+		mc->set_allocated_new_(nm);
+	}
+	mc->set_change_source(pbmessages::MemberChange_ChangeSource::MemberChange_ChangeSource_CONTROLLER);
 
 	pbmessages::MemberChange_MemberChangeMetadata* metadata = new pbmessages::MemberChange_MemberChangeMetadata();
 	metadata->set_controller_id(controllerID);
 	metadata->set_trace_id("");	  // TODO: generate a trace ID
-	mc.set_allocated_metadata(metadata);
+	mc->set_allocated_metadata(metadata);
 
 	return mc;
 }