?? procguard.cpp
字號:
#include "ProcGuard.h"
/*
#include <sys/socket.h>
#include <sys/select.h>
#include <sys/ioctl.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <linux/fs.h>
#include <sys/stat.h>
typedef struct _ihdr
{
unsigned short int i_type, i_code;
unsigned short int i_cksum,i_id, i_seq;
}IcmpHeader;
struct sockaddr_in saDestAddr;
string Messtr,Tmpstr;
unsigned short int checksum(unsigned short int *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(unsigned short int);
}
if(size )
{
cksum += *(unsigned char*)buffer;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (unsigned short int)(cksum);
}
bool Autotest(unsigned char * szDestHost,int Ktest)
{
// WSADATA wsaData;
int sockRaw;
struct sockaddr_in dest,from;
char icmp_data[10], recvbuf[100];
unsigned int addr=0;
int fromlen = sizeof(from);
int timeout = 1000; //ms
// WSAStartup(MAKEWORD(2,1),&wsaData) ;
sockRaw = socket (AF_INET,SOCK_RAW,IPPROTO_ICMP);
setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,
(char*)&timeout,sizeof(timeout) );
memset(&dest,0,sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_addr.s_addr= inet_addr(szDestHost);
memset(icmp_data,0,sizeof(icmp_data)); //clear icmp_data.
((IcmpHeader*)icmp_data)->i_type = 8; //ICMP_ECHO
((IcmpHeader*)icmp_data)->i_code = 0;
((IcmpHeader*)icmp_data)->i_id = (unsigned short int)GetCurrentProcessId();
((IcmpHeader*)icmp_data)->i_seq = 0;
for(int k=0; k
{
((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->i_seq ++;
((IcmpHeader*)icmp_data)->i_cksum=checksum((unsigned short int*)icmp_data,8);
sendto(sockRaw,icmp_data,8,0,(struct sockaddr*)&dest,sizeof(dest));
int bread=recvfrom(sockRaw,recvbuf,1024,0,(struct sockaddr*)&from,
&fromlen);
if (bread == SOCKET_ERROR)
{
if(k==Ktest-1) goto ERR1 ;
else continue; //try again(3 times)
}
}
return TRUE; //no erros.
ERR1:
closesocket (sockRaw);
sockRaw= INVALID_SOCKET;
// WSACleanup();
return FALSE;
}
*/
//---------------------------------------------------------------------------
/*int ProcessWatch()
{
char szCmd[256];
FILE *fp;
char acTemp[1024];
int i,iPingSuccess=0;
system("top >/tmp/top.txt");
fp=fopen("/tmp/top.txt","r");
if(fp==NULL)
{
return -1;
}
fgets(acTemp,1024,fp);
for(i=0;i<iCount;i++)
{
fgets(acTemp,1024,fp);
// printf("acTemp=%s\n",acTemp);
if(strstr(acTemp,"time="))
{
iPingSuccess++;
*/
int CProcGuard::ProcessHealthWatch(ProcessHealthStatus *pstProcessHealth,int *iCount)
{
char acTemp[1024],acProcessName[128],acTempStr[256];
FILE *fp;
int i=0,iProcessId;
//int iCount=0;
float fCpu,fMem;
system("top -d 10 >/tmp/top.txt");
system("ps -x|grep top >/tmp/toplist.txt");
fp=fopen("/tmp/toplist.txt","r");
if(fp==NULL)
{
return -1;
}
while(fgets(acTemp,1024,fp))
{
sscanf(acTemp,"%d %s %s %s %s ",&iProcessId,acTempStr,acTempStr,acTempStr,acProcessName);
if(!strcmp(acProcessName,"top"))
{
KillProcess(iProcessId);
}
}
fclose(fp);
fp=fopen("/tmp/top.txt","r");
if(fp==NULL)
{
return -1;
}
fgets(acTemp,1024,fp);
fgets(acTemp,1024,fp);
fgets(acTemp,1024,fp);
fgets(acTemp,1024,fp);
while(fgets(acTemp,1024,fp))
{
sscanf(acTemp,"%d %s %s %s %s %f %f %s",iProcessId,acTempStr,acTempStr,acTempStr,acTempStr,fCpu,fMem,acProcessName);
if(fCpu>40.0 || fMem>40.0)
{
pstProcessHealth[*iCount].iProcessId = iProcessId;
strcpy(pstProcessHealth[*iCount].acProcessName , acProcessName);
pstProcessHealth[*iCount].fCpu = fCpu;
pstProcessHealth[*iCount].fMem = fMem;
*iCount ++;
printf("Process Status: %s\n",acTemp);
}
}
fclose(fp);
return 0;
}
int CProcGuard::ProcessWatch()
{
int iCountPre=0;
int iCountNext=0;
int i,j;
ProcessHealthStatus stProcessPrevious[10],stProcessNext[10];
ProcessHealthWatch(stProcessPrevious,&iCountPre);
sleep(3);//sleep then read process status again to compare
ProcessHealthWatch(stProcessNext,&iCountNext);
for(i=0;i<iCountPre;i++)
{
for(j=0;j<iCountNext;j++)
{
if(stProcessPrevious[i].iProcessId=stProcessNext[j].iProcessId)
{
KillProcess(stProcessNext[j].iProcessId);
}
}
}
return 0;
}
int CProcGuard::DialWatch()
{
char acTemp[1024],acTempStr[128],acProcessName[128];
FILE * fp;
int i=0;
printf("Testing whether ppp-on is running\n");
system("ps -x|grep ppp-on >/tmp/ppp.txt");
fp= fopen("/tmp/ppp.txt","r");
if(fp==NULL)
{
return -1;
}
while(fgets(acTemp,1024,fp))
{
printf("%s\n",acTemp);
sscanf(acTemp,"%s %s %s %s %s ",acTempStr,acTempStr,acTempStr,acTempStr,acProcessName);
if(!strcmp(acProcessName,"ppp-on"))
break;
else
i++;
}
if(i==0)
{
system("/etc/ppp/ppp-off");
printf("exec ppp-off\n");
system("/etc/ppp/ppp-on");
printf("exec ppp-on\n");
}
return 0;
}
int CProcGuard::LinkTest(char *szLinkString,int iCount)
{
char szCmd[256];
FILE *fp;
char acTemp[1024];
int i,iPingSuccess=0;
if(iCount<1 || iCount > 10)
{
return -1;
}
sprintf(szCmd,"ping -c ");
sprintf(szCmd+8,"%d ",iCount);
strcat(szCmd,szLinkString);
strcat(szCmd," >/tmp/ping.txt");
printf("szCmd=%s\n",szCmd);
system(szCmd);
//sleep(iCount+5);//waiting for ping exec
fp=fopen("/tmp/ping.txt","r");
if(fp==NULL)
{
return -1;
}
fgets(acTemp,1024,fp);
for(i=0;i<iCount;i++)
{
fgets(acTemp,1024,fp);
printf("Ping: %s\n",acTemp);
if(strstr(acTemp,"time="))
{
iPingSuccess++;
}
}
fclose(fp);
return iPingSuccess;
}
int CProcGuard::IsNetActive()
{
printf("Enter IsNetActive...\n");
if((LinkTest(m_strLinkTest1,5) > 0) || (LinkTest(m_strLinkTest2,5) > 0))
{
return 1;
}
else
{
printf("Network disconnected!\n");
return 0;
}
}
int CProcGuard::KillProcess(int iProcessId)
{
char acTemp[128];
strcpy(acTemp,"kill -9 ");
sprintf(acTemp+8,"%d",iProcessId);
system(acTemp);
printf("Kill Process: %d\n",iProcessId);
return 0;
}
string getFileName(string str)
{
int len = str.length();
int pos = str.rfind('/',len -1);
string tstr;
if( pos >= 0 )
{
pos ++;
while( str[pos] != '\0' )
tstr+=str[pos++];
}
else
tstr = str;
return tstr;
}
string getFilePath(string str)
{
int len = str.length();
int pos = str.rfind('/',len -1);
string tstr;
if( pos >= 0 )
{
str[pos] = '\0';
tstr = str;
}
else
tstr = "./";
return tstr;
}
CProcGuard::CProcGuard()
{
printf("CProcGuard:begin load cfg file\n");
m_strTmpfName = "./tmp.tmp";
if( loadConfig() == false )
exit(0);
}
bool CProcGuard::loadConfig()
{
printf("Load procGuard configre file\n");
CIniFile cfgFile;
if( cfgFile.Open(CFGFILE) )
{
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("DELAY");
cfgFile.ReadInt(m_nDelaytm);
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("PROCNUM");
cfgFile.ReadInt(m_nProcess);
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("LINKTYPE");
cfgFile.ReadString(m_strLinkType);
if(!strcmp(m_strLinkType,"CDMA"))
m_nLinkType = 1;
else if(!strcmp(m_strLinkType,"GPRS"))
m_nLinkType = 1;
else if(!strcmp(m_strLinkType,"ADSL"))
m_nLinkType = 2;
else if(!strcmp(m_strLinkType,"ETHERNET"))
m_nLinkType = 3;
else m_nLinkType = 4;
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("LINKTEST1");
cfgFile.ReadString(m_strLinkTest1);
cfgFile.LocateHeading("TOTAL");
cfgFile.LocateKey("LINKTEST2");
cfgFile.ReadString(m_strLinkTest2);
printf("m_strLinkTest1 = %s\n",m_strLinkTest1);
printf("m_strLinkTest2 = %s\n",m_strLinkTest2);
for(int i=0;i<m_nProcess;i++)
{
string strProc;
cfgFile.LocateHeading("PROCESS");
char szKey[8]={0};
sprintf(szKey,"PROC%d",i+1);
cfgFile.LocateKey(szKey);
cfgFile.ReadString(strProc);
//. this->AddProc(strProc);
}
cfgFile.Close();
}
else
{
printf("Configure file loaded failed!\n");
return false;
}
return true;
}
bool CProcGuard::AddProc(string str)
{
tagProcInfo *pProc = new tagProcInfo;
if( pProc == NULL )
return false;
pProc->strNam = getFileName(str);
pProc->strPath = getFilePath(str);
pProc->bRuning = false;
// m_lstProc.push_back(pProc);
m_arrProc.push_back(pProc);
return true;
}
bool CProcGuard::IsProcRuning(tagProcInfo *pProc)
{
#ifdef _WIN32
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //獲得某一時刻系統的進程的快照信息
PROCESSENTRY32 procInfo;
procInfo.dwSize=sizeof(PROCESSENTRY32);
BOOL bMore = Process32First(hSnapshot,&procInfo); //獲得系統進程鏈表中第一個進程的信息
for(int i=0;bMore;i++)
{
char procNam[128];
memcpy(procNam,procInfo.szExeFile,sizeof(procInfo.szExeFile));
if( strcmp(procNam,pProc->strNam) == 0 )
return true;
//獲得下一進程
bMore=Process32Next(hSnapshot,&procInfo);
}
return false;
#else
char szCmd[128];
memset(szCmd,0,sizeof(szCmd));
sprintf(szCmd,"ps -ef | grep ");
sprintf(szCmd+14,"%s | awk '{print $8}' > ",pProc->strNam.c_str());
sprintf(szCmd+14+pProc->strNam.length()+22,"%s ",m_strTmpfName.c_str());
system(szCmd);
FILE *fp = fopen(m_strTmpfName.c_str(),"rt");
if( fp == NULL )
{
cout<<"."<<endl;
return true; // 算本次運行失敗,運行下次運行.
}
char par[128] ={0};
while ( fgets(par,128,fp) )
{
string tstr = par;
tstr = getFileName(tstr);
if( tstr == pProc->strNam )
{
fclose(fp);
return true;
}
}
fclose(fp);
return false;
#endif
/* // 生產 系統調用命令字符串
char szCmd[128];
memset(szCmd,0,sizeof(szCmd));
sprintf(szCmd+0,"C:/tlist -p ");
getFileName(str);
sprintf(szCmd+12,"%s",str.c_str(),str.length());
sprintf(szCmd+12+str.length()," > %s ",m_strTmpfName.c_str());
//如: "C:/tlist -p E:/telnet/QQ.exe > C:/tmp.tmp"
// 檢查 進程是否運行,并寫文件
if( system(szCmd) != 0 )
{
cout<<"system call failed! Anykey exit."<<endl;
getchar();
exit(-1);
}
// 讀取 生成的文件,查看進程狀態
Sleep(1000);
FILE *fp = fopen(m_strTmpfName.c_str(),"rt");
if( fp == NULL )
{
cout<<"."<<endl;
return true; // 算本次運行失敗,運行下次運行.
}
char par[8] ={0};
fgets(par,8,fp);
fclose(fp);
if(par[0] == '-')
return false;
else
return true;
*/
}
bool CProcGuard::StartupProc(tagProcInfo *pProc)
{
// 形成命令
char szCmd[128];
memset(szCmd,0,sizeof(szCmd));
sprintf(szCmd,"%s/%s ",pProc->strPath.c_str(),pProc->strNam.c_str());
#ifdef _WIN32
int ret = WinExec(szCmd,SW_SHOW);
if( ret < 31 )
{
cout<<str<<" startup failed"<<endl;
return false;
}
return true;
#else
// 執行命令
int ret = system(szCmd);
if( ret >= 0 )
return true;
else
return false;
#endif
}
void CProcGuard::Run()
{
while( 1 )
{
#ifdef _WIN32
Sleep(m_nDelaytm*1000);
#else
sleep(m_nDelaytm);
#endif
//printf("run....\n");
switch(m_nLinkType)
{
case 1:
if(!IsNetActive())
DialWatch();
break;
default: break;
}
for(int i=0;i<m_arrProc.size();i++)
{
tagProcInfo *pProc = (tagProcInfo *)m_arrProc[i];
if( IsProcRuning(pProc) == false )
{
if( StartupProc(pProc) == true )
pProc->bRuning = true;
}
}
}
}
CProcGuard::~CProcGuard()
{
char szCmd[128];
memset(szCmd,0,sizeof(szCmd));
sprintf(szCmd+0,"del ");
sprintf(szCmd+4,"%s",m_strTmpfName.c_str());
if( system(szCmd) != 0 )
cout<<"tmp file delete failed"<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -