Files
svc.ems/src/performanceMgr/c_program/cstaCollector/csta.c
2025-06-03 11:53:01 +08:00

1923 lines
48 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "csta.h"
/******************************************************/
/****** Heartbeat Parameter ******/
/******************************************************/
DWORD PROC_HEARTBEAT_OID[12]={1,3,6,1,4,1,1373,2,4,10,12};
int PROC_HEARTBEAT_OIDLEN=11;
unsigned long heartbeat_timeout=0;
int sendHeartbeat();
int getOmcSysNo(int* sysNo);
int getOmcStatus(int sysNo);
int omcSysNo=-1;
static char cstaproc_sqlstr[8192];
/*
return:
TIMETO_NONE
TIMETO_GET_CSTA
TIMETO_OUTPUT_FILE
TIMETO_CHANGE_LOG
*/
int checkTime();
/*
return:
0-95
*/
int getInstance();
/*
return:
-1:fail
0-95:success
*/
int getLastInstance(csta_src *pcsta,csta_sys *psys);
/*
return:
0:fail
1:success
*/
void csta_log(const char *fmt, ...);
int cstasrc_init();
void csta_receive();
void csta_request(csta_src *pcsta,csta_sys *psys);
void csta_analyze(snmp_pdu *pdu);
int csta_send(csta_src *pcsta,csta_sys *psys);
int csta_record(csta_src *pcsta,csta_sys *psys,snmp_pdu *pdu);
int csta_record_multi(csta_src *pcsta,csta_sys *psys);
int csta_create_csv();
int parse_map_table(csta_obj *pobj);
void getSystemIP();
void update_system();
BYTE str2oid(char *str, DWORD * array, BYTE max);
int parseLine(char *str, char (*row)[32], int maxrow);
/* Global variable */
int change_log_flag=1;
int output_file_flag=1;
int csta_flag[96];
FILE *logfp=NULL;
MYSQL *pCstaConn;
MYSQL *pubConn;
csta_src CstaSet[MAX_CSTA_SRC_NUM];
int csta_src_num=0;
int global_instance=0;
int csv_src_index=0;
char csv_sent_dir[128];
char csv_sending_dir[128];
int csv_send_flag=0;
// csta keep days setting, by simon begin ---
int max_keep_days = RECORD_KEEP_DAY;
// --- end
int csta_init()
{
csta_log("cstaCollector starting ...");
pCstaConn=mysql_conn("localhost",CSTA_DB);
if(pCstaConn == NULL)
{
csta_log("Connect to %s fail",CSTA_DB);
return 0;
}
pubConn=mysql_conn("localhost","OMC_PUB");
if(pubConn == NULL)
{
csta_log("Connect to OMC_PUB fail");
return 0;
}
getOmcSysNo(&omcSysNo);
if(omcSysNo<0 || omcSysNo >1)
printf("Fail to get the omcSysNo\n");
cstasrc_init();
return 1;
}
void csta_timer()
{
static int update_system_timeout=0;
csta_src *pcsta;
csta_sys *psys;
csta_obj *pobj;
int i,j;
int omcStatus;
if(time(NULL) - heartbeat_timeout > 5)
{
heartbeat_timeout=time(NULL);
sendHeartbeat();
}
omcStatus=getOmcStatus(omcSysNo);
//Master or single
if(omcStatus == 5 || omcStatus == 7)
{
if(update_system_timeout-- < 0)
{
update_system_timeout=UPDATE_SYSTEM_INTERVAL;
update_system();
if(mysql_ping(pCstaConn))
{
csta_log("[ERR 2006][csta_timer]:mysql CSTA_DB has gone away,reconnect");
mysql_close(pCstaConn);
pCstaConn=mysql_conn("localhost","CSTA_DB");
if(pCstaConn == NULL)
{
csta_log("[ERR][csta_timer]:reconnect CSTA_DB");
}
}
}
switch(checkTime())
{
case TIMETO_GET_CSTA:
for(i=0;i<csta_src_num;i++)
{
pcsta=&CstaSet[i];
for(j=0;j<pcsta->systemCount;j++)
{
if(pcsta->systems[j].system_state == STATE_NORMAL && pcsta->systems[j].msg_state != STATE_MSG_WAIT_RESPONSE)
{
pcsta->systems[j].msg_state=STATE_MSG_GET_REQUEST;
pcsta->systems[j].instance=getInstance();
pcsta->systems[j].objindex=0;
pcsta->systems[j].id1=pcsta->objects[0].id1_start;
pcsta->systems[j].id2=pcsta->objects[0].id2_start;
csta_log("sysTypeNo=%d,start to get instance=%d csta data!",pcsta->sysTypeNo,pcsta->systems[j].instance);
}
}
}
break;
case TIMETO_OUTPUT_FILE:
csv_src_index=0;
csta_log("It is time to create csv file");
break;
case TIMETO_CHANGE_LOG:
//cstalog_init();
break;
case TIMETO_NONE:
default:
break;
}
csta_create_csv();
csta_receive();
for(i=0;i<csta_src_num;i++)
{
pcsta=&CstaSet[i];
for(j=0;j<pcsta->systemCount;j++)
{
psys=&pcsta->systems[j];
switch(psys->msg_state)
{
case STATE_MSG_GET_REQUEST:
csta_request(pcsta,psys);
break;
case STATE_MSG_WAIT_RESPONSE:
//The csta_analyze function will change the state to STATE_MSG_GET_REQUEST
psys->fail++;
if(psys->fail > 50*10)
{
psys->fail=0;
psys->retry++;
psys->instance=psys->pre_instance;
psys->objindex=psys->pre_objindex;
psys->id1=psys->pre_id1;
psys->id2=psys->pre_id2;
psys->msg_state=STATE_MSG_GET_REQUEST;
#if CSTA_DEBUG
csta_log("Get response timeout,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d,retry=%d",pcsta->sysTypeNo,psys->instance,psys->objindex,psys->id1,psys->id2,psys->retry);
#endif
}
if(psys->retry > 2)
{
#if CSTA_DEBUG
csta_log("Get response timeout and retry %d time, ignore it",psys->retry);
#endif
psys->retry=0;
if(psys->system_state == STATE_CHASE)
{
psys->msg_state=STATE_MSG_GET_REQUEST;
pobj=&pcsta->objects[psys->objindex];
if(pobj->csta_type == 0)
{
psys->objindex++;
if(psys->objindex == pcsta->objectCount)
{
psys->objindex=0;
psys->instance++;
psys->instance%=96;
}
}
else if(pobj->csta_type == 1)
{
psys->id1++;
if(psys->id1 == pobj->id1_end)
{
psys->id1=0;
psys->objindex++;
if(psys->objindex == pcsta->objectCount)
{
psys->objindex=0;
psys->instance++;
psys->instance%=96;
}
}
}
else
{
psys->id2++;
if(psys->id2 == pobj->id2_end)
{
psys->id2=0;
psys->id1++;
if(psys->id1 == pobj->id1_end)
{
psys->id1=0;
psys->objindex++;
if(psys->objindex == pcsta->objectCount)
{
psys->objindex=0;
psys->instance++;
psys->instance%=96;
}
}
}
}
if(psys->instance == global_instance)
{
psys->system_state=STATE_NORMAL;
psys->msg_state=STATE_MSG_NONE;
}
}
else
{
psys->msg_state=STATE_MSG_NONE;
}
}
break;
case STATE_MSG_NONE:
default:
break;
}
}
}
}
}
int getOmcSysNo(int* sysNo)
{
char fileName[512];
unsigned char buf[4096];
unsigned char param[32][512];
char paramName[128];
char paramValue[384];
char* temp;
FILE* fp;
int fi;
int i;
//int j;
int paramCount;
int byteCount;
paramCount=0;
byteCount=0;
memset(buf,0,4096);
memset(param,0,32*512);
sprintf(fileName,"./conf/omcd.conf");
fp=fopen(fileName,"r");
if(fp)
{
fi=fileno(fp);
if(read(fi,buf,4096))
{
for(i=0;i<4096;i++)
{
if(buf[i] == 0x0A)
{
//printf("\n");
if(byteCount<512 && param[paramCount][0] != 0x00 && param[paramCount][0] != 0x23)
paramCount++;
else
memset(param[paramCount],0,512);
byteCount=0;
}
else
{
param[paramCount][byteCount]=buf[i];
byteCount++;
}
//printf("%02x ",buf[i]);
}
for(i=0;i<paramCount;i++)
{
temp=strtok((char*)param[i],"=");
sprintf(paramName,"%s",temp);
//printf("Name=%s,",temp);
temp=strtok(NULL,"=");
sprintf(paramValue,"%s",temp);
//printf("Value=%s\n",temp);
if(strcasecmp(paramName,"omcSysNo") == 0)
{
*sysNo=atoi(paramValue);
}
}
}
close(fi);
fclose(fp);
}
else
{
exitLog("cdrCollector:getOmcSysNo, Can not open the omcd.conf");
exit(1);
}
return 1;
}
int getOmcStatus(int sysNo)
{
MYSQL_RES *res;
MYSQL_ROW row;
char sqlstr[256];
int status;
char binCode[256];
sprintf(sqlstr,
"SELECT detailStat FROM OMC_PUB.sysStat WHERE sysTypeNo=0 and sysNo=%d ",sysNo);
res=mysql_getres(pubConn,sqlstr);
if(res == NULL)
{
csta_log("[ERR %d][getOmcStatus]:%s\n",mysql_errno(pubConn),sqlstr);
return -1;
}
if((row = mysql_fetch_row(res)) != NULL){
sprintf(binCode,"%s",row[0]);
//printf("52-%c,53-%c\n",binCode[52],binCode[53]);
status=(binCode[52]-0x30)*16+(binCode[53]-0x30);
}
mysql_free_result(res);
return status;
}
int sendHeartbeat()
{
snmp_pdu pdu;
snmp_addr addr;
char proc_name[16];
memset(proc_name,0,16);
sprintf(proc_name,"cstaCollector");
//pdu
memset(&pdu,0,sizeof(snmp_pdu));
pdu.pdu_type=7;
pdu.request_id=0;
sprintf(pdu.community,"public");
pdu.var_num=1;
pdu.error_status=0;
pdu.error_index=0;
//Addr
addr.local_port = 4957;
//addr.remote_ip = inet_addr("127.0.0.1");
addr.remote_ip = GetLocalIP();
addr.broadcast = 0;
addr.remote_port = 4957;
//Varlist
memcpy(pdu.var[0].oid,PROC_HEARTBEAT_OID,PROC_HEARTBEAT_OIDLEN*sizeof(DWORD));
pdu.var[0].oidlen=PROC_HEARTBEAT_OIDLEN;
pdu.var[0].vartype=0x04;
pdu.var[0].msglen=16;
memcpy(pdu.var[0].msg,proc_name,16);
if(snmp_send(&pdu, &addr) <= 0)
{
csta_log("Send heartbeat fail");
return 0;
}
return 1;
}
int checkTime()
{
time_t l_time;
struct tm *t;
int hour,minute;
int instance;
l_time=time(NULL);
t=localtime(&l_time);
hour=t->tm_hour;
minute=t->tm_min;
//for changing log file
if(change_log_flag == 0 && hour == 23 && minute == 0)
change_log_flag=1;
if(change_log_flag && hour == 0 && minute == 0)
{
change_log_flag=0;
return TIMETO_CHANGE_LOG;
}
//for output file
if(output_file_flag == 0 && hour == OUTPUT_FILE_TIME_HOUR && minute == (OUTPUT_FILE_TIME_MINUTE-15))
output_file_flag=1;
if(output_file_flag == 1 && hour == OUTPUT_FILE_TIME_HOUR && minute == OUTPUT_FILE_TIME_MINUTE)
{
output_file_flag=0;
return TIMETO_OUTPUT_FILE;
}
// fj for debug
//for get csta
#if 0
// һ<><D2BB><EFBFBD><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(((minute%1) == 1) || minute == 5 || minute == 20 || minute == 35 || minute == 50)
#else
// 15<31><35><EFBFBD><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if( minute == 5 || minute == 20 || minute == 35 || minute == 50)
#endif
{
instance=(hour*4 + minute/15 - 1 + 96)%96;
if(csta_flag[instance] == 0)
{
csta_flag[instance]=1;
csta_flag[(instance - 1 + 96)%96]=0;
global_instance++;
global_instance=global_instance%96;
return TIMETO_GET_CSTA;
}
}
return TIMETO_NONE;
}
int getInstance()
{
long l_time;
struct tm *t;
int hour,minute;
l_time=time(NULL);
t=localtime(&l_time);
hour=t->tm_hour;
minute=t->tm_min;
return (hour*4 + minute/15 - 1 + 96)%96;
}
int getLastInstance(csta_src *pcsta,csta_sys *psys)
{
char sqlstr[1024];
MYSQL_RES *res_set;
MYSQL_ROW row;
csta_obj *pobj;
time_t l_time;
struct tm *t;
time_t now_time;
pobj=&pcsta->objects[0];
sprintf(sqlstr,"select max(UNIX_TIMESTAMP(csta_datetime)) from %s.%sData ",CSTA_DB,pobj->detail_table);
res_set=mysql_getres(pCstaConn,sqlstr);
if(res_set == NULL)
{
csta_log("Get last instance from %sData fail,res_set is null",pobj->detail_table);
return -1;
}
if(mysql_num_rows(res_set) != 1)
{
csta_log("There is no last instance in the table of system %d",pcsta->sysTypeNo);
mysql_free_result(res_set);
return -1;
}
row=mysql_fetch_row(res_set);
if(row == NULL)
{
csta_log("Get last instance from %sData fail,row is null",pobj->detail_table);
mysql_free_result(res_set);
return -1;
}
mysql_free_result(res_set);
if(row[0] == NULL || strlen(row[0]) == 0)
l_time=0;
else
l_time=(time_t)(strtoul(row[0],NULL,10));
t=localtime(&l_time);
now_time=time(NULL);
if(now_time < l_time)
{
csta_log("Get last instance from %sData fail,time is invalid",pobj->detail_table);
return -1;
}
if((now_time - l_time) > 24 * 60 * 60)
{
csta_log("Get last instance from %sData fail,ems may be stopped for one more day",pobj->detail_table);
return -1;
}
return t->tm_hour*4 + t->tm_min/15;
}
int cstasrc_init()
{
char sqlstr[8192];
char tmpstr[256];
MYSQL_RES *res_set;
MYSQL_ROW row;
int index;
csta_src *pcsta;
csta_obj *pobj;
int i;
long l_time;
struct tm *t;
int hour,minute;
csta_log("Load csta source");
memset(csta_flag,0,sizeof(csta_flag));
l_time=time(NULL);
t=localtime(&l_time);
hour=t->tm_hour;
minute=t->tm_min;
if(minute == 5 || minute == 20 || minute == 35 || minute == 50)
global_instance=((hour*60+minute-5+24*60)%(24*60))/15-2+96;
else
global_instance=((hour*60+minute-5+24*60)%(24*60))/15-1+96;
global_instance%=96;
sprintf(sqlstr,
"SELECT sysTypeNo,recordTable,sumTable,sumUp,hasSubSys,width,isFullRow,checkTime,useAgent,csvPath,detailToSum FROM %s.cstaDefine WHERE isEnable > '0' GROUP BY sysTypeNo,isFullRow",
CSTA_DB);
res_set=mysql_getres(pCstaConn,sqlstr);
if(res_set == NULL)
{
csta_log("Load csta source fail");
return 0;
}
while ((row = mysql_fetch_row(res_set)) != NULL)
{
CstaSet[csta_src_num].sysTypeNo=atoi(row[0]);
CstaSet[csta_src_num].hassubsys=atoi(row[4]);
CstaSet[csta_src_num].sum_flag=atoi(row[3]);
CstaSet[csta_src_num].check_time_flag=atoi(row[7]);
CstaSet[csta_src_num].single_message_flag=atoi(row[6]);
CstaSet[csta_src_num].systemCount=0;
CstaSet[csta_src_num].objectCount=0;
sprintf(CstaSet[csta_src_num].csv_path,"%s",row[9]);
csta_src_num++;
if(csta_src_num >= MAX_CSTA_SRC_NUM)
{
csta_log("The csta source is greater than %d\n",MAX_CSTA_SRC_NUM);
break;
}
}
mysql_free_result(res_set);
for(index=0;index<csta_src_num;index++)
{
pcsta=&CstaSet[index];
sprintf(sqlstr,"select objIndex,oid,recordTable,sumTable,cstaType,width,id1Start,id1End,id1Offset,id1Field,id2Start,id2End,id2Offset,id2Field,fieldList,detailToSum,csvPath from %s.cstaDefine where sysTypeNo='%d' and isEnable > 0 order by objIndex",CSTA_DB,pcsta->sysTypeNo);
res_set=mysql_getres(pCstaConn,sqlstr);
while ((row = mysql_fetch_row(res_set)) != NULL)
{
pobj=&pcsta->objects[pcsta->objectCount];
pobj->csta_type=atoi(row[4]);
pobj->field_width=atoi(row[5]);
pobj->oidlen=str2oid(row[1],pobj->oid,OID_MAXLEN);
pobj->id1_start=atoi(row[6]);
pobj->id1_end=atoi(row[7]);
//csta_log("id1_end:%d",pobj->id1_end);
pobj->id1_offset=atoi(row[8]);
sprintf(pobj->id1_field,"%s",row[9]);
pobj->id2_start=atoi(row[10]);
pobj->id2_end=atoi(row[11]);
pobj->id2_offset=atoi(row[12]);
sprintf(pobj->id2_field,"%s",row[13]);
sprintf(pobj->sql_detail,"%s",row[14]);
pobj->detail_field_count=parseLine(row[14],pobj->detail_field_list,MAX_FIELD_NUM);
sprintf(pobj->detail_table,"%s",row[2]);
sprintf(pobj->sum_table,"%s",row[3]);
//map table
if(row[15] != NULL && strlen(row[15])>0 && row[15][0] != ' ')
{
sprintf(pobj->relate_table,"%s",row[15]);
if(!parse_map_table(pobj))
csta_log("Parse map table fail,sysTypeNo=%d",pcsta->sysTypeNo);
}
else
{
if(pcsta->sum_flag)
{
pobj->sum_field_count=pobj->detail_field_count;
memset(pobj->sum_field_list,0,sizeof(pobj->sum_field_list));
memcpy(pobj->sum_field_list,pobj->detail_field_list,sizeof(pobj->detail_field_list));
memset(pobj->sql_sum,0,sizeof(pobj->sql_sum));
for(i=0;i<pobj->sum_field_count;i++)
{
sprintf(tmpstr,"sum(%s) as %s",pobj->sum_field_list[i],pobj->sum_field_list[i]);
if(i != (pobj->sum_field_count-1))
strcat(tmpstr,",");
strcat(pobj->sql_sum,tmpstr);
}
sprintf(pobj->relate_table,"NoRelation");
}
}
pcsta->objectCount++;
}
mysql_free_result(res_set);
}
//Initial the csv src index
csv_src_index=csta_src_num;
//Get csv_sending_dir
sprintf(sqlstr,"SELECT pubVarValue FROM %s.cstaPubVarConf WHERE pubVarName='sending_directory' ",CSTA_DB);
res_set=mysql_getres(pCstaConn,sqlstr);
if(res_set == NULL)
{
csta_log("Load sending directory fail, set it to /tmp/");
sprintf(csv_sending_dir,"/tmp/");
}
else
{
row=mysql_fetch_row(res_set);
if(row == NULL || strlen(row[0]) == 0)
sprintf(csv_sending_dir,"/tmp/");
else
sprintf(csv_sending_dir,"%s",row[0]);
mysql_free_result(res_set);
}
csta_log("CSV sending direcory=%s",csv_sending_dir);
//Get csv_sent_dir
sprintf(sqlstr,"SELECT pubVarValue FROM %s.cstaPubVarConf WHERE pubVarName='sent_directory' ",CSTA_DB);
res_set=mysql_getres(pCstaConn,sqlstr);
if(res_set == NULL)
{
csta_log("Load sent directory fail, set it to /tmp/");
sprintf(csv_sent_dir,"/tmp/");
}
else
{
row=mysql_fetch_row(res_set);
if(row == NULL || strlen(row[0]) == 0)
sprintf(csv_sent_dir,"/tmp/");
else
sprintf(csv_sent_dir,"%s",row[0]);
mysql_free_result(res_set);
}
csta_log("CSV sent direcory=%s",csv_sent_dir);
// Get max_keep_days
sprintf(sqlstr, "SELECT pubVarValue FROM %s.cstaPubVarConf WHERE pubVarName='max_keep_days' ", CSTA_DB);
res_set = mysql_getres(pCstaConn, sqlstr);
if (res_set == NULL)
{
csta_log("max_keep_days, set default: %d", max_keep_days);
}
else
{
row = mysql_fetch_row(res_set);
if (row != NULL && strlen(row[0]) != 0)
{
max_keep_days = atoi(row[0]);
}
mysql_free_result(res_set);
}
csta_log("max_keep_days=%d", max_keep_days);
csv_send_flag=0;
sprintf(sqlstr,"SELECT pubVarValue FROM OMC_PUB.omcPubVarConf WHERE pubVarName='csta_store_server'");
res_set=mysql_getres(pCstaConn,sqlstr);
if(res_set == NULL)
{
csv_send_flag=0;
}
else
{
if((row=mysql_fetch_row(res_set)) != NULL)
{
if(strlen(row[0]) == 0)
{
csv_send_flag=0;
}
else
{
csv_send_flag=1;
}
}
mysql_free_result(res_set);
}
csta_log("CSV send flag=%d",csv_send_flag);
return 1;
}
int parse_map_table(csta_obj *pobj)
{
char sqlstr[8192];
char tmpstr2[512];
char tmplist[8192];
MYSQL_RES *res_set;
MYSQL_ROW row;
int i;
if(strcmp(pobj->relate_table,"NoRelation") == 0)
return 0;
memset(sqlstr,0,sizeof(sqlstr));
memset(tmpstr2,0,sizeof(tmpstr2));
memset(tmplist,0,sizeof(tmplist));
sprintf(sqlstr,"select distinct sumFieldList from %s.%s ",CSTA_DB,pobj->relate_table);
res_set=mysql_getres(pCstaConn,sqlstr);
if(res_set == NULL)
return 0;
pobj->sum_field_count=0;
while ((row = mysql_fetch_row(res_set)) != NULL)
{
sprintf(pobj->sum_field_list[pobj->sum_field_count],"%s",row[0]);
pobj->sum_field_count++;
}
mysql_free_result(res_set);
memset(pobj->sql_sum,0,sizeof(pobj->sql_sum));
for(i=0;i<pobj->sum_field_count;i++)
{
sprintf(sqlstr,"select detailFieldList from %s.%s where sumFieldList='%s' ",CSTA_DB,pobj->relate_table,pobj->sum_field_list[i]);
res_set=mysql_getres(pCstaConn,sqlstr);
if(res_set == NULL)
return 0;
memset(tmplist,0,sizeof(tmplist));
while ((row = mysql_fetch_row(res_set)) != NULL)
{
sprintf(tmpstr2,"sum(%s)+",row[0]);
strcat(tmplist,tmpstr2);
}
if(tmplist[strlen(tmplist)-1] == '+')
tmplist[strlen(tmplist)-1]='\0';
sprintf(tmpstr2," as %s",pobj->sum_field_list[i]);
strcat(tmplist,tmpstr2);
if(i != (pobj->sum_field_count-1))
strcat(tmplist,",");
strcat(pobj->sql_sum,tmplist);
mysql_free_result(res_set);
}
return 1;
}
void update_system()
{
char sqlstr[512];
MYSQL_RES *res_set;
MYSQL_ROW row;
csta_src *pcsta;
csta_sys *psys;
csta_obj *pobj;
int i;
int last_instance;
for(i=0;i<csta_src_num;i++)
{
pcsta=&CstaSet[i];
pcsta->systemCount=0;
sprintf(sqlstr,
"SELECT sysNo,subSysNo,ip,isRemote,netId,DPC FROM OMC_PUB.sysInfo WHERE sysTypeNo=%d ORDER BY sysNo,subSysNo",
pcsta->sysTypeNo);
res_set=mysql_getres(pCstaConn,sqlstr);
if(res_set == NULL)
return;
while ((row = mysql_fetch_row(res_set)) != NULL)
{
psys=&pcsta->systems[pcsta->systemCount++];
if(psys->addr.remote_ip == inet_addr(row[2]))
{
continue;
}
psys->sysid=atoi(row[0]);
psys->subsysid=atoi(row[1]);
psys->addr.remote_ip=inet_addr(row[2]);
psys->addr.local_port=CSTA_PORT;
psys->addr.remote_port=SNMP_PORT;
psys->objindex=0;
psys->msglen=0;
pobj=&pcsta->objects[0];
if(pobj->csta_type > 0)
psys->id1=pobj->id1_start;
if(pobj->csta_type == 2)
{
psys->id2=pobj->id2_start;
}
if(pcsta->check_time_flag)
{
last_instance=getLastInstance(pcsta,psys);
if(last_instance == -1)
psys->instance=(global_instance+2)%96;
else
psys->instance=last_instance;
if(last_instance == global_instance)
{
psys->msg_state=STATE_MSG_NONE;
psys->system_state=STATE_NORMAL;
}
else
{
psys->timeout=CHASE_INTERVAL;
psys->msg_state=STATE_MSG_GET_REQUEST;
psys->system_state=STATE_CHASE;
}
}
else
{
psys->instance=global_instance;
psys->timeout=0;
psys->msg_state=STATE_MSG_NONE;
psys->system_state=STATE_NORMAL;
}
csta_log("Connect to system,sysTypeNo=%d,sysid=%d,subsysid=%d,ip=%s,instance=%d",pcsta->sysTypeNo,psys->sysid,psys->subsysid,row[2],psys->instance);
}
mysql_free_result(res_set);
}
}
void csta_request(csta_src *pcsta,csta_sys *psys)
{
csta_obj *pobj,*pobj_n;
pobj=&pcsta->objects[psys->objindex];
psys->pre_objindex=psys->objindex;
psys->pre_instance=psys->instance;
psys->pre_id1=psys->id1;
psys->pre_id2=psys->id2;
if(psys->objindex < pcsta->objectCount)
{
switch(pobj->csta_type)
{
case 0:
if(csta_send(pcsta,psys))
{
psys->objindex++;
}
break;
case 1:
//csta_log("psys->id1:%d",psys->id1);
if(psys->id1 <= pobj->id1_end)
{
if(csta_send(pcsta,psys))
{
psys->id1++;
}
}
else
{
psys->objindex++;
pobj_n=&pcsta->objects[psys->objindex];
psys->id1=pobj_n->id1_start;
}
break;
case 2:
if(psys->id1 <= pobj->id1_end)
{
if(psys->id2 <= pobj->id2_end)
{
if(csta_send(pcsta,psys))
psys->id2++;
}
else
{
psys->id1++;
psys->id2=pobj->id2_start;
}
}
else
{
psys->objindex++;
pobj_n=&pcsta->objects[psys->objindex];
psys->id1=pobj_n->id1_start;
psys->id2=pobj_n->id2_start;
}
break;
default:
break;
}
}
else
{
psys->objindex=0;
pobj_n=&pcsta->objects[psys->objindex];
psys->id1=pobj_n->id1_start;
psys->id2=pobj_n->id2_start;
if(psys->instance == global_instance)
{
psys->system_state=STATE_NORMAL;
psys->msg_state=STATE_MSG_NONE;
csta_log("sysTypeNo=%d,finish to get instance=%d csta data.",pcsta->sysTypeNo,psys->instance);
if(!pcsta->single_message_flag)
csta_record_multi(pcsta,psys);
}
else
{
if(psys->system_state == STATE_CHASE)
{
#if CSTA_DEBUG
csta_log("sysTypeNo=%d,finish to chase instance=%d csta data.",pcsta->sysTypeNo,psys->instance);
#endif
if(!pcsta->single_message_flag)
csta_record_multi(pcsta,psys);
}
}
psys->instance++;
psys->instance%=96;
}
}
int csta_send(csta_src *pcsta,csta_sys *psys)
{
snmp_pdu csta_pdu;
csta_obj *pobj;
int b_oidlen;
pobj=&pcsta->objects[psys->objindex];
csta_pdu.pdu_type=PDU_GET;
csta_pdu.var_num=1;
sprintf(csta_pdu.community,"public");
b_oidlen=pobj->oidlen;
memcpy(csta_pdu.var[0].oid,pobj->oid,b_oidlen * 4);
switch(pobj->csta_type)
{
case 0:
if(pcsta->sysTypeNo==226 || pcsta->sysTypeNo==227){
//Entry OID
csta_pdu.var[0].oid[b_oidlen++]=1;
//Data OID
csta_pdu.var[0].oid[b_oidlen++]=2;
}
break;
case 1:
csta_pdu.var[0].oid[b_oidlen++]=psys->id1;
if(pcsta->sysTypeNo==320 || pcsta->sysTypeNo==379 || pcsta->sysTypeNo==385 || pcsta->sysTypeNo==387)
{
//Entry OID
csta_pdu.var[0].oid[b_oidlen++]=1;
//Data OID
csta_pdu.var[0].oid[b_oidlen++]=2;
//printf("sysTypeNo=%d,csta_type=1,objindex=%d,id1=%d\n",pcsta->sysTypeNo,psys->objindex,psys->id1);
}
break;
case 2:
if(pcsta->sysTypeNo != 350){
csta_pdu.var[0].oid[b_oidlen++]=psys->id1;
}
if(pcsta->sysTypeNo==320 || pcsta->sysTypeNo==378|| pcsta->sysTypeNo==387)
{
//Entry OID
csta_pdu.var[0].oid[b_oidlen++]=1;
//Data OID
csta_pdu.var[0].oid[b_oidlen++]=3;
//printf("sysTypeNo=%d,csta_type=2,objindex=%d,id1=%d,id2=%d\n",pcsta->sysTypeNo,psys->objindex,psys->id1,psys->id2);
}
csta_pdu.var[0].oid[b_oidlen++]=psys->id2;
break;
}
if(psys->system_state == STATE_NORMAL)
psys->instance=getInstance();
csta_pdu.var[0].oid[b_oidlen]=psys->instance;
csta_pdu.var[0].oidlen=b_oidlen+1;
csta_pdu.request_id=0;
psys->request_id=snmp_send(&csta_pdu,&psys->addr);
psys->msg_state=STATE_MSG_WAIT_RESPONSE;
//printf("send,sysTypeNo=%d,request_id=%ld,instance=%d,obj=%d,id1=%d,id2=%d\n",pcsta->sysTypeNo,psys->request_id,psys->instance,psys->objindex,psys->id1,psys->id2);
return 1;
}
void csta_receive()
{
snmp_pdu csta_pdu;
snmp_addr addr;
int loop=20;
addr.local_port=CSTA_PORT;
while(loop-->0)
{
if(snmp_receive(&csta_pdu,&addr) == 0)
{
continue;
}
if(csta_pdu.pdu_type != PDU_RSP)
{
continue;
}
csta_analyze(&csta_pdu);
break;
}
}
void csta_analyze(snmp_pdu *pdu)
{
csta_src *pcsta;
csta_sys *psys;
csta_obj *pobj;
var_list *pvar;
int i,j;
pvar=&pdu->var[0];
for(i=0;i<csta_src_num;i++)
{
pcsta=&CstaSet[i];
for(j=0;j<pcsta->systemCount;j++)
{
psys=&pcsta->systems[j];
if(psys->msg_state == STATE_MSG_WAIT_RESPONSE && psys->request_id == pdu->request_id)
{
//printf("receive,sysTypeNo=%d,pre_objindex=%d,objindex=%d\n",pcsta->sysTypeNo,psys->pre_objindex,psys->objindex);
psys->fail=0;
psys->retry=0;
psys->request_id=0;
csta_record(pcsta,psys,pdu);
if(psys->system_state == STATE_NORMAL)
{
if(psys->pre_objindex == (pcsta->objectCount-1))
{
pobj=&pcsta->objects[psys->pre_objindex];
switch(pobj->csta_type)
{
case 0:
psys->msg_state=STATE_MSG_NONE;
csta_log("sysTypeNo=%d,finish to get instance=%d csta data!",pcsta->sysTypeNo,psys->instance);
if(!pcsta->single_message_flag)
{
csta_record_multi(pcsta,psys);
}
break;
case 1:
if(psys->id1 == (pobj->id1_end+1))
{
psys->msg_state=STATE_MSG_NONE;
csta_log("sysTypeNo=%d,finish to get instance=%d csta data!!",pcsta->sysTypeNo,psys->instance);
}
else
{
psys->msg_state=STATE_MSG_GET_REQUEST;
}
break;
case 2:
if(psys->id1 == (pobj->id1_end+1) && psys->id2 == (pobj->id2_end+1))
{
psys->msg_state=STATE_MSG_NONE;
csta_log("sysTypeNo=%d,finish to get instance=%d csta data!!!",pcsta->sysTypeNo,psys->instance);
}
else
{
psys->msg_state=STATE_MSG_GET_REQUEST;
}
}
}
//normal get
else
{
psys->msg_state=STATE_MSG_GET_REQUEST;
}
}
//chase
else
{
psys->msg_state=STATE_MSG_GET_REQUEST;
}
return;
}
}
}
if(i == csta_src_num)
{
csta_log("The package is not match any system, discard it");
}
return;
}
int csta_record(csta_src *pcsta,csta_sys *psys,snmp_pdu *pdu)
{
csta_obj *pobj;
var_list *pvar;
DWORD d_timestamp,*p_long;
DWORD *pval4;
WORD *pval2;
char sqlstr[8192],sumsqlstr[8192],sumCondition[512],sumFieldList[8192];
char sys_field[128],sys_value[128];
char key_field[128],key_value[128];
char tmpstr3[128];
int i;
//for sum up
int needSumFlag=0;
int isRecord=0;
MYSQL_RES *res_set;
MYSQL_ROW row;
memset(sqlstr,0,sizeof(sqlstr));
memset(sumsqlstr,0,sizeof(sumsqlstr));
memset(sumCondition,0,sizeof(sumCondition));
memset(sumFieldList,0,sizeof(sumFieldList));
memset(sys_field,0,sizeof(sys_field));
memset(sys_value,0,sizeof(sys_field));
memset(key_field,0,sizeof(sys_field));
memset(key_value,0,sizeof(sys_field));
memset(tmpstr3,0,sizeof(tmpstr3));
pvar=&pdu->var[0];
if(pvar->vartype == 0x04 && pvar->msglen > 0)
{
pobj=&pcsta->objects[psys->pre_objindex];
p_long = (DWORD *) pvar->msg;
d_timestamp = htonl(*p_long);
//no timestamp
if(d_timestamp == 0)
{
#if CSTA_DEBUG
csta_log("sysTypeNo=%d,objindex=%d,timestamp=0",pcsta->sysTypeNo,psys->objindex);
#endif
return 0;
}
//message length invalid
if(pvar->msglen < 4 + pobj->field_width * pobj->detail_field_count)
{
csta_log("sysTypeNo=%d,objindex=%d,message length(%d) is invalid,must be(%d)",pcsta->sysTypeNo,psys->objindex,pvar->msglen,4 + pobj->field_width * pobj->detail_field_count);
return 0;
}
if(pcsta->sum_flag && strcmp(pobj->relate_table,"NoRelation") != 0)
needSumFlag=1;
if(pcsta->hassubsys)
{
sprintf(sys_field,"key_sys_id,key_subsys_id,");
sprintf(sys_value,"%d,%d,",psys->sysid,psys->subsysid);
if(needSumFlag)
{
sprintf(tmpstr3,"key_sys_id=%d and key_subsys_id=%d",psys->sysid,psys->subsysid);
strcat(sumCondition,tmpstr3);
}
}
else
{
sprintf(sys_field,"key_sys_id,");
sprintf(sys_value,"%d,",psys->sysid);
if(needSumFlag)
{
sprintf(tmpstr3,"key_sys_id=%d",psys->sysid);
strcat(sumCondition,tmpstr3);
}
}
switch(pobj->csta_type)
{
case 1:
sprintf(key_field,"%s,",pobj->id1_field);
sprintf(key_value,"%d,",psys->pre_id1 + pobj->id1_offset);
if(needSumFlag)
{
sprintf(tmpstr3," and %s=%d",pobj->id1_field,psys->pre_id1 + pobj->id1_offset);
strcat(sumCondition,tmpstr3);
}
break;
case 2:
sprintf(key_field,"%s,%s,",pobj->id1_field, pobj->id2_field);
sprintf(key_value,"%d,%d,",psys->pre_id1 + pobj->id1_offset,psys->pre_id2 + pobj->id2_offset);
if(needSumFlag)
{
sprintf(tmpstr3," and %s=%d and %s=%d",pobj->id1_field,psys->pre_id1 + pobj->id1_offset,pobj->id2_field,psys->pre_id2 + pobj->id2_offset);
strcat(sumCondition,tmpstr3);
}
break;
}
//csta_log("single_message_flag:%d",pcsta->single_message_flag);
if(pcsta->single_message_flag)
{
sprintf(sqlstr, "replace into %s.%sData (%s%s%s,csta_datetime)VALUES(%s%s",
CSTA_DB,pobj->detail_table,sys_field,key_field,pobj->sql_detail,sys_value,key_value);
//sum up accord to the map table
if(needSumFlag)
{
sprintf(tmpstr3," and UNIX_TIMESTAMP(csta_datetime) = %ld",d_timestamp);
strcat(sumCondition,tmpstr3);
sprintf(sumsqlstr,"select %s from %s.%sData where %s",pobj->sql_sum,CSTA_DB,pobj->detail_table,sumCondition);
}
if(pobj->field_width == 2)
{
for(i=0;i<pobj->detail_field_count;i++)
{
pval2=(WORD*)(pvar->msg + 4 + i * 2);
sprintf(tmpstr3,"%d,",htons(*pval2));
strcat(sqlstr,tmpstr3);
}
}
else
{
if (pcsta->sysTypeNo != 362)
{
for(i=0;i<pobj->detail_field_count;i++)
{
pval4=(DWORD*)(pvar->msg + 4 + i * 4);
sprintf(tmpstr3,"%u,",htonl(*pval4));
strcat(sqlstr,tmpstr3);
}
}else{ //SPGW
for(i=0;i<pobj->detail_field_count-2;i++)
{
pval4=(DWORD*)(pvar->msg + 4 + i * 4);
sprintf(tmpstr3,"%u,",htonl(*pval4));
strcat(sqlstr,tmpstr3);
// printf("Field %d: %u\n", i + 1, htonl(*pval4));
} //ǰʮ<C7B0><CAAE><EFBFBD><EFBFBD>
DWORD *uplink_tmp1, *uplink_tmp2;
DWORD *downlink_tmp1, *downlink_tmp2;
uint64_t uplink_total_volume;
uint64_t downlink_total_volume;
// <20><><EFBFBD><EFBFBD> uplink_total_volume
uplink_tmp1 = (DWORD*)(pvar->msg + 4 + (pobj->detail_field_count - 2) * 4); //68
uplink_tmp2 = (DWORD*)(pvar->msg + 4 + (pobj->detail_field_count -1) * 4); // 72
uplink_total_volume = ((uint64_t)ntohl(*uplink_tmp1) << 32) +ntohl(*uplink_tmp2);
sprintf(tmpstr3, "%llu,", uplink_total_volume);
strcat(sqlstr, tmpstr3);
// <20><><EFBFBD><EFBFBD> downlink_total_volume
downlink_tmp1 = (DWORD*)(pvar->msg + 4 + (pobj->detail_field_count ) * 4); //76<37><36>ʼ
downlink_tmp2 = (DWORD*)(pvar->msg + 4 + (pobj->detail_field_count +1) * 4); //80<38><30>ʼ
downlink_total_volume = ((uint64_t)ntohl(*downlink_tmp1) << 32) +ntohl(*downlink_tmp2);
sprintf(tmpstr3, "%llu,", downlink_total_volume);
strcat(sqlstr, tmpstr3);
}
}
sprintf(tmpstr3,"FROM_UNIXTIME(%ld))",d_timestamp);
strcat(sqlstr,tmpstr3);
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
if(mysql_errno(pCstaConn) == 1146)
{
char dstTable[64];
sprintf(dstTable,"%sData",pobj->detail_table);
if(mysql_tblCpy(pCstaConn,dstTable,pobj->detail_table) != 0)
{
csta_log("create table %s fail",dstTable);
}
else
{
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
csta_log("Store csta fail,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2);
csta_log("SQL-1:%s\n",sqlstr);
}
else
{
//csta_log("Record single csta data,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d,time=%s",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2,ctime((time_t*)&d_timestamp));
isRecord=1;
}
}
}
else
{
csta_log("Store csta fail,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2);
csta_log("SQL-2:%s\n",sqlstr);
}
}
else
{
//csta_log("Record single csta data,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d,time=%s",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2,ctime((time_t*)&d_timestamp));
isRecord=1;
}
//printf("%s\n",sqlstr);
}
else
{
//multi-message consist one record
//csta_log("Store the objindex=%d csta data for sysTypeNo=%d,instance=%d,pvar->msglen=%d",psys->pre_objindex,pcsta->sysTypeNo,psys->pre_instance,pvar->msglen);
memcpy(psys->cstamsg[psys->pre_objindex],pvar->msg,pvar->msglen);
psys->msglen+=pvar->msglen;
}
}
else
{
//csta_log("Record csta fail,msglen=%d or vartype=%02x,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d",pvar->msglen,pvar->vartype,pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2);
return 0;
}
if(isRecord&&needSumFlag)
{
res_set=mysql_getres(pCstaConn,sumsqlstr);
if(res_set == NULL)
{
csta_log("Sumup csta fail,res_set is null,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2);
return 0;
}
if(mysql_num_rows(res_set) != 1)
{
csta_log("Sumup csta fail,rownum=%d,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d",mysql_num_rows(res_set),pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2);
mysql_free_result(res_set);
return 0;
}
row=mysql_fetch_row(res_set);
if(row == NULL)
{
csta_log("Sumup csta fail,rowis null,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2);
mysql_free_result(res_set);
return 0;
}
mysql_free_result(res_set);
memset(sumFieldList,0,sizeof(sumFieldList));
for(i=0;i<pobj->sum_field_count;i++)
{
sprintf(tmpstr3,"%s,",pobj->sum_field_list[i]);
strcat(sumFieldList,tmpstr3);
}
sprintf(sqlstr, "replace into %s.%sData (%s%s%scsta_datetime)VALUES(%s%s",
CSTA_DB,pobj->sum_table,sys_field,key_field,sumFieldList,sys_value,key_value);
for(i=0;i<pobj->sum_field_count;i++)
{
if(row[i] == NULL)
{
sprintf(tmpstr3,"0");
}
else
{
if(strlen(row[i]) <= 0)
sprintf(tmpstr3,"0");
else
sprintf(tmpstr3,"%s",row[i]);
}
strcat(sqlstr,tmpstr3);
strcat(sqlstr,",");
}
sprintf(tmpstr3,"FROM_UNIXTIME(%ld))",d_timestamp);
strcat(sqlstr,tmpstr3);
//only 320 mscSumData.check Signal Error
if (pcsta->sysTypeNo == 320 && strcmp(pobj->sum_table, "mscSumData") == 0) {
int sysNo = psys->sysid; // <20><> psys <20><>ȡ sysNo
int subSysNo = psys->subsysid;
unsigned int SignalErr = 0, Attempt = 0 ,KeyType =0;
sscanf(sqlstr, "%*[^,],%*[^,],%u,%*[^,],%u,%*[^,],%u", &KeyType,&Attempt, &SignalErr);
// MO-12 MT-13
if (Attempt > 0 && (KeyType == 12 || KeyType == 13)) {
double ratio = (double)SignalErr / Attempt;
// <20><><EFBFBD><EFBFBD> SignalErr / Attempt > 5%<25><><EFBFBD>򴥷<EFBFBD><F2B4A5B7>
if (ratio > 5.0) {
time_t current_time = time(NULL);
char alarmIdStr[32];
sprintf(alarmIdStr, "%ld", (long)current_time); // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> alarmInfo <20><><EFBFBD><EFBFBD> SQL <20><><EFBFBD><EFBFBD>
sprintf(cstaproc_sqlstr, "insert into OMC_PUB.sysAlarmInfo(sysTypeNo,sysNo,subSysNo,compCode,alarmCode,alarmTime,clearTime,clearMode,alarmInfo,alarmId) "
"values(%d,%d,%d,%d,%d,CURRENT_TIMESTAMP,'0000-00-00 00:00:00',1,'Call failure rate exceeds 5%%');",
pcsta->sysTypeNo,sysNo,subSysNo, 0, 10, alarmIdStr);
// ִ<><D6B4> SQL <20><><EFBFBD><EFBFBD>
if (mysql_getnores(pubConn, cstaproc_sqlstr) != 0) {
csta_log("[SQL ERR]: %s", cstaproc_sqlstr);
} else {
csta_log("Inserted into alarmInfo: %s", cstaproc_sqlstr);
}
}else{
//clear 5% alarm
sprintf(cstaproc_sqlstr, "update OMC_PUB.sysAlarmInfo set clearTime=CURRENT_TIMESTAMP,clearMode=0,clearBy='System' "
"where sysTypeNo=%d and sysNo=%d and subSysNo=%d and compCode=%d and alarmCode=%d and clearMode=1;",
pcsta->sysTypeNo, sysNo, subSysNo, 0, 10);
// ִ<><D6B4> SQL <20><><EFBFBD><EFBFBD>
if (mysql_getnores(pubConn, cstaproc_sqlstr) != 0) {
csta_log("[SQL ERR]: %s", cstaproc_sqlstr);
} else {
csta_log("Cleared alarmInfo: %s", cstaproc_sqlstr);
}
}
} else {
csta_log("Attempt is zero, skipping SignalErr/Attempt calculation.");
}
}
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
if(mysql_errno(pCstaConn) == 1146)
{
char dstTable[64];
sprintf(dstTable,"%sData",pobj->sum_table);
if(mysql_tblCpy(pCstaConn,dstTable,pobj->sum_table) != 0)
{
csta_log("create table %s fail",dstTable);
}
else
{
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
csta_log("Sumup csta fail,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2);
return 0;
}
else
{
;//csta_log("Sumup single csta data,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d,time=%s",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2,ctime((time_t*)&d_timestamp));
}
}
}
else
{
csta_log("Sumup csta fail,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2);
csta_log("%s\n",sqlstr);
return 0;
}
}
else
{
;//csta_log("Sumup single csta data,sysTypeNo=%d,instance=%d,objindex=%d,id1=%d,id2=%d,time=%s",pcsta->sysTypeNo,psys->pre_instance,psys->pre_objindex,psys->pre_id1,psys->pre_id2,ctime((time_t*)&d_timestamp));
}
}
return 1;
}
int csta_record_multi(csta_src *pcsta,csta_sys *psys)
{
DWORD d_timestamp,*p_long;
DWORD *pval4;
WORD *pval2;
char sqlstr[8192],tol_field_sql[8192];
char sys_field[128],sys_value[128];
char tmpstr3[8192];
unsigned long ref_data_len;
csta_obj *pobj;
int i,j;
memset(sqlstr,0,sizeof(sqlstr));
memset(tol_field_sql,0,sizeof(tol_field_sql));
memset(sys_field,0,sizeof(sys_field));
memset(sys_value,0,sizeof(sys_value));
memset(tmpstr3,0,sizeof(tmpstr3));
ref_data_len=0;
//csta_log("objectCount:%d",pcsta->objectCount);
for(i=0;i<pcsta->objectCount;i++)
{
pobj=&pcsta->objects[i];
if(pobj->csta_type != 0)
{
csta_log("The %d system csta source configure error, it must be 0 when isFullRow=0",pcsta->sysTypeNo);
psys->msglen=0;
return 0;
}
//csta_log("detail_field_count:%d,field_width:%d",pobj->detail_field_count,pobj->field_width);
ref_data_len += pobj->detail_field_count * pobj->field_width;
ref_data_len += 4;
//csta_log("ref_data_len[%d]:%d",i,ref_data_len);
}
if(ref_data_len != psys->msglen)
{
csta_log("Record multi csta data fail,sysTypeNo=%d,instance=%d,message length(%ld) != %ld",pcsta->sysTypeNo,psys->pre_instance,psys->msglen,ref_data_len);
psys->msglen=0;
return 0;
}
psys->msglen=0;
psys->objindex=0;
p_long=(DWORD *)psys->cstamsg[0];
d_timestamp=htonl(*p_long);
if(pcsta->hassubsys)
{
sprintf(sys_field,"key_sys_id,key_subsys_id,");
sprintf(sys_value,"%d,%d,",psys->sysid,psys->subsysid);
}
else
{
sprintf(sys_field,"key_sys_id,");
sprintf(sys_value,"%d,",psys->sysid);
}
memset(tol_field_sql,0,sizeof(tol_field_sql));
for(i=0;i<pcsta->objectCount;i++)
{
sprintf(tmpstr3,"%s",pcsta->objects[i].sql_detail);
if(i != (pcsta->objectCount-1))
strcat(tmpstr3,",");
strcat(tol_field_sql,tmpstr3);
}
sprintf(sqlstr, "replace into %s.%sData (%s%s,csta_datetime)VALUES(%s",
CSTA_DB,pobj->detail_table,sys_field,tol_field_sql,sys_value);
for(i=0;i<pcsta->objectCount;i++)
{
pobj=&pcsta->objects[i];
for(j=0;j<pobj->detail_field_count;j++)
{
if(pobj->field_width == 2)
{
pval2=(WORD*)(psys->cstamsg[i] + 4 + j * 2);
sprintf(tmpstr3,"%d,",htons(*pval2));
strcat(sqlstr,tmpstr3);
}
else
{
pval4=(DWORD*)(psys->cstamsg[i] + 4 + j * 4);
sprintf(tmpstr3,"%u,",htonl(*pval4));
strcat(sqlstr,tmpstr3);
}
}
}
sprintf(tmpstr3,"FROM_UNIXTIME(%ld))",d_timestamp);
strcat(sqlstr,tmpstr3);
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
if(mysql_errno(pCstaConn) == 1146)
{
char dstTable[64];
sprintf(dstTable,"%sData",pcsta->objects[0].detail_table);
if(mysql_tblCpy(pCstaConn,dstTable,pcsta->objects[0].detail_table) != 0)
{
csta_log("create table %s fail",dstTable);
return 0;
}
else
{
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
csta_log("Store csta fail,sysTypeNo=%d,instance=%d",pcsta->sysTypeNo,psys->pre_instance);
csta_log("SQL-3:%s\n",sqlstr);
return 0;
}
else
{
;//csta_log("Record multi csta data,sysTypeNo=%d,instance=%d,time=%s",pcsta->sysTypeNo,psys->pre_instance,ctime((time_t*)&d_timestamp));
}
}
}
else
{
csta_log("Store csta fail,sysTypeNo=%d,instance=%d",pcsta->sysTypeNo,psys->pre_instance);
csta_log("SQL4:%s\n",sqlstr);
return 0;
}
}
else
{
;//csta_log("Record multi csta data,sysTypeNo=%d,instance=%d,time=%s",pcsta->sysTypeNo,psys->pre_instance,ctime((time_t*)&d_timestamp));
}
return 1;
}
int csta_create_csv()
{
csta_src *pcsta;
char sqlstr[512];
char command[512];
time_t l_time;
struct tm *t;
char csvfile[64];
char tablename[64];
if(csv_src_index == csta_src_num)
return 1;
pcsta=&CstaSet[csv_src_index];
//Create the csv dir if not exist
if(chdir(pcsta->csv_path) == -1)
{
sprintf(command,"mkdir -p -m755 %s",pcsta->csv_path);
system(command);
csta_log("The %s is not exist, create it",pcsta->csv_path);
if(chdir(pcsta->csv_path) == -1)
{
csta_log("Create %s fail",pcsta->csv_path);
csv_src_index++;
return 0;
}
}
if(chdir(csv_sent_dir) == -1)
{
sprintf(command,"mkdir -p -m755 %s",csv_sent_dir);
system(command);
csta_log("The %s is not exist, create it",csv_sent_dir);
if(chdir(csv_sent_dir) == -1)
{
csta_log("Create %s fail",csv_sent_dir);
csv_src_index++;
return 0;
}
}
if(chdir(csv_sending_dir) == -1)
{
sprintf(command,"mkdir -p -m755 %s",csv_sending_dir);
system(command);
csta_log("The %s is not exist, create it",csv_sending_dir);
if(chdir(csv_sending_dir) == -1)
{
csta_log("Create %s fail",csv_sending_dir);
csv_src_index++;
return 0;
}
}
l_time=time(NULL) - 24 * 60 * 60;
t=localtime(&l_time);
sprintf(csvfile,"%s_%04d%02d%02d.csv",pcsta->objects[0].detail_table,t->tm_year+1900,t->tm_mon+1,t->tm_mday);
sprintf(tablename,"%sData",pcsta->objects[0].detail_table);
sprintf(sqlstr,"SELECT * INTO OUTFILE '%s%s' FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES TERMINATED BY '\n' FROM %s.%s WHERE csta_datetime >= '%04d-%02d-%02d 00:00:00' AND csta_datetime < '%04d-%02d-%02d 23:59:59'",
pcsta->csv_path,csvfile,CSTA_DB,tablename,
t->tm_year + 1900,t->tm_mon + 1,t->tm_mday,t->tm_year + 1900,t->tm_mon + 1,t->tm_mday);
//printf("%s\n",sqlstr);
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
csta_log("Create %s fail",csvfile);
}
else
{
csta_log("Create %s successfully",csvfile);
if(csv_send_flag)
{
sprintf(command,"cp %s%s %s/%s",pcsta->csv_path,csvfile,csv_sending_dir,csvfile);
system(command);
sprintf(command,"cp %s%s %s/%s",pcsta->csv_path,csvfile,csv_sent_dir,csvfile);
system(command);
sprintf(command,"chmod 644 %s%s",pcsta->csv_path,csvfile);
system(command);
sprintf(command,"chown mysql %s%s",pcsta->csv_path,csvfile);
system(command);
sprintf(command,"chgrp mysql %s%s",pcsta->csv_path,csvfile);
system(command);
csta_log("Move %s to %s prepare to send",csvfile,csv_sending_dir);
}
else
{
sprintf(command,"chmod 644 %s%s",pcsta->csv_path,csvfile);
system(command);
}
}
l_time=time(NULL) - 24 * 60 * 60;
t=localtime(&l_time);
//Create the mscSum csv table
if(pcsta->sum_flag)
{
sprintf(csvfile,"%s_%04d%02d%02d.csv",pcsta->objects[0].sum_table,t->tm_year+1900,t->tm_mon+1,t->tm_mday);
sprintf(tablename,"%sData",pcsta->objects[0].sum_table);
sprintf(sqlstr,"SELECT * INTO OUTFILE '%s%s' FIELDS TERMINATED BY ',' ENCLOSED BY '' LINES TERMINATED BY '\n' FROM %s.%s WHERE csta_datetime >= '%04d-%02d-%02d 00:00:00' AND csta_datetime < '%04d-%02d-%02d 23:59:59'",
pcsta->csv_path,csvfile,CSTA_DB,tablename,
t->tm_year + 1900,t->tm_mon + 1,t->tm_mday,t->tm_year + 1900,t->tm_mon + 1,t->tm_mday);
//printf("%s\n",sqlstr);
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
csta_log("Create %s fail",csvfile);
}
else
{
csta_log("Create %s successfully",csvfile);
if(csv_send_flag)
{
sprintf(command,"cp %s%s %s/%s",pcsta->csv_path,csvfile,csv_sending_dir,csvfile);
system(command);
sprintf(command,"cp %s%s %s/%s",pcsta->csv_path,csvfile,csv_sent_dir,csvfile);
system(command);
sprintf(command,"chmod 644 %s%s",pcsta->csv_path,csvfile);
system(command);
sprintf(command,"chown mysql %s%s",pcsta->csv_path,csvfile);
system(command);
sprintf(command,"chgrp mysql %s%s",pcsta->csv_path,csvfile);
system(command);
csta_log("Move %s to %s prepare to send",csvfile,csv_sending_dir);
}
else
{
sprintf(command,"chmod 644 %s%s",pcsta->csv_path,csvfile);
system(command);
}
}
}
// by simon begin ---
// Delete the over-time record
l_time = time(NULL) - max_keep_days * 24 * 60 * 60;
// --- end
t=localtime(&l_time);
sprintf(tablename,"%sData",pcsta->objects[0].detail_table);
sprintf(sqlstr,"DELETE FROM %s.%s WHERE csta_datetime < '%04d-%02d-%02d 00:00:00' ",
CSTA_DB,tablename,t->tm_year + 1900,t->tm_mon + 1,t->tm_mday);
csta_log("%s",sqlstr);
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
csta_log("Delete over-time record of %s fail",tablename);
}
else
{
csta_log("Delete over-time1 record of %s successfully",tablename);
}
if(pcsta->sum_flag)
{
// by simon begin ---
l_time = time(NULL) - max_keep_days * 24 * 60 * 60;
// --- end
t=localtime(&l_time);
sprintf(tablename,"%sData",pcsta->objects[0].sum_table);
sprintf(sqlstr,"DELETE FROM %s.%s WHERE csta_datetime < '%04d-%02d-%02d 00:00:00' ",
CSTA_DB,tablename,t->tm_year + 1900,t->tm_mon + 1,t->tm_mday);
csta_log("%s",sqlstr);
if(mysql_getnores(pCstaConn,sqlstr) != 0)
{
csta_log("Delete over-time record of %s fail",tablename);
}
else
{
csta_log("Delete over-time2 record of %s successfully",tablename);
}
}
csv_src_index++;
return 1;
}
void csta_log(const char *fmt, ...)
{
char logFile[64];
FILE *fp;
time_t l_time;
va_list ap;
char buf[8192];
struct tm *t;
char timestr[64];
l_time=time(NULL);
t=localtime(&l_time);
sprintf(logFile,"/usr/local/omc/log/cstalog_%04d%02d%02d.log",t->tm_year+1900,t->tm_mon+1,t->tm_mday);
fp=fopen(logFile,"a");
if(fp!=NULL)
{
va_start(ap,fmt);
vsprintf(buf,fmt,ap);
sprintf(timestr,"%02d:%02d:%02d: ",t->tm_hour,t->tm_min,t->tm_sec);
fputs(timestr,fp);
fputs(buf,fp);
fputs("\n",fp);
fflush(fp);
va_end(ap);
fclose(fp);
}
}
BYTE str2oid(char *str, DWORD * array, BYTE max)
{
BYTE sub = 0;
short len, i;
char *pvar;
len = strlen(str);
pvar = str;
for (i = 0; i < len && sub < max; i++) {
if (str[i] == '.') {
str[i] = '\0';
if (strlen(pvar) == 0)
continue;
array[sub++] = atoi(pvar);
pvar = str + i + 1;
}
}
if (strlen(pvar) == 0)
return sub;
array[sub++] = atoi(pvar);
return sub;
}
int parseLine(char *str, char (*row)[32], int maxrow)
{
char *pstr = str;
int len, index = 0, i;
BOOL black = 0;
len = strlen(str);
for (i = 0; i < len && index < maxrow; i++)
{
if (isspace(str[i]) || str[i] == ',' || str[i] == ';' ||
str[i] == '/' || str[i] == '|' || str[i] == '.')
{
if (black == 0)
{
pstr = str + i + 1;
}
else
{
str[i] = '\0';
if (strlen(pstr) > 64)
{
pstr[63] = 0;
}
sprintf(row[index++], "%s", pstr);
pstr = str + i + 1;
}
black = 0;
}
else
{
black = 1;
}
}
if (black == 1)
{
if (strlen(pstr) > 64)
{
pstr[63] = 0;
}
sprintf(row[index++], "%s", pstr);
}
return index;
}