123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- #include "service_maintain.h"
- #include <iostream>
- #include <QFile>
- service_maintain::service_maintain(iv::service_maintain_param & param)
- {
- mparam = param;
- mnBroadPort = std::atoi(mparam.mstrbroadport.data());
- mpServer = new QUdpSocket(this);
- mpServer->bind(QHostAddress::Any,std::atoi(mparam.mstrlistenport.data()));
- mpBroad = new QUdpSocket(this);
- connect(mpServer,SIGNAL(readyRead()),this,SLOT(onRecvData()));
- // StartService();
- }
- void service_maintain::onRecvData()
- {
- while(mpServer->hasPendingDatagrams())
- {
- QByteArray ba;
- ba.resize(mpServer->bytesAvailable());
- QHostAddress host;
- quint16 port;
- mpServer->readDatagram(ba.data(),ba.size(),&host,&port);
- std::cout<<" recevive data from "<<host.toString().toLatin1().data()<<":"<<port<<" data size: "<<ba.size()<<std::endl;
- ProcessData(ba);
- }
- }
- int service_maintain::generateRandomNumber()
- {
- qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
- int nrtn = qrand()%1000;
- std::cout<<" rand value: "<<nrtn<<std::endl;
- return nrtn;
- }
- void service_maintain::ProcessData(QByteArray & ba)
- {
- if(ba.size()<sizeof(int))
- {
- std::cout<<"require data is error."<<std::endl;
- return;
- }
- int nreq; //0 stop 1 start 2 query
- memcpy(&nreq,ba.data(),sizeof(int));
- if(nreq == 0)
- {
- StopService();
- }
- else
- {
- if(nreq == 1)
- {
- StartService();
- }
- else
- {
- if(nreq == 2)
- {
- BroadStatus();
- }
- else
- {
- std::cout<<" require code is: "<<nreq<<" Error require."<<std::endl;
- }
- }
- }
- }
- void service_maintain::StartService()
- {
- if(mnServcieStatus == 1)
- {
- std::cout<<" Service is Opening. "<<std::endl;
- BroadStatus();
- return;
- }
- if(mnServcieStatus == 2)
- {
- std::cout<<" Service is work."<<std::endl;
- BroadStatus();
- return;
- }
- int nport = generateRandomNumber();
- nport = nport + 14000;
- mnServiceCode = nport;
- std::string strfrpc = mparam.mstrfrpcfolder + "/frpc";
- QFileInfo xFileInfo(strfrpc.data());
- if(xFileInfo.exists() == false)
- {
- mnServiceCode = -1;
- mstrError = "No frpc program.";
- mnServcieStatus = 0;
- std::cout<<"No frpc program."<<std::endl;
- BroadStatus();
- return;
- }
- if(xFileInfo.isExecutable() == false)
- {
- mnServiceCode = -1;
- mstrError = "frpc program is not executable.";
- mnServcieStatus = 0;
- std::cout<<"frpc program is not executable."<<std::endl;
- BroadStatus();
- return;
- }
- CreateIniFile();
- if(mnServiceCode > 0)
- {
- mnServcieStatus = 1;
- mpfrpProcess = new QProcess(this);
- connect(mpfrpProcess,SIGNAL(started()),this,SLOT(onProcessStarted()));
- connect(mpfrpProcess,SIGNAL(finished(int)),this,SLOT(onProcessEnd()));
- connect(mpfrpProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(onReadStandardOutput()));
- connect(mpfrpProcess,SIGNAL(readyReadStandardError()),this,SLOT(onReadStandardError()));
- // connect(mpfrpProcess,SIGNAL(error(QProcess::ProcessError)),this,SLOT(onProcessErrorStarted(QProcess::ProcessError)));
- char strcmd[1000];
- snprintf(strcmd,1000,"%s/frpc -c %s",mparam.mstrfrpcfolder.data(), mstrIniFile.data());
- std::cout<<" cmd: "<<strcmd<<std::endl;
- mpfrpProcess->start(strcmd);
- }
- }
- std::string service_maintain::CreateIniFile()
- {
- std::string strfilepath = mparam.mstrfrpcfolder + "/frpc" + QString::number(std::chrono::system_clock::now().time_since_epoch().count() ).toStdString() + ".ini";
- mstrIniFile = strfilepath;
- QFile xFile;
- xFile.setFileName(strfilepath.data());
- if(!xFile.open(QIODevice::ReadWrite))
- {
- mnServiceCode = -1;
- mnServcieStatus = 0;
- mstrError = "Can't Create ini file.";
- std::cout<<"Can't Create ini file."<<std::endl;
- return mstrIniFile;
- }
- char strline[1000];
- snprintf(strline,1000,"[common]\n");xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"server_addr = %s\n",mparam.mstrserverip.data());xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"server_port = %s\n",mparam.mstrserverport.data());xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"token = %s\n",mparam.mstrtoken.data());xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"\n");xFile.write(strline,strnlen(strline,1000));
- // snprintf(strline,1000,"[nomachine_tcp]\n",mnServiceCode);xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"[nomachine_tcp_%d]\n",mnServiceCode);xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"type = tcp\n");xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"local_ip = 127.0.0.1\n");xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"local_port = %s\n",mparam.mstrnomachineport.data());xFile.write(strline,strnlen(strline,1000));
- snprintf(strline,1000,"remote_port = %d\n",mnServiceCode);xFile.write(strline,strnlen(strline,1000));
- // snprintf(strline,1000,"remote_port = %d\n",14000);xFile.write(strline,strnlen(strline,1000));
- xFile.close();
- return mstrIniFile;
- }
- void service_maintain::onProcessStarted()
- {
- std::cout<<" Started. "<<std::endl;
- }
- void service_maintain::onProcessEnd()
- {
- // QProcess * proc = (QProcess *)sender();
- }
- void service_maintain::onChRead()
- {
- }
- void service_maintain::onReadStandardOutput()
- {
- QProcess * proc = (QProcess *)sender();
- QByteArray ba = proc->readAllStandardOutput();
- std::cout<<"Std Out:"<<std::endl;
- std::cout<<ba.data()<<std::endl;
- QString str(ba);
- if(str.contains("i/o timeout"))
- {
- mnServiceCode = -2;
- mstrError = "Can't Connect Server.Please Check Network";
- mnServcieStatus = 0;
- std::cout<<"Can't Connect Server.Please Check Network."<<std::endl;
- BroadStatus();//Send Status Code.
- }
- if(str.contains("connect: connection refused"))
- {
- mnServiceCode = -3;
- mstrError = "Connect Server Fail.Please Check xml, Maybe server port not correct. ";
- mnServcieStatus = 0;
- std::cout<<"Connect Server Fail.Please Check xml, Maybe server port not correct. "<<std::endl;
- BroadStatus();//Send Status Code.
- }
- if(str.contains("token in login doesn't match token from configuration"))
- {
- mnServiceCode = -4;
- mstrError = "token error.Please Check xml, Maybe token not correct. ";
- mnServcieStatus = 0;
- std::cout<<"token error.Please Check xml, Maybe token not correct. "<<std::endl;
- BroadStatus();//Send Status Code.
- }
- if(str.contains("start error: port already used"))
- {
- mnServiceCode = -5;
- mstrError = "port already used.Please re start. ";
- mnServcieStatus = 0;
- std::cout<<"port already used.Please re start. "<<std::endl;
- BroadStatus();//Send Status Code.
- }
- if(str.contains("] is already in use"))
- {
- mnServiceCode = -6;
- mstrError = "Service Name already used.Please re start. ";
- mnServcieStatus = 0;
- std::cout<<"Service Name already used.Please re start. "<<std::endl;
- BroadStatus();//Send Status Code.
- }
- if(str.contains("start proxy success"))
- {
- mstrError = "Success.";
- mnServcieStatus = 2;
- std::cout<<" Success."<<std::endl;
- BroadStatus();
- }
- }
- void service_maintain::onReadStandardError()
- {
- QProcess * proc = (QProcess *)sender();
- QByteArray ba = proc->readAllStandardError();
- std::cout<<"Error Out:"<<std::endl;
- std::cout<<ba.data()<<std::endl;
- }
- void service_maintain::StopService()
- {
- if(mnServcieStatus == 0)
- {
- std::cout<<" Service is closed."<<std::endl;
- mnServiceCode = 0;
- BroadStatus();//Broad
- //Not Need Stop
- return;
- }
- if(mnServcieStatus == 1 )
- {
- mnServiceCode = 0;
- mnServcieStatus = 0;
- BroadStatus();
- return;
- }
- std::cout<<" End frp program."<<std::endl;
- mpfrpProcess->kill();
- mnServcieStatus = 0;
- mnServiceCode = 0;
- BroadStatus();
- //Broad Status
- }
- void service_maintain::BroadStatus()
- {
- char strout[1000];
- int nsize = 2*sizeof(int);
- memcpy(strout,&mnServiceCode,sizeof(int));
- memcpy(strout+sizeof(int),&mnServcieStatus,sizeof(int));
- if(mnServcieStatus == 0)
- {
- if(mnServiceCode<0)
- {
- memcpy(strout+2*sizeof(int),mstrError.data(),mstrError.length());
- nsize = nsize + mstrError.length();
- }
- }
- mpBroad->writeDatagram(strout,nsize,QHostAddress::Broadcast,mnBroadPort);
- // mpBroad->writeDatagram(strout,nsize,QHostAddress("10.16.1.239"),mnBroadPort);
- //Broad Data;
- }
|