summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2015-05-17 15:51:07 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2015-05-17 15:51:07 -0700
commit086f21ed70c56b1f52791816acd812fa6d5b3ed3 (patch)
tree05ab6f0028209d59c2f46eaf117061ba13f86bf3
parent7649d6746b49512a6ab6bb83306aa19c6e74b2a6 (diff)
downloadinfinitytier-086f21ed70c56b1f52791816acd812fa6d5b3ed3.tar.gz
infinitytier-086f21ed70c56b1f52791816acd812fa6d5b3ed3.zip
Refactor and simplify controller integration with JSON API and OneService.
-rw-r--r--one.cpp21
-rw-r--r--service/ControlPlane.cpp18
-rw-r--r--service/ControlPlane.hpp28
-rw-r--r--service/OneService.cpp32
-rw-r--r--service/OneService.hpp4
5 files changed, 47 insertions, 56 deletions
diff --git a/one.cpp b/one.cpp
index d6da3a26..27cb3ff4 100644
--- a/one.cpp
+++ b/one.cpp
@@ -72,12 +72,7 @@
#include "service/OneService.hpp"
-#ifdef ZT_ENABLE_NETWORK_CONTROLLER
-#include "controller/SqliteNetworkController.hpp"
-#endif
-
#define ZT1_PID_PATH "zerotier-one.pid"
-#define ZT1_CONTROLLER_DB_PATH "controller.db"
using namespace ZeroTier;
@@ -1129,19 +1124,6 @@ int main(int argc,char **argv)
}
#endif // __WINDOWS__
- NetworkController *controller = (NetworkController *)0;
-#ifdef ZT_ENABLE_NETWORK_CONTROLLER
- try {
- controller = new SqliteNetworkController((homeDir + ZT_PATH_SEPARATOR_S + ZT1_CONTROLLER_DB_PATH).c_str());
- } catch (std::exception &exc) {
- fprintf(stderr,"%s: failure initializing SqliteNetworkController: %s"ZT_EOL_S,argv[0],exc.what());
- return 1;
- } catch ( ... ) {
- fprintf(stderr,"%s: failure initializing SqliteNetworkController: unknown exception"ZT_EOL_S,argv[0]);
- return 1;
- }
-#endif // ZT_ENABLE_NETWORK_CONTROLLER
-
#ifdef __UNIX_LIKE__
std::string pidPath(homeDir + ZT_PATH_SEPARATOR_S + ZT1_PID_PATH);
{
@@ -1158,7 +1140,7 @@ int main(int argc,char **argv)
try {
for(;;) {
- zt1Service = OneService::newInstance(homeDir.c_str(),port,controller,(overrideRootTopology.length() > 0) ? overrideRootTopology.c_str() : (const char *)0);
+ zt1Service = OneService::newInstance(homeDir.c_str(),port,(overrideRootTopology.length() > 0) ? overrideRootTopology.c_str() : (const char *)0);
switch(zt1Service->run()) {
case OneService::ONE_STILL_RUNNING: // shouldn't happen, run() won't return until done
case OneService::ONE_NORMAL_TERMINATION:
@@ -1191,7 +1173,6 @@ int main(int argc,char **argv)
delete zt1Service;
zt1Service = (OneService *)0;
- delete controller;
#ifdef __UNIX_LIKE__
OSUtils::rm(pidPath.c_str());
diff --git a/service/ControlPlane.cpp b/service/ControlPlane.cpp
index 1047067e..81fb61ca 100644
--- a/service/ControlPlane.cpp
+++ b/service/ControlPlane.cpp
@@ -245,6 +245,9 @@ static void _jsonAppend(unsigned int depth,std::string &buf,const ZT1_Peer *peer
ControlPlane::ControlPlane(OneService *svc,Node *n,const char *uiStaticPath) :
_svc(svc),
_node(n),
+#ifdef ZT_ENABLE_NETWORK_CONTROLLER
+ _controller((SqliteNetworkController *)0),
+#endif
_uiStaticPath((uiStaticPath) ? uiStaticPath : "")
{
}
@@ -446,9 +449,8 @@ unsigned int ControlPlane::handleRequest(
scode = 200;
} else {
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
- std::map<std::string,SqliteNetworkController *>::const_iterator ss(_subsystems.find(ps[0]));
- if (ss != _subsystems.end())
- scode = ss->second->handleControlPlaneHttpGET(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
+ if (_controller)
+ _controller->handleControlPlaneHttpGET(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
else scode = 404;
#else
scode = 404;
@@ -483,9 +485,8 @@ unsigned int ControlPlane::handleRequest(
}
} else {
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
- std::map<std::string,SqliteNetworkController *>::const_iterator ss(_subsystems.find(ps[0]));
- if (ss != _subsystems.end())
- scode = ss->second->handleControlPlaneHttpPOST(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
+ if (_controller)
+ _controller->handleControlPlaneHttpPOST(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
else scode = 404;
#else
scode = 404;
@@ -519,9 +520,8 @@ unsigned int ControlPlane::handleRequest(
} else scode = 500;
} else {
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
- std::map<std::string,SqliteNetworkController *>::const_iterator ss(_subsystems.find(ps[0]));
- if (ss != _subsystems.end())
- scode = ss->second->handleControlPlaneHttpDELETE(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
+ if (_controller)
+ _controller->handleControlPlaneHttpDELETE(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
else scode = 404;
#else
scode = 404;
diff --git a/service/ControlPlane.hpp b/service/ControlPlane.hpp
index fc8a0182..75cd8cac 100644
--- a/service/ControlPlane.hpp
+++ b/service/ControlPlane.hpp
@@ -52,30 +52,26 @@ public:
ControlPlane(OneService *svc,Node *n,const char *uiStaticPath);
~ControlPlane();
+#ifdef ZT_ENABLE_NETWORK_CONTROLLER
/**
- * Add an authentication token for API access
+ * Set controller, which will be available under /controller
+ *
+ * @param c Network controller instance
*/
- inline void addAuthToken(const char *tok)
+ inline void setController(SqliteNetworkController *c)
{
Mutex::Lock _l(_lock);
- _authTokens.insert(std::string(tok));
+ _controller = c;
}
+#endif
/**
- * Mount a subsystem under a prefix
- *
- * Note that the prefix must not contain a dot -- this is reserved for
- * static pages -- and must not be a reserved prefix such as /peer
- * or /network. Do not include path / characters in the prefix. Example
- * would be 'controller' for SqliteNetworkController.
- *
- * @param prefix First element in URI path
- * @param subsys Object to call for results of GET and POST/PUT operations
+ * Add an authentication token for API access
*/
- inline void mount(const char *prefix,SqliteNetworkController *subsys)
+ inline void addAuthToken(const char *tok)
{
Mutex::Lock _l(_lock);
- _subsystems[std::string(prefix)] = subsys;
+ _authTokens.insert(std::string(tok));
}
/**
@@ -102,9 +98,11 @@ public:
private:
OneService *const _svc;
Node *const _node;
+#ifdef ZT_ENABLE_NETWORK_CONTROLLER
+ SqliteNetworkController *_controller;
+#endif
std::string _uiStaticPath;
std::set<std::string> _authTokens;
- std::map<std::string,SqliteNetworkController *> _subsystems;
Mutex _lock;
};
diff --git a/service/OneService.cpp b/service/OneService.cpp
index 13108aa1..42b4fc00 100644
--- a/service/OneService.cpp
+++ b/service/OneService.cpp
@@ -53,6 +53,12 @@
#include "OneService.hpp"
#include "ControlPlane.hpp"
+#ifdef ZT_ENABLE_NETWORK_CONTROLLER
+#include "../controller/SqliteNetworkController.hpp"
+#else
+class SqliteNetworkController;
+#endif
+
#ifdef __WINDOWS__
#include <ShlObj.h>
#endif
@@ -85,6 +91,9 @@ namespace ZeroTier { typedef BSDEthernetTap EthernetTap; }
// How often to check for new multicast subscriptions on a tap device
#define ZT_TAP_CHECK_MULTICAST_INTERVAL 30000
+// Path under ZT1 home for controller database if controller is enabled
+#define ZT1_CONTROLLER_DB_PATH "controller.db"
+
namespace ZeroTier {
class OneServiceImpl;
@@ -147,10 +156,12 @@ struct TcpConnection
class OneServiceImpl : public OneService
{
public:
- OneServiceImpl(const char *hp,unsigned int port,NetworkController *master,const char *overrideRootTopology) :
+ OneServiceImpl(const char *hp,unsigned int port,const char *overrideRootTopology) :
_homePath((hp) ? hp : "."),
+#ifdef ZT_ENABLE_NETWORK_CONTROLLER
+ _controller((_homePath + ZT_PATH_SEPARATOR_S + ZT1_CONTROLLER_DB_PATH).c_str()),
+#endif
_phy(this,true),
- _master(master),
_overrideRootTopology((overrideRootTopology) ? overrideRootTopology : ""),
_node((Node *)0),
_controlPlane((ControlPlane *)0),
@@ -227,13 +238,16 @@ public:
SnodeEventCallback,
((_overrideRootTopology.length() > 0) ? _overrideRootTopology.c_str() : (const char *)0));
- if (_master)
- _node->setNetconfMaster((void *)_master);
+#ifdef ZT_ENABLE_NETWORK_CONTROLLER
+ _node->setNetconfMaster((void *)&_controller);
+#endif
_controlPlane = new ControlPlane(this,_node,(_homePath + ZT_PATH_SEPARATOR_S + "ui").c_str());
_controlPlane->addAuthToken(authToken.c_str());
- if (_master)
- _controlPlane->mount("controller",reinterpret_cast<SqliteNetworkController *>(_master));
+
+#ifdef ZT_ENABLE_NETWORK_CONTROLLER
+ _controlPlane->setController(&_controller);
+#endif
{ // Remember networks from previous session
std::vector<std::string> networksDotD(OSUtils::listDirectory((_homePath + ZT_PATH_SEPARATOR_S + "networks.d").c_str()));
@@ -763,8 +777,10 @@ private:
}
const std::string _homePath;
+#ifdef ZT_ENABLE_NETWORK_CONTROLLER
+ SqliteNetworkController _controller;
+#endif
Phy<OneServiceImpl *> _phy;
- NetworkController *_master;
std::string _overrideRootTopology;
Node *_node;
PhySocket *_v4UdpSocket;
@@ -923,7 +939,7 @@ std::string OneService::platformDefaultHomePath()
#endif // __UNIX_LIKE__ or not...
}
-OneService *OneService::newInstance(const char *hp,unsigned int port,NetworkController *master,const char *overrideRootTopology) { return new OneServiceImpl(hp,port,master,overrideRootTopology); }
+OneService *OneService::newInstance(const char *hp,unsigned int port,const char *overrideRootTopology) { return new OneServiceImpl(hp,port,overrideRootTopology); }
OneService::~OneService() {}
} // namespace ZeroTier
diff --git a/service/OneService.hpp b/service/OneService.hpp
index 9df65179..33c40547 100644
--- a/service/OneService.hpp
+++ b/service/OneService.hpp
@@ -32,8 +32,6 @@
namespace ZeroTier {
-class NetworkController;
-
/**
* Local service for ZeroTier One as system VPN/NFV provider
*/
@@ -79,13 +77,11 @@ public:
*
* @param hp Home path
* @param port TCP and UDP port for packets and HTTP control
- * @param master Instance of network config master if this instance is to act as one (default: NULL)
* @param overrideRootTopology String-serialized root topology (for testing, default: NULL)
*/
static OneService *newInstance(
const char *hp,
unsigned int port,
- NetworkController *master = (NetworkController *)0,
const char *overrideRootTopology = (const char *)0);
virtual ~OneService();