Browse Source

Actually report a meaningful network status instead of always OK

Adam Ierymenko 12 years ago
parent
commit
5cabb60a6f
3 changed files with 46 additions and 3 deletions
  1. 20 0
      node/Network.cpp
  2. 22 0
      node/Network.hpp
  3. 4 3
      node/NodeConfig.cpp

+ 20 - 0
node/Network.cpp

@@ -104,6 +104,17 @@ bool Network::Certificate::qualifyMembership(const Network::Certificate &mc) con
 	return true;
 }
 
+const char *Network::statusString(const Status s)
+	throw()
+{
+	switch(s) {
+		case NETWORK_WAITING_FOR_FIRST_AUTOCONF: return "WAITING_FOR_FIRST_AUTOCONF";
+		case NETWORK_OK: return "OK";
+		case NETWORK_ACCESS_DENIED: return "ACCESS_DENIED";
+	}
+	return "(invalid)";
+}
+
 Network::~Network()
 {
 	delete _tap;
@@ -202,6 +213,7 @@ void Network::clean()
 	std::string mcdbPath(_r->homePath + ZT_PATH_SEPARATOR_S + "networks.d" + ZT_PATH_SEPARATOR_S + toString() + ".mcerts");
 
 	Mutex::Lock _l(_lock);
+
 	if (_configuration.isOpen()) {
 		_membershipCertificates.clear();
 		Utils::rm(mcdbPath);
@@ -242,6 +254,14 @@ void Network::clean()
 	}
 }
 
+Network::Status Network::status() const
+{
+	Mutex::Lock _l(_lock);
+	if (_configuration.containsAllFields())
+		return NETWORK_OK;
+	return NETWORK_WAITING_FOR_FIRST_AUTOCONF;
+}
+
 void Network::_CBhandleTapData(void *arg,const MAC &from,const MAC &to,unsigned int etherType,const Buffer<4096> &data)
 {
 	const RuntimeEnvironment *_r = ((Network *)arg)->_r;

+ 22 - 0
node/Network.hpp

@@ -265,6 +265,23 @@ public:
 		}
 	};
 
+	/**
+	 * Status for networks
+	 */
+	enum Status
+	{
+		NETWORK_WAITING_FOR_FIRST_AUTOCONF,
+		NETWORK_OK,
+		NETWORK_ACCESS_DENIED
+	};
+
+	/**
+	 * @param s Status
+	 * @return String description
+	 */
+	static const char *statusString(const Status s)
+		throw();
+
 private:
 	// Only NodeConfig can create, only SharedPtr can delete
 
@@ -404,6 +421,11 @@ public:
 		return _lastConfigUpdate;
 	}
 
+	/**
+	 * @return Status of this network
+	 */
+	Status status() const;
+
 private:
 	static void _CBhandleTapData(void *arg,const MAC &from,const MAC &to,unsigned int etherType,const Buffer<4096> &data);
 	void _restoreState();

+ 4 - 3
node/NodeConfig.cpp

@@ -175,11 +175,12 @@ std::vector<std::string> NodeConfig::execute(const char *command)
 			}
 			// TODO: display network status, such as "permission denied to closed
 			// network" or "waiting".
-			_P("200 listnetworks %.16llx OK %s %s %s",
+			_P("200 listnetworks %.16llx %s %s %s %s",
 				(unsigned long long)nw->first,
-				(nw->second->isOpen() ? "public" : "private"),
+				Network::statusString(nw->second->status()),
+				(nw->second->isOpen() ? "open" : "private"),
 				nw->second->tap().deviceName().c_str(),
-				tmp.c_str());
+				((tmp.length() > 0) ? tmp.c_str() : "-"));
 		}
 	} else if (cmd[0] == "join") {
 		if (cmd.size() > 1) {