|
|
|
|
@ -588,67 +588,67 @@ public:
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef ZT_ENABLE_CLUSTER |
|
|
|
|
if (OSUtils::fileExists((_homePath + ZT_PATH_SEPARATOR_S + "cluster").c_str())) { |
|
|
|
|
_clusterDefinition = new ClusterDefinition(_node->address(),(_homePath + ZT_PATH_SEPARATOR_S + "cluster").c_str()); |
|
|
|
|
if (_clusterDefinition->size() > 0) { |
|
|
|
|
std::vector<ClusterDefinition::MemberDefinition> members(_clusterDefinition->members()); |
|
|
|
|
for(std::vector<ClusterDefinition::MemberDefinition>::iterator m(members.begin());m!=members.end();++m) { |
|
|
|
|
PhySocket *cs = _phy.udpBind(reinterpret_cast<const struct sockaddr *>(&(m->clusterEndpoint))); |
|
|
|
|
if (cs) { |
|
|
|
|
if (_clusterMessageSocket) { |
|
|
|
|
_phy.close(_clusterMessageSocket,false); |
|
|
|
|
_phy.close(cs,false); |
|
|
|
|
|
|
|
|
|
Mutex::Lock _l(_termReason_m); |
|
|
|
|
_termReason = ONE_UNRECOVERABLE_ERROR; |
|
|
|
|
_fatalErrorMessage = "Cluster: can't determine my cluster member ID: able to bind more than one cluster message socket IP/port!"; |
|
|
|
|
return _termReason; |
|
|
|
|
if (OSUtils::fileExists((_homePath + ZT_PATH_SEPARATOR_S + "cluster").c_str())) { |
|
|
|
|
_clusterDefinition = new ClusterDefinition(_node->address(),(_homePath + ZT_PATH_SEPARATOR_S + "cluster").c_str()); |
|
|
|
|
if (_clusterDefinition->size() > 0) { |
|
|
|
|
std::vector<ClusterDefinition::MemberDefinition> members(_clusterDefinition->members()); |
|
|
|
|
for(std::vector<ClusterDefinition::MemberDefinition>::iterator m(members.begin());m!=members.end();++m) { |
|
|
|
|
PhySocket *cs = _phy.udpBind(reinterpret_cast<const struct sockaddr *>(&(m->clusterEndpoint))); |
|
|
|
|
if (cs) { |
|
|
|
|
if (_clusterMessageSocket) { |
|
|
|
|
_phy.close(_clusterMessageSocket,false); |
|
|
|
|
_phy.close(cs,false); |
|
|
|
|
|
|
|
|
|
Mutex::Lock _l(_termReason_m); |
|
|
|
|
_termReason = ONE_UNRECOVERABLE_ERROR; |
|
|
|
|
_fatalErrorMessage = "Cluster: can't determine my cluster member ID: able to bind more than one cluster message socket IP/port!"; |
|
|
|
|
return _termReason; |
|
|
|
|
} |
|
|
|
|
_clusterMessageSocket = cs; |
|
|
|
|
_clusterMemberId = m->id; |
|
|
|
|
} |
|
|
|
|
_clusterMessageSocket = cs; |
|
|
|
|
_clusterMemberId = m->id; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!_clusterMessageSocket) { |
|
|
|
|
Mutex::Lock _l(_termReason_m); |
|
|
|
|
_termReason = ONE_UNRECOVERABLE_ERROR; |
|
|
|
|
_fatalErrorMessage = "Cluster: can't determine my cluster member ID: unable to bind to any cluster message socket IP/port."; |
|
|
|
|
return _termReason; |
|
|
|
|
} |
|
|
|
|
if (!_clusterMessageSocket) { |
|
|
|
|
Mutex::Lock _l(_termReason_m); |
|
|
|
|
_termReason = ONE_UNRECOVERABLE_ERROR; |
|
|
|
|
_fatalErrorMessage = "Cluster: can't determine my cluster member ID: unable to bind to any cluster message socket IP/port."; |
|
|
|
|
return _termReason; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (OSUtils::fileExists((_homePath + ZT_PATH_SEPARATOR_S + "cluster-geo.exe").c_str())) |
|
|
|
|
_clusterGeoIpService = new ClusterGeoIpService((_homePath + ZT_PATH_SEPARATOR_S + "cluster-geo.exe").c_str()); |
|
|
|
|
|
|
|
|
|
const ClusterDefinition::MemberDefinition &me = (*_clusterDefinition)[_clusterMemberId]; |
|
|
|
|
InetAddress endpoints[255]; |
|
|
|
|
unsigned int numEndpoints = 0; |
|
|
|
|
for(std::vector<InetAddress>::const_iterator i(me.zeroTierEndpoints.begin());i!=me.zeroTierEndpoints.end();++i) |
|
|
|
|
endpoints[numEndpoints++] = *i; |
|
|
|
|
|
|
|
|
|
if (_node->clusterInit( |
|
|
|
|
_clusterMemberId, |
|
|
|
|
reinterpret_cast<const struct sockaddr_storage *>(endpoints), |
|
|
|
|
numEndpoints, |
|
|
|
|
me.x, |
|
|
|
|
me.y, |
|
|
|
|
me.z, |
|
|
|
|
&SclusterSendFunction, |
|
|
|
|
this, |
|
|
|
|
(_clusterGeoIpService) ? &SclusterGeoIpFunction : 0, |
|
|
|
|
this) == ZT_RESULT_OK) { |
|
|
|
|
if (OSUtils::fileExists((_homePath + ZT_PATH_SEPARATOR_S + "cluster-geo.exe").c_str())) |
|
|
|
|
_clusterGeoIpService = new ClusterGeoIpService((_homePath + ZT_PATH_SEPARATOR_S + "cluster-geo.exe").c_str()); |
|
|
|
|
|
|
|
|
|
const ClusterDefinition::MemberDefinition &me = (*_clusterDefinition)[_clusterMemberId]; |
|
|
|
|
InetAddress endpoints[255]; |
|
|
|
|
unsigned int numEndpoints = 0; |
|
|
|
|
for(std::vector<InetAddress>::const_iterator i(me.zeroTierEndpoints.begin());i!=me.zeroTierEndpoints.end();++i) |
|
|
|
|
endpoints[numEndpoints++] = *i; |
|
|
|
|
|
|
|
|
|
if (_node->clusterInit( |
|
|
|
|
_clusterMemberId, |
|
|
|
|
reinterpret_cast<const struct sockaddr_storage *>(endpoints), |
|
|
|
|
numEndpoints, |
|
|
|
|
me.x, |
|
|
|
|
me.y, |
|
|
|
|
me.z, |
|
|
|
|
&SclusterSendFunction, |
|
|
|
|
this, |
|
|
|
|
(_clusterGeoIpService) ? &SclusterGeoIpFunction : 0, |
|
|
|
|
this) == ZT_RESULT_OK) { |
|
|
|
|
|
|
|
|
|
std::vector<ClusterDefinition::MemberDefinition> members(_clusterDefinition->members()); |
|
|
|
|
for(std::vector<ClusterDefinition::MemberDefinition>::iterator m(members.begin());m!=members.end();++m) { |
|
|
|
|
if (m->id != _clusterMemberId) |
|
|
|
|
_node->clusterAddMember(m->id); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::vector<ClusterDefinition::MemberDefinition> members(_clusterDefinition->members()); |
|
|
|
|
for(std::vector<ClusterDefinition::MemberDefinition>::iterator m(members.begin());m!=members.end();++m) { |
|
|
|
|
if (m->id != _clusterMemberId) |
|
|
|
|
_node->clusterAddMember(m->id); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
delete _clusterDefinition; |
|
|
|
|
_clusterDefinition = (ClusterDefinition *)0; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
delete _clusterDefinition; |
|
|
|
|
_clusterDefinition = (ClusterDefinition *)0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
_controlPlane = new ControlPlane(this,_node,(_homePath + ZT_PATH_SEPARATOR_S + "ui").c_str()); |
|
|
|
|
|