|
|
|
|
@ -114,9 +114,10 @@ static void printHelp(FILE *out,const char *cn)
|
|
|
|
|
static void _CBresultHandler(void *arg,const char *line) |
|
|
|
|
{ |
|
|
|
|
if (line) { |
|
|
|
|
if ((line[0] == '.')&&(line[1] == (char)0)) |
|
|
|
|
if ((line[0] == '.')&&(line[1] == (char)0)) { |
|
|
|
|
fflush(stdout); |
|
|
|
|
*((bool *)arg) = true; |
|
|
|
|
else fprintf(stdout,"%s"ZT_EOL_S,line); |
|
|
|
|
} else fprintf(stdout,"%s"ZT_EOL_S,line); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -153,19 +154,43 @@ static int main(const char *homeDir,int argc,char **argv)
|
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!homeDir) |
|
|
|
|
homeDir = ZT_DEFAULTS.defaultHomePath.c_str(); |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
std::string buf; |
|
|
|
|
if (!Utils::readFile((std::string(homeDir) + ZT_PATH_SEPARATOR_S + "identity.public").c_str(),buf)) { |
|
|
|
|
fprintf(stderr,"%s: fatal error: unable to read node address from identity.public in home path"ZT_EOL_S,argv[0]); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
Identity id; |
|
|
|
|
if (!id.fromString(buf)) { |
|
|
|
|
fprintf(stderr,"%s: fatal error: unable to read node address from identity.public in home path"ZT_EOL_S,argv[0]); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::string authToken(NodeControlClient::getAuthToken((std::string(homeDir) + ZT_PATH_SEPARATOR_S + "authtoken.secret").c_str(),false)); |
|
|
|
|
if (!authToken.length()) |
|
|
|
|
authToken = NodeControlClient::getAuthToken(NodeControlClient::authTokenDefaultUserPath(),false); |
|
|
|
|
if (!authToken.length()) { |
|
|
|
|
fprintf(stderr,"%s: fatal error: unable to read authentication token from home path or user home"ZT_EOL_S,argv[0]); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
volatile bool done = false; |
|
|
|
|
NodeControlClient client(homeDir,&_CBresultHandler,(void *)&done); |
|
|
|
|
NodeControlClient client((std::string(ZT_IPC_ENDPOINT_BASE) + id.address().toString()).c_str(),authToken.c_str(),&_CBresultHandler,(void *)&done); |
|
|
|
|
const char *err = client.error(); |
|
|
|
|
if (err) { |
|
|
|
|
fprintf(stderr,"%s: fatal error: unable to connect (is ZeroTier One running?) (%s)"ZT_EOL_S,argv[0],err); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
client.send(query.c_str()); |
|
|
|
|
while (!done) |
|
|
|
|
Thread::sleep(100); // ghetto
|
|
|
|
|
while (!done) Thread::sleep(100); // dis be ghetto
|
|
|
|
|
} catch (std::exception &exc) { |
|
|
|
|
fprintf(stderr,"%s: fatal error: unable to connect (is ZeroTier One running?) (%s)"ZT_EOL_S,argv[0],exc.what()); |
|
|
|
|
return 1; |
|
|
|
|
} catch ( ... ) { |
|
|
|
|
fprintf(stderr,"%s: fatal error: unable to connect (is ZeroTier One running?)"ZT_EOL_S,argv[0]); |
|
|
|
|
fprintf(stderr,"%s: fatal error: unable to connect (is ZeroTier One running?) (unknown exception)"ZT_EOL_S,argv[0]); |
|
|
|
|
return 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -758,12 +783,19 @@ int main(int argc,char **argv)
|
|
|
|
|
bool needsReset = false; |
|
|
|
|
EthernetTapFactory *tapFactory = (EthernetTapFactory *)0; |
|
|
|
|
RoutingTable *routingTable = (RoutingTable *)0; |
|
|
|
|
NodeControlService *controlService = (NodeControlService *)0; |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
// Get or create authtoken.secret -- note that if this fails, authentication
|
|
|
|
|
// will always fail since an empty auth token won't work. This should always
|
|
|
|
|
// succeed unless something is wrong with the filesystem.
|
|
|
|
|
std::string authToken(NodeControlClient::getAuthToken((std::string(homeDir) + ZT_PATH_SEPARATOR_S + "authtoken.secret").c_str(),true)); |
|
|
|
|
|
|
|
|
|
tapFactory = ZTCreatePlatformEthernetTapFactory; |
|
|
|
|
routingTable = ZTCreatePlatformRoutingTable; |
|
|
|
|
|
|
|
|
|
node = new Node(homeDir,tapFactory,routingTable,udpPort,tcpPort,needsReset); |
|
|
|
|
controlService = new NodeControlService(node,authToken.c_str()); |
|
|
|
|
|
|
|
|
|
switch(node->run()) { |
|
|
|
|
#ifdef __WINDOWS__ |
|
|
|
|
@ -807,9 +839,6 @@ int main(int argc,char **argv)
|
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
delete node; |
|
|
|
|
node = (Node *)0; |
|
|
|
|
} catch ( std::exception &exc ) { |
|
|
|
|
fprintf(stderr,"%s: unexpected exception: %s"ZT_EOL_S,argv[0],exc.what()); |
|
|
|
|
exitCode = 3; |
|
|
|
|
@ -818,6 +847,8 @@ int main(int argc,char **argv)
|
|
|
|
|
exitCode = 3; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
delete controlService; |
|
|
|
|
delete node; node = (Node *)0; |
|
|
|
|
delete routingTable; |
|
|
|
|
delete tapFactory; |
|
|
|
|
|
|
|
|
|
|