service_maintain.cpp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #include "service_maintain.h"
  2. #include <iostream>
  3. #include <QFile>
  4. service_maintain::service_maintain(iv::service_maintain_param & param)
  5. {
  6. mparam = param;
  7. mnBroadPort = std::atoi(mparam.mstrbroadport.data());
  8. mpServer = new QUdpSocket(this);
  9. mpServer->bind(QHostAddress::Any,std::atoi(mparam.mstrlistenport.data()));
  10. mpBroad = new QUdpSocket(this);
  11. connect(mpServer,SIGNAL(readyRead()),this,SLOT(onRecvData()));
  12. // StartService();
  13. }
  14. void service_maintain::onRecvData()
  15. {
  16. while(mpServer->hasPendingDatagrams())
  17. {
  18. QByteArray ba;
  19. ba.resize(mpServer->bytesAvailable());
  20. QHostAddress host;
  21. quint16 port;
  22. mpServer->readDatagram(ba.data(),ba.size(),&host,&port);
  23. std::cout<<" recevive data from "<<host.toString().toLatin1().data()<<":"<<port<<" data size: "<<ba.size()<<std::endl;
  24. ProcessData(ba);
  25. }
  26. }
  27. int service_maintain::generateRandomNumber()
  28. {
  29. qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
  30. int nrtn = qrand()%1000;
  31. std::cout<<" rand value: "<<nrtn<<std::endl;
  32. return nrtn;
  33. }
  34. void service_maintain::ProcessData(QByteArray & ba)
  35. {
  36. if(ba.size()<sizeof(int))
  37. {
  38. std::cout<<"require data is error."<<std::endl;
  39. return;
  40. }
  41. int nreq; //0 stop 1 start 2 query
  42. memcpy(&nreq,ba.data(),sizeof(int));
  43. if(nreq == 0)
  44. {
  45. StopService();
  46. }
  47. else
  48. {
  49. if(nreq == 1)
  50. {
  51. StartService();
  52. }
  53. else
  54. {
  55. if(nreq == 2)
  56. {
  57. BroadStatus();
  58. }
  59. else
  60. {
  61. std::cout<<" require code is: "<<nreq<<" Error require."<<std::endl;
  62. }
  63. }
  64. }
  65. }
  66. void service_maintain::StartService()
  67. {
  68. if(mnServcieStatus == 1)
  69. {
  70. std::cout<<" Service is Opening. "<<std::endl;
  71. BroadStatus();
  72. return;
  73. }
  74. if(mnServcieStatus == 2)
  75. {
  76. std::cout<<" Service is work."<<std::endl;
  77. BroadStatus();
  78. return;
  79. }
  80. int nport = generateRandomNumber();
  81. nport = nport + 14000;
  82. mnServiceCode = nport;
  83. std::string strfrpc = mparam.mstrfrpcfolder + "/frpc";
  84. QFileInfo xFileInfo(strfrpc.data());
  85. if(xFileInfo.exists() == false)
  86. {
  87. mnServiceCode = -1;
  88. mstrError = "No frpc program.";
  89. mnServcieStatus = 0;
  90. std::cout<<"No frpc program."<<std::endl;
  91. BroadStatus();
  92. return;
  93. }
  94. if(xFileInfo.isExecutable() == false)
  95. {
  96. mnServiceCode = -1;
  97. mstrError = "frpc program is not executable.";
  98. mnServcieStatus = 0;
  99. std::cout<<"frpc program is not executable."<<std::endl;
  100. BroadStatus();
  101. return;
  102. }
  103. CreateIniFile();
  104. if(mnServiceCode > 0)
  105. {
  106. mnServcieStatus = 1;
  107. mpfrpProcess = new QProcess(this);
  108. connect(mpfrpProcess,SIGNAL(started()),this,SLOT(onProcessStarted()));
  109. connect(mpfrpProcess,SIGNAL(finished(int)),this,SLOT(onProcessEnd()));
  110. connect(mpfrpProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(onReadStandardOutput()));
  111. connect(mpfrpProcess,SIGNAL(readyReadStandardError()),this,SLOT(onReadStandardError()));
  112. // connect(mpfrpProcess,SIGNAL(error(QProcess::ProcessError)),this,SLOT(onProcessErrorStarted(QProcess::ProcessError)));
  113. char strcmd[1000];
  114. snprintf(strcmd,1000,"%s/frpc -c %s",mparam.mstrfrpcfolder.data(), mstrIniFile.data());
  115. std::cout<<" cmd: "<<strcmd<<std::endl;
  116. mpfrpProcess->start(strcmd);
  117. }
  118. }
  119. std::string service_maintain::CreateIniFile()
  120. {
  121. std::string strfilepath = mparam.mstrfrpcfolder + "/frpc" + QString::number(std::chrono::system_clock::now().time_since_epoch().count() ).toStdString() + ".ini";
  122. mstrIniFile = strfilepath;
  123. QFile xFile;
  124. xFile.setFileName(strfilepath.data());
  125. if(!xFile.open(QIODevice::ReadWrite))
  126. {
  127. mnServiceCode = -1;
  128. mnServcieStatus = 0;
  129. mstrError = "Can't Create ini file.";
  130. std::cout<<"Can't Create ini file."<<std::endl;
  131. return mstrIniFile;
  132. }
  133. char strline[1000];
  134. snprintf(strline,1000,"[common]\n");xFile.write(strline,strnlen(strline,1000));
  135. snprintf(strline,1000,"server_addr = %s\n",mparam.mstrserverip.data());xFile.write(strline,strnlen(strline,1000));
  136. snprintf(strline,1000,"server_port = %s\n",mparam.mstrserverport.data());xFile.write(strline,strnlen(strline,1000));
  137. snprintf(strline,1000,"token = %s\n",mparam.mstrtoken.data());xFile.write(strline,strnlen(strline,1000));
  138. snprintf(strline,1000,"\n");xFile.write(strline,strnlen(strline,1000));
  139. // snprintf(strline,1000,"[nomachine_tcp]\n",mnServiceCode);xFile.write(strline,strnlen(strline,1000));
  140. snprintf(strline,1000,"[nomachine_tcp_%d]\n",mnServiceCode);xFile.write(strline,strnlen(strline,1000));
  141. snprintf(strline,1000,"type = tcp\n");xFile.write(strline,strnlen(strline,1000));
  142. snprintf(strline,1000,"local_ip = 127.0.0.1\n");xFile.write(strline,strnlen(strline,1000));
  143. snprintf(strline,1000,"local_port = %s\n",mparam.mstrnomachineport.data());xFile.write(strline,strnlen(strline,1000));
  144. snprintf(strline,1000,"remote_port = %d\n",mnServiceCode);xFile.write(strline,strnlen(strline,1000));
  145. // snprintf(strline,1000,"remote_port = %d\n",14000);xFile.write(strline,strnlen(strline,1000));
  146. xFile.close();
  147. return mstrIniFile;
  148. }
  149. void service_maintain::onProcessStarted()
  150. {
  151. std::cout<<" Started. "<<std::endl;
  152. }
  153. void service_maintain::onProcessEnd()
  154. {
  155. // QProcess * proc = (QProcess *)sender();
  156. }
  157. void service_maintain::onChRead()
  158. {
  159. }
  160. void service_maintain::onReadStandardOutput()
  161. {
  162. QProcess * proc = (QProcess *)sender();
  163. QByteArray ba = proc->readAllStandardOutput();
  164. std::cout<<"Std Out:"<<std::endl;
  165. std::cout<<ba.data()<<std::endl;
  166. QString str(ba);
  167. if(str.contains("i/o timeout"))
  168. {
  169. mnServiceCode = -2;
  170. mstrError = "Can't Connect Server.Please Check Network";
  171. mnServcieStatus = 0;
  172. std::cout<<"Can't Connect Server.Please Check Network."<<std::endl;
  173. BroadStatus();//Send Status Code.
  174. }
  175. if(str.contains("connect: connection refused"))
  176. {
  177. mnServiceCode = -3;
  178. mstrError = "Connect Server Fail.Please Check xml, Maybe server port not correct. ";
  179. mnServcieStatus = 0;
  180. std::cout<<"Connect Server Fail.Please Check xml, Maybe server port not correct. "<<std::endl;
  181. BroadStatus();//Send Status Code.
  182. }
  183. if(str.contains("token in login doesn't match token from configuration"))
  184. {
  185. mnServiceCode = -4;
  186. mstrError = "token error.Please Check xml, Maybe token not correct. ";
  187. mnServcieStatus = 0;
  188. std::cout<<"token error.Please Check xml, Maybe token not correct. "<<std::endl;
  189. BroadStatus();//Send Status Code.
  190. }
  191. if(str.contains("start error: port already used"))
  192. {
  193. mnServiceCode = -5;
  194. mstrError = "port already used.Please re start. ";
  195. mnServcieStatus = 0;
  196. std::cout<<"port already used.Please re start. "<<std::endl;
  197. BroadStatus();//Send Status Code.
  198. }
  199. if(str.contains("] is already in use"))
  200. {
  201. mnServiceCode = -6;
  202. mstrError = "Service Name already used.Please re start. ";
  203. mnServcieStatus = 0;
  204. std::cout<<"Service Name already used.Please re start. "<<std::endl;
  205. BroadStatus();//Send Status Code.
  206. }
  207. if(str.contains("start proxy success"))
  208. {
  209. mstrError = "Success.";
  210. mnServcieStatus = 2;
  211. std::cout<<" Success."<<std::endl;
  212. BroadStatus();
  213. }
  214. }
  215. void service_maintain::onReadStandardError()
  216. {
  217. QProcess * proc = (QProcess *)sender();
  218. QByteArray ba = proc->readAllStandardError();
  219. std::cout<<"Error Out:"<<std::endl;
  220. std::cout<<ba.data()<<std::endl;
  221. }
  222. void service_maintain::StopService()
  223. {
  224. if(mnServcieStatus == 0)
  225. {
  226. std::cout<<" Service is closed."<<std::endl;
  227. mnServiceCode = 0;
  228. BroadStatus();//Broad
  229. //Not Need Stop
  230. return;
  231. }
  232. if(mnServcieStatus == 1 )
  233. {
  234. mnServiceCode = 0;
  235. mnServcieStatus = 0;
  236. BroadStatus();
  237. return;
  238. }
  239. std::cout<<" End frp program."<<std::endl;
  240. mpfrpProcess->kill();
  241. mnServcieStatus = 0;
  242. mnServiceCode = 0;
  243. BroadStatus();
  244. //Broad Status
  245. }
  246. void service_maintain::BroadStatus()
  247. {
  248. char strout[1000];
  249. int nsize = 2*sizeof(int);
  250. memcpy(strout,&mnServiceCode,sizeof(int));
  251. memcpy(strout+sizeof(int),&mnServcieStatus,sizeof(int));
  252. if(mnServcieStatus == 0)
  253. {
  254. if(mnServiceCode<0)
  255. {
  256. memcpy(strout+2*sizeof(int),mstrError.data(),mstrError.length());
  257. nsize = nsize + mstrError.length();
  258. }
  259. }
  260. mpBroad->writeDatagram(strout,nsize,QHostAddress::Broadcast,mnBroadPort);
  261. // mpBroad->writeDatagram(strout,nsize,QHostAddress("10.16.1.239"),mnBroadPort);
  262. //Broad Data;
  263. }