mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-04-07 19:24:13 +00:00
More testnet work.
This commit is contained in:
parent
5c7cd53f13
commit
3857116724
@ -176,7 +176,7 @@ public:
|
||||
throw();
|
||||
|
||||
/**
|
||||
* Leave a network
|
||||
* Leave a network (if a member)
|
||||
*
|
||||
* @param nwid 64-bit network ID
|
||||
*/
|
||||
|
197
testnet.cpp
197
testnet.cpp
@ -217,11 +217,11 @@ static void doHelp(const std::vector<std::string> &cmd)
|
||||
printf("---------- mksn <number of supernodes>"ZT_EOL_S);
|
||||
printf("---------- mkn <number of normal nodes>"ZT_EOL_S);
|
||||
printf("---------- list"ZT_EOL_S);
|
||||
printf("---------- join <address/*> <network ID>"ZT_EOL_S);
|
||||
printf("---------- leave <address/*> <network ID>"ZT_EOL_S);
|
||||
printf("---------- listnetworks <address/*>"ZT_EOL_S);
|
||||
printf("---------- listpeers <address/*>"ZT_EOL_S);
|
||||
printf("---------- alltoall"ZT_EOL_S);
|
||||
printf("---------- join <address/*/**> <network ID> (* normal peers, ** all)"ZT_EOL_S);
|
||||
printf("---------- leave <address/*/**> <network ID> (* normal peers, ** all)"ZT_EOL_S);
|
||||
printf("---------- listnetworks <address/*/**> (* normal peers, ** all)"ZT_EOL_S);
|
||||
printf("---------- listpeers <address/*/**> (* normal peers, ** all)"ZT_EOL_S);
|
||||
printf("---------- alltoall <*/**> <network ID> (* normal peers, ** all)"ZT_EOL_S);
|
||||
printf("---------- quit"ZT_EOL_S);
|
||||
}
|
||||
|
||||
@ -259,26 +259,213 @@ static void doMKN(const std::vector<std::string> &cmd)
|
||||
printf("---------- mkn error: use mksn to create supernodes first."ZT_EOL_S);
|
||||
return;
|
||||
}
|
||||
|
||||
int count = Utils::strToInt(cmd[1].c_str());
|
||||
for(int i=0;i<count;++i) {
|
||||
Identity id(makeNodeHome(false));
|
||||
printf("%s identity created"ZT_EOL_S,id.address().toString().c_str());
|
||||
}
|
||||
|
||||
std::vector<Address> nodes(scanForNewNodes());
|
||||
for(std::vector<Address>::iterator a(nodes.begin());a!=nodes.end();++a)
|
||||
printf("%s started (regular node)"ZT_EOL_S,a->toString().c_str());
|
||||
}
|
||||
|
||||
static void doList(const std::vector<std::string> &cmd)
|
||||
{
|
||||
ZT1_Node_Status status;
|
||||
for(std::map< Address,SimNode * >::iterator n(nodes.begin());n!=nodes.end();++n) {
|
||||
n->second->node.status(&status);
|
||||
printf("%s %c %s (%u peers, %u direct links)"ZT_EOL_S,
|
||||
n->first.toString().c_str(),
|
||||
n->second->supernode ? 'S' : 'N',
|
||||
(status.online ? "ONLINE" : "OFFLINE"),
|
||||
status.knownPeers,
|
||||
status.directlyConnectedPeers);
|
||||
}
|
||||
}
|
||||
|
||||
static void doJoin(const std::vector<std::string> &cmd)
|
||||
{
|
||||
if (cmd.size() < 3) {
|
||||
doHelp(cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<Address> addrs;
|
||||
|
||||
if ((cmd[1] == "*")||(cmd[1] == "**")) {
|
||||
bool includeSuper = (cmd[1] == "**");
|
||||
for(std::map< Address,SimNode * >::iterator n(nodes.begin());n!=nodes.end();++n) {
|
||||
if ((includeSuper)||(!n->second->supernode))
|
||||
addrs.push_back(n->first);
|
||||
}
|
||||
} else addrs.push_back(Address(cmd[1]));
|
||||
|
||||
uint64_t nwid = Utils::hexStrToU64(cmd[2].c_str());
|
||||
|
||||
for(std::vector<Address>::iterator a(addrs.begin());a!=addrs.end();++a) {
|
||||
std::map< Address,SimNode * >::iterator n(nodes.find(*a));
|
||||
if (n != nodes.end()) {
|
||||
n->second->node.join(nwid);
|
||||
printf("%s join %.16llx"ZT_EOL_S,n->first.toString().c_str(),nwid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void doLeave(const std::vector<std::string> &cmd)
|
||||
{
|
||||
if (cmd.size() < 3) {
|
||||
doHelp(cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<Address> addrs;
|
||||
|
||||
if ((cmd[1] == "*")||(cmd[1] == "**")) {
|
||||
bool includeSuper = (cmd[1] == "**");
|
||||
for(std::map< Address,SimNode * >::iterator n(nodes.begin());n!=nodes.end();++n) {
|
||||
if ((includeSuper)||(!n->second->supernode))
|
||||
addrs.push_back(n->first);
|
||||
}
|
||||
} else addrs.push_back(Address(cmd[1]));
|
||||
|
||||
uint64_t nwid = Utils::hexStrToU64(cmd[2].c_str());
|
||||
|
||||
for(std::vector<Address>::iterator a(addrs.begin());a!=addrs.end();++a) {
|
||||
std::map< Address,SimNode * >::iterator n(nodes.find(*a));
|
||||
if (n != nodes.end()) {
|
||||
n->second->node.leave(nwid);
|
||||
printf("%s leave %.16llx"ZT_EOL_S,n->first.toString().c_str(),nwid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void doListNetworks(const std::vector<std::string> &cmd)
|
||||
{
|
||||
if (cmd.size() < 2) {
|
||||
doHelp(cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<Address> addrs;
|
||||
|
||||
if ((cmd[1] == "*")||(cmd[1] == "**")) {
|
||||
bool includeSuper = (cmd[1] == "**");
|
||||
for(std::map< Address,SimNode * >::iterator n(nodes.begin());n!=nodes.end();++n) {
|
||||
if ((includeSuper)||(!n->second->supernode))
|
||||
addrs.push_back(n->first);
|
||||
}
|
||||
} else addrs.push_back(Address(cmd[1]));
|
||||
|
||||
printf("---------- <nwid> <name> <mac> <status> <config age> <type> <dev> <ips>"ZT_EOL_S);
|
||||
|
||||
for(std::vector<Address>::iterator a(addrs.begin());a!=addrs.end();++a) {
|
||||
std::string astr(a->toString());
|
||||
std::map< Address,SimNode * >::iterator n(nodes.find(*a));
|
||||
if (n != nodes.end()) {
|
||||
ZT1_Node_NetworkList *nl = n->second->node.listNetworks();
|
||||
if (nl) {
|
||||
for(unsigned int i=0;i<nl->numNetworks;++i) {
|
||||
printf("%s %s %s %s %s %ld %s %s ",
|
||||
astr.c_str(),
|
||||
nl->networks[i].nwidHex,
|
||||
nl->networks[i].name,
|
||||
nl->networks[i].macStr,
|
||||
nl->networks[i].statusStr,
|
||||
nl->networks[i].configAge,
|
||||
(nl->networks[i].isPrivate ? "private" : "public"),
|
||||
nl->networks[i].device);
|
||||
if (nl->networks[i].numIps > 0) {
|
||||
for(unsigned int j=0;j<nl->networks[i].numIps;++j) {
|
||||
if (j > 0)
|
||||
printf(",");
|
||||
printf("%s/%d",nl->networks[i].ips[j].ascii,(int)nl->networks[i].ips[j].port);
|
||||
}
|
||||
} else printf("-");
|
||||
printf(ZT_EOL_S);
|
||||
}
|
||||
n->second->node.freeQueryResult(nl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void doListPeers(const std::vector<std::string> &cmd)
|
||||
{
|
||||
if (cmd.size() < 2) {
|
||||
doHelp(cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<Address> addrs;
|
||||
|
||||
if ((cmd[1] == "*")||(cmd[1] == "**")) {
|
||||
bool includeSuper = (cmd[1] == "**");
|
||||
for(std::map< Address,SimNode * >::iterator n(nodes.begin());n!=nodes.end();++n) {
|
||||
if ((includeSuper)||(!n->second->supernode))
|
||||
addrs.push_back(n->first);
|
||||
}
|
||||
} else addrs.push_back(Address(cmd[1]));
|
||||
|
||||
printf("---------- <ztaddr> <paths> <latency> <version> <role>"ZT_EOL_S);
|
||||
|
||||
for(std::vector<Address>::iterator a(addrs.begin());a!=addrs.end();++a) {
|
||||
std::string astr(a->toString());
|
||||
std::map< Address,SimNode * >::iterator n(nodes.find(*a));
|
||||
if (n != nodes.end()) {
|
||||
ZT1_Node_PeerList *pl = n->second->node.listPeers();
|
||||
if (pl) {
|
||||
for(unsigned int i=0;i<pl->numPeers;++i) {
|
||||
printf("%s %.10llx ",astr.c_str(),(unsigned long long)pl->peers[i].rawAddress);
|
||||
if (pl->peers[i].numPaths == 0)
|
||||
printf("-");
|
||||
else {
|
||||
for(unsigned int j=0;j<pl->peers[i].numPaths;++j) {
|
||||
if (j > 0)
|
||||
printf(",");
|
||||
switch(pl->peers[i].paths[j].type) {
|
||||
default:
|
||||
printf("unknown;");
|
||||
break;
|
||||
case ZT1_Node_PhysicalPath_TYPE_UDP:
|
||||
printf("udp;");
|
||||
break;
|
||||
case ZT1_Node_PhysicalPath_TYPE_TCP_OUT:
|
||||
printf("tcp_out;");
|
||||
break;
|
||||
case ZT1_Node_PhysicalPath_TYPE_TCP_IN:
|
||||
printf("tcp_in;");
|
||||
break;
|
||||
case ZT1_Node_PhysicalPath_TYPE_ETHERNET:
|
||||
printf("eth;");
|
||||
break;
|
||||
}
|
||||
printf("%s/%d;%ld;%ld;%ld;%s",
|
||||
pl->peers[i].paths[j].address.ascii,
|
||||
(int)pl->peers[i].paths[j].address.port,
|
||||
pl->peers[i].paths[j].lastSend,
|
||||
pl->peers[i].paths[j].lastReceive,
|
||||
pl->peers[i].paths[j].lastPing,
|
||||
(pl->peers[i].paths[j].fixed ? "fixed" : (pl->peers[i].paths[j].active ? "active" : "inactive")));
|
||||
}
|
||||
}
|
||||
const char *rolestr;
|
||||
switch(pl->peers[i].role) {
|
||||
case ZT1_Node_Peer_SUPERNODE: rolestr = "SUPERNODE"; break;
|
||||
case ZT1_Node_Peer_HUB: rolestr = "HUB"; break;
|
||||
case ZT1_Node_Peer_NODE: rolestr = "NODE"; break;
|
||||
default: rolestr = "?"; break;
|
||||
}
|
||||
printf(" %u %s %s"ZT_EOL_S,
|
||||
pl->peers[i].latency,
|
||||
((pl->peers[i].remoteVersion[0]) ? pl->peers[i].remoteVersion : "-"),
|
||||
rolestr);
|
||||
}
|
||||
n->second->node.freeQueryResult(pl);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void doAllToAll(const std::vector<std::string> &cmd)
|
||||
|
Loading…
x
Reference in New Issue
Block a user