void RunAgentServer(unsigned port) { logfile("agent start %u\r\n",port); IHRPCtransport *transport = TryMakeServerTransport(port, "Cannot start NewAgent"); if (!transport) return; HRPCserver server(transport); serverp=&server; newagent stub; server.AttachStub(&stub); ListenUntilDead(server,"NewAgent terminated"); serverp=0; transport->Release(); }
void cmd_dispatch::action() { // printf("%s\n",name); char x[100]; sprintf(x,"elapsed time : %s",name); // elapsed_time_trace t(x); IHRPCtransport * transport = MakeTcpTransportFromUrl(name, HOAGENT_PORT); hoagent agent; agent.UseTransport(transport); transport->SetConnectTimeout(calltimeout?(calltimeout*1000):(num_threads==1?600:0)); transport->SetTimeout(calltimeout?calltimeout:3); StringBuffer result; result.append(name).appendf("(%d) ",node_number); if (stricmp(argv[2], "alive") == 0) result.append(agent.alive(atoi(argv[3]))); else if (stricmp(argv[2], "start") == 0) { StringBuffer cmdbuf; for (char *cp=argv[3]; *cp; cp++) { if (*cp == '%' && *(cp+1)) { cp++; switch (*cp) { case 'n': // Node number cmdbuf.append(node_number); break; case 'a': // Node address cmdbuf.append(name); break; case 'l': // Node list cmdbuf.append(argv[1]); break; case 'x': // Next Node if(next != NULL) cmdbuf.append(next); break; default: // treat as literal (?) cmdbuf.append('%').append(*cp); break; } } else cmdbuf.append(*cp); } result.append(agent.start_process(cmdbuf.str())); } else if (stricmp(argv[2], "stop") == 0) result.append(agent.stop_process(atoi(argv[3]))); else if (stricmp(argv[2], "account") == 0) { transport->SetTimeout(calltimeout?calltimeout:15); int cd=25; bool success=false; while (cd&&!success) { char * u=unscr(strdup(argv[3])); StringBuffer pw; if (encrypted) decrypt(pw, argv[4]); else pw.append(argv[4]); char *p = unscr(pw.detach()); if (cd>1) { try { agent.account(u, p, argv[5]); if (agent.start_process(statcmd) ) success=true; } catch (...) { } if (!success) { srand(GetCurrentThreadId()+clock()); MilliSleep((rand() * 3000) / RAND_MAX); } } else { agent.account(u, p, argv[5]); if (agent.start_process(statcmd) ) success=true; } cd--; } if (!success) result.append(" failed"); else result.appendf(" ok (retries=%i)",24-cd); } else if (stricmp(argv[2], "dir") == 0) { transport->SetTimeout(15); agent.set_dir(argv[3]); } if (result.length()) { printf("%s\n", result.toCharArray()); } transport->Release(); }