mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-05 03:53:44 +02:00
Refactor and simplify controller integration with JSON API and OneService.
This commit is contained in:
parent
7649d6746b
commit
086f21ed70
5 changed files with 50 additions and 59 deletions
21
one.cpp
21
one.cpp
|
@ -72,12 +72,7 @@
|
||||||
|
|
||||||
#include "service/OneService.hpp"
|
#include "service/OneService.hpp"
|
||||||
|
|
||||||
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
|
||||||
#include "controller/SqliteNetworkController.hpp"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ZT1_PID_PATH "zerotier-one.pid"
|
#define ZT1_PID_PATH "zerotier-one.pid"
|
||||||
#define ZT1_CONTROLLER_DB_PATH "controller.db"
|
|
||||||
|
|
||||||
using namespace ZeroTier;
|
using namespace ZeroTier;
|
||||||
|
|
||||||
|
@ -1129,19 +1124,6 @@ int main(int argc,char **argv)
|
||||||
}
|
}
|
||||||
#endif // __WINDOWS__
|
#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__
|
#ifdef __UNIX_LIKE__
|
||||||
std::string pidPath(homeDir + ZT_PATH_SEPARATOR_S + ZT1_PID_PATH);
|
std::string pidPath(homeDir + ZT_PATH_SEPARATOR_S + ZT1_PID_PATH);
|
||||||
{
|
{
|
||||||
|
@ -1158,7 +1140,7 @@ int main(int argc,char **argv)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
for(;;) {
|
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()) {
|
switch(zt1Service->run()) {
|
||||||
case OneService::ONE_STILL_RUNNING: // shouldn't happen, run() won't return until done
|
case OneService::ONE_STILL_RUNNING: // shouldn't happen, run() won't return until done
|
||||||
case OneService::ONE_NORMAL_TERMINATION:
|
case OneService::ONE_NORMAL_TERMINATION:
|
||||||
|
@ -1191,7 +1173,6 @@ int main(int argc,char **argv)
|
||||||
|
|
||||||
delete zt1Service;
|
delete zt1Service;
|
||||||
zt1Service = (OneService *)0;
|
zt1Service = (OneService *)0;
|
||||||
delete controller;
|
|
||||||
|
|
||||||
#ifdef __UNIX_LIKE__
|
#ifdef __UNIX_LIKE__
|
||||||
OSUtils::rm(pidPath.c_str());
|
OSUtils::rm(pidPath.c_str());
|
||||||
|
|
|
@ -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) :
|
ControlPlane::ControlPlane(OneService *svc,Node *n,const char *uiStaticPath) :
|
||||||
_svc(svc),
|
_svc(svc),
|
||||||
_node(n),
|
_node(n),
|
||||||
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
|
_controller((SqliteNetworkController *)0),
|
||||||
|
#endif
|
||||||
_uiStaticPath((uiStaticPath) ? uiStaticPath : "")
|
_uiStaticPath((uiStaticPath) ? uiStaticPath : "")
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -446,9 +449,8 @@ unsigned int ControlPlane::handleRequest(
|
||||||
scode = 200;
|
scode = 200;
|
||||||
} else {
|
} else {
|
||||||
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
std::map<std::string,SqliteNetworkController *>::const_iterator ss(_subsystems.find(ps[0]));
|
if (_controller)
|
||||||
if (ss != _subsystems.end())
|
_controller->handleControlPlaneHttpGET(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
|
||||||
scode = ss->second->handleControlPlaneHttpGET(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
|
|
||||||
else scode = 404;
|
else scode = 404;
|
||||||
#else
|
#else
|
||||||
scode = 404;
|
scode = 404;
|
||||||
|
@ -483,9 +485,8 @@ unsigned int ControlPlane::handleRequest(
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
std::map<std::string,SqliteNetworkController *>::const_iterator ss(_subsystems.find(ps[0]));
|
if (_controller)
|
||||||
if (ss != _subsystems.end())
|
_controller->handleControlPlaneHttpPOST(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
|
||||||
scode = ss->second->handleControlPlaneHttpPOST(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
|
|
||||||
else scode = 404;
|
else scode = 404;
|
||||||
#else
|
#else
|
||||||
scode = 404;
|
scode = 404;
|
||||||
|
@ -519,9 +520,8 @@ unsigned int ControlPlane::handleRequest(
|
||||||
} else scode = 500;
|
} else scode = 500;
|
||||||
} else {
|
} else {
|
||||||
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
std::map<std::string,SqliteNetworkController *>::const_iterator ss(_subsystems.find(ps[0]));
|
if (_controller)
|
||||||
if (ss != _subsystems.end())
|
_controller->handleControlPlaneHttpDELETE(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
|
||||||
scode = ss->second->handleControlPlaneHttpDELETE(std::vector<std::string>(ps.begin()+1,ps.end()),urlArgs,headers,body,responseBody,responseContentType);
|
|
||||||
else scode = 404;
|
else scode = 404;
|
||||||
#else
|
#else
|
||||||
scode = 404;
|
scode = 404;
|
||||||
|
|
|
@ -52,6 +52,19 @@ public:
|
||||||
ControlPlane(OneService *svc,Node *n,const char *uiStaticPath);
|
ControlPlane(OneService *svc,Node *n,const char *uiStaticPath);
|
||||||
~ControlPlane();
|
~ControlPlane();
|
||||||
|
|
||||||
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
|
/**
|
||||||
|
* Set controller, which will be available under /controller
|
||||||
|
*
|
||||||
|
* @param c Network controller instance
|
||||||
|
*/
|
||||||
|
inline void setController(SqliteNetworkController *c)
|
||||||
|
{
|
||||||
|
Mutex::Lock _l(_lock);
|
||||||
|
_controller = c;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an authentication token for API access
|
* Add an authentication token for API access
|
||||||
*/
|
*/
|
||||||
|
@ -61,23 +74,6 @@ public:
|
||||||
_authTokens.insert(std::string(tok));
|
_authTokens.insert(std::string(tok));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
inline void mount(const char *prefix,SqliteNetworkController *subsys)
|
|
||||||
{
|
|
||||||
Mutex::Lock _l(_lock);
|
|
||||||
_subsystems[std::string(prefix)] = subsys;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle HTTP request
|
* Handle HTTP request
|
||||||
*
|
*
|
||||||
|
@ -102,9 +98,11 @@ public:
|
||||||
private:
|
private:
|
||||||
OneService *const _svc;
|
OneService *const _svc;
|
||||||
Node *const _node;
|
Node *const _node;
|
||||||
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
|
SqliteNetworkController *_controller;
|
||||||
|
#endif
|
||||||
std::string _uiStaticPath;
|
std::string _uiStaticPath;
|
||||||
std::set<std::string> _authTokens;
|
std::set<std::string> _authTokens;
|
||||||
std::map<std::string,SqliteNetworkController *> _subsystems;
|
|
||||||
Mutex _lock;
|
Mutex _lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,12 @@
|
||||||
#include "OneService.hpp"
|
#include "OneService.hpp"
|
||||||
#include "ControlPlane.hpp"
|
#include "ControlPlane.hpp"
|
||||||
|
|
||||||
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
|
#include "../controller/SqliteNetworkController.hpp"
|
||||||
|
#else
|
||||||
|
class SqliteNetworkController;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
#include <ShlObj.h>
|
#include <ShlObj.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -85,6 +91,9 @@ namespace ZeroTier { typedef BSDEthernetTap EthernetTap; }
|
||||||
// How often to check for new multicast subscriptions on a tap device
|
// How often to check for new multicast subscriptions on a tap device
|
||||||
#define ZT_TAP_CHECK_MULTICAST_INTERVAL 30000
|
#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 {
|
namespace ZeroTier {
|
||||||
|
|
||||||
class OneServiceImpl;
|
class OneServiceImpl;
|
||||||
|
@ -147,10 +156,12 @@ struct TcpConnection
|
||||||
class OneServiceImpl : public OneService
|
class OneServiceImpl : public OneService
|
||||||
{
|
{
|
||||||
public:
|
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 : "."),
|
_homePath((hp) ? hp : "."),
|
||||||
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
|
_controller((_homePath + ZT_PATH_SEPARATOR_S + ZT1_CONTROLLER_DB_PATH).c_str()),
|
||||||
|
#endif
|
||||||
_phy(this,true),
|
_phy(this,true),
|
||||||
_master(master),
|
|
||||||
_overrideRootTopology((overrideRootTopology) ? overrideRootTopology : ""),
|
_overrideRootTopology((overrideRootTopology) ? overrideRootTopology : ""),
|
||||||
_node((Node *)0),
|
_node((Node *)0),
|
||||||
_controlPlane((ControlPlane *)0),
|
_controlPlane((ControlPlane *)0),
|
||||||
|
@ -227,13 +238,16 @@ public:
|
||||||
SnodeEventCallback,
|
SnodeEventCallback,
|
||||||
((_overrideRootTopology.length() > 0) ? _overrideRootTopology.c_str() : (const char *)0));
|
((_overrideRootTopology.length() > 0) ? _overrideRootTopology.c_str() : (const char *)0));
|
||||||
|
|
||||||
if (_master)
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
_node->setNetconfMaster((void *)_master);
|
_node->setNetconfMaster((void *)&_controller);
|
||||||
|
#endif
|
||||||
|
|
||||||
_controlPlane = new ControlPlane(this,_node,(_homePath + ZT_PATH_SEPARATOR_S + "ui").c_str());
|
_controlPlane = new ControlPlane(this,_node,(_homePath + ZT_PATH_SEPARATOR_S + "ui").c_str());
|
||||||
_controlPlane->addAuthToken(authToken.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
|
{ // Remember networks from previous session
|
||||||
std::vector<std::string> networksDotD(OSUtils::listDirectory((_homePath + ZT_PATH_SEPARATOR_S + "networks.d").c_str()));
|
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;
|
const std::string _homePath;
|
||||||
|
#ifdef ZT_ENABLE_NETWORK_CONTROLLER
|
||||||
|
SqliteNetworkController _controller;
|
||||||
|
#endif
|
||||||
Phy<OneServiceImpl *> _phy;
|
Phy<OneServiceImpl *> _phy;
|
||||||
NetworkController *_master;
|
|
||||||
std::string _overrideRootTopology;
|
std::string _overrideRootTopology;
|
||||||
Node *_node;
|
Node *_node;
|
||||||
PhySocket *_v4UdpSocket;
|
PhySocket *_v4UdpSocket;
|
||||||
|
@ -923,7 +939,7 @@ std::string OneService::platformDefaultHomePath()
|
||||||
#endif // __UNIX_LIKE__ or not...
|
#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() {}
|
OneService::~OneService() {}
|
||||||
|
|
||||||
} // namespace ZeroTier
|
} // namespace ZeroTier
|
||||||
|
|
|
@ -32,8 +32,6 @@
|
||||||
|
|
||||||
namespace ZeroTier {
|
namespace ZeroTier {
|
||||||
|
|
||||||
class NetworkController;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Local service for ZeroTier One as system VPN/NFV provider
|
* Local service for ZeroTier One as system VPN/NFV provider
|
||||||
*/
|
*/
|
||||||
|
@ -79,13 +77,11 @@ public:
|
||||||
*
|
*
|
||||||
* @param hp Home path
|
* @param hp Home path
|
||||||
* @param port TCP and UDP port for packets and HTTP control
|
* @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)
|
* @param overrideRootTopology String-serialized root topology (for testing, default: NULL)
|
||||||
*/
|
*/
|
||||||
static OneService *newInstance(
|
static OneService *newInstance(
|
||||||
const char *hp,
|
const char *hp,
|
||||||
unsigned int port,
|
unsigned int port,
|
||||||
NetworkController *master = (NetworkController *)0,
|
|
||||||
const char *overrideRootTopology = (const char *)0);
|
const char *overrideRootTopology = (const char *)0);
|
||||||
|
|
||||||
virtual ~OneService();
|
virtual ~OneService();
|
||||||
|
|
Loading…
Add table
Reference in a new issue