bool ReadIni(char *inifile) { TIniFile tf; CSList tmpstr; char szBuf[256]; g_LogFile.Open("bulog"); // 用程序的进程号作为各个BU日志文件存放目录 memset(&g_BUnit,0,sizeof(g_BUnit)); printf("Begin to read ini-file:%s...\n",inifile); if (!tf.Open(inifile)) { sprintf(szBuf,"不能打开配置文件<%s>\n",inifile); //DEBUG_RUNTIME_MSGOUT(szBuf); exit(-1000); } g_LogFile.RemoveOverdueLogFile(tf.ReadInt("COMMON","LOGOVERDUE",10)); //g_BUnit.iBUnitGourpID = tf.ReadInt("COMMON","GID",1); tf.ReadString("COMMON","GID","",g_BUnit.szBUGroupID,sizeof(g_BUnit.szBUGroupID)-1); tf.ReadString("BCC","BCCSVR","127.0.0.1:6666",szBuf,sizeof(szBuf)-1); if (!tmpstr.FillStrings(szBuf,':') || tmpstr.GetCount()<2) { sprintf(szBuf,"配置文件<%s>的配置项[BCC] BCCSVR=???? 错误! 格式为:BCCSVR=xxx.xxx.xxx.xxx:port\n",inifile); //DEBUG_RUNTIME_MSGOUT(szBuf); exit(-1000); } strncpy(g_BUnit.szSvrIP,tmpstr.GetAt(0),sizeof(g_BUnit.szSvrIP)-1); g_BUnit.iSvrPort = atoi(tmpstr.GetAt(1)); g_BUnit.iHBInterval = tf.ReadInt("BCC","HEARTBEAT",5000); if (g_BUnit.iHBInterval<100) g_BUnit.iHBInterval = 100; tf.Close(); return(true); }
void TestLogFile() { CLogFile LogFile; Assert(!LogFile.IsOpen()); Assert(!LogLine(LogFile, LE_INFOLOW, "InfoLow")); const char* LogfileName = "./Test.log"; DeleteFile(LogfileName); time_t CreationTime = time(NULL); Assert(LogFile.Open(LogfileName)); LogFile.MarkCurrentTimeAsCreationTime(); time_t FileCreationTime = LogFile.GetCreationTime(); Assert(FileCreationTime == CreationTime); Assert(LogFile.GetFileSize() == 0); Assert(LogLine(LogFile, LE_INFOLOW, "InfoLow")); Assert(LogLine(LogFile, LE_INFO, "Info")); Assert(LogLine(LogFile, LE_INFOHIGH, "InfoHigh")); Assert(LogLine(LogFile, LE_NOTICE, "Notice")); Assert(LogLine(LogFile, LE_WARNING, "Warning")); Assert(LogLine(LogFile, LE_ERROR, "Error")); DWORD Size = LogFile.GetFileSize(); Assert(Size > 0); Assert(LogLine(LogFile, LE_FATAL, "Fatal")); LogFile.Flush(); DWORD Size2 = LogFile.GetFileSize(); Assert(Size2 > Size); Assert(LogFile.IsOpen()); LogFile.Close(); Assert(!LogFile.IsOpen()); Assert(LogFile.Open("./Test.log")); Assert(LogLine(LogFile, LE_INFOLOW, "InfoLow")); Sleep(2000); FileCreationTime = LogFile.GetCreationTime(); Assert(FileCreationTime == CreationTime); }
bool ReadIni(char *inifile) { TIniFile tf; CSList tmpstr; char szBuf[256]; g_LogFile.Open("bulog"); // 用程序的进程号作为各个BU日志文件存放目录 memset(&g_BUnit,0,sizeof(g_BUnit)); printf("Begin to read ini-file:%s...\n",inifile); if (!tf.Open(inifile)) { sprintf(szBuf,"不能打开配置文件<%s>\n",inifile); DEBUG_RUNTIME_MSGOUT(szBuf); exit(-1000); } g_LogFile.RemoveOverdueLogFile(tf.ReadInt("COMMON","LOGOVERDUE",10)); //g_BUnit.iBUnitGourpID = tf.ReadInt("COMMON","GID",1); tf.ReadString("COMMON","GID","",g_BUnit.szBUGroupID,sizeof(g_BUnit.szBUGroupID)-1); tf.ReadString("BCC","BCCSVR","127.0.0.1:6666",szBuf,sizeof(szBuf)-1); if (!tmpstr.FillStrings(szBuf,':') || tmpstr.GetCount()<2) { sprintf(szBuf,"配置文件<%s>的配置项[BCC] BCCSVR=???? 错误! 格式为:BCCSVR=xxx.xxx.xxx.xxx:port\n",inifile); DEBUG_RUNTIME_MSGOUT(szBuf); exit(-1000); } strncpy(g_BUnit.szSvrIP,tmpstr.GetAt(0),sizeof(g_BUnit.szSvrIP)-1); g_BUnit.iSvrPort = atoi(tmpstr.GetAt(1)); g_BUnit.iHBInterval = tf.ReadInt("BCC","HEARTBEAT",5000); if (g_BUnit.iHBInterval<100) g_BUnit.iHBInterval = 100; memset(szBuf,0,sizeof szBuf); // TODO : 加密机配置 char remoteip[128]={0}; int remoteport=0; tf.ReadString("ENCSVR","ip","",remoteip,sizeof(remoteip)-1); BKConfiguration::instance()->save_para("encsvr.remoteip",remoteip); remoteport = tf.ReadInt("ENCSVR","port",0); BKConfiguration::instance()->save_int_para("encsvr.remoteport",remoteport); int mainfunc = tf.ReadInt("ENCSVR","mainfunc",0); BKConfiguration::instance()->save_int_para("encsvr.mainfunc",mainfunc); int drtpno = tf.ReadInt("ENCSVR","drtpno",0); BKConfiguration::instance()->save_int_para("encsvr.drtpno",drtpno); tf.Close(); return(true); }
bool ReadIni(char *inifile) { TIniFile tf; CSList tmpstr; char szBuf[256]; g_LogFile.Open("bulog"); // 用程序的进程号作为各个BU日志文件存放目录 memset(&g_BUnit,0,sizeof(g_BUnit)); printf("Begin to read ini-file:%s...\n",inifile); if (!tf.Open(inifile)) { sprintf(szBuf,"不能打开配置文件<%s>\n",inifile); DEBUG_RUNTIME_MSGOUT(szBuf); exit(-1000); } g_LogFile.RemoveOverdueLogFile(tf.ReadInt("COMMON","LOGOVERDUE",10)); //g_BUnit.iBUnitGourpID = tf.ReadInt("COMMON","GID",1); tf.ReadString("COMMON","GID","",g_BUnit.szBUGroupID,sizeof(g_BUnit.szBUGroupID)-1); tf.ReadString("BCC","BCCSVR","127.0.0.1:6666",szBuf,sizeof(szBuf)-1); if (!tmpstr.FillStrings(szBuf,':') || tmpstr.GetCount()<2) { sprintf(szBuf,"配置文件<%s>的配置项[BCC] BCCSVR=???? 错误! 格式为:BCCSVR=xxx.xxx.xxx.xxx:port\n",inifile); DEBUG_RUNTIME_MSGOUT(szBuf); exit(-1000); } strncpy(g_BUnit.szSvrIP,tmpstr.GetAt(0),sizeof(g_BUnit.szSvrIP)-1); g_BUnit.iSvrPort = atoi(tmpstr.GetAt(1)); g_BUnit.iHBInterval = tf.ReadInt("BCC","HEARTBEAT",5000); if (g_BUnit.iHBInterval<100) g_BUnit.iHBInterval = 100; /* ****** Updated by CHENYH at 2005-9-28 12:14:22 ****** tf.ReadString("SQLSVR","NAME","gmserver",g_BUnit.m_SqlDB.szServer,sizeof(g_BUnit.m_SqlDB.szServer)-1); tmpstr.trim(g_BUnit.m_SqlDB.szServer); tf.ReadString("SQLSVR","DATABASE","gmdata",g_BUnit.m_SqlDB.szDatabase,sizeof(g_BUnit.m_SqlDB.szDatabase)-1); tmpstr.trim(g_BUnit.m_SqlDB.szDatabase); tf.ReadString("SQLSVR","LOGIN","sa",g_BUnit.m_SqlDB.szLogin,sizeof(g_BUnit.m_SqlDB.szLogin)-1); tmpstr.trim(g_BUnit.m_SqlDB.szLogin); tf.ReadString("SQLSVR","PASSWORD","",g_BUnit.m_SqlDB.szPassword,sizeof(g_BUnit.m_SqlDB.szPassword)-1); tmpstr.trim(g_BUnit.m_SqlDB.szPassword); *******************************************************/ tf.ReadString("DB2SVR","NAME","gmserver",g_SqlDB.szServer,sizeof(g_SqlDB.szServer)-1); tmpstr.trim(g_SqlDB.szServer); memset(szBuf,0,sizeof szBuf); tf.ReadString("DB2SVR","AUTH_TYPE","config",szBuf,sizeof(szBuf)-1); if(strcmp("config",szBuf) == 0) { // 从配置文件读取 tf.ReadString("DB2SVR","DATABASE","gmdata",g_SqlDB.szDatabase,sizeof(g_SqlDB.szDatabase)-1); tmpstr.trim(g_SqlDB.szDatabase); tf.ReadString("DB2SVR","LOGIN","sa",g_SqlDB.szLogin,sizeof(g_SqlDB.szLogin)-1); tmpstr.trim(g_SqlDB.szLogin); tf.ReadString("DB2SVR","PASSWORD","",g_SqlDB.szPassword,sizeof(g_SqlDB.szPassword)-1); tmpstr.trim(g_SqlDB.szPassword); } else if(strcmp("env",szBuf) == 0) { // 从环境变量读取 char* penv=NULL; if((penv = getenv("YKT_DBNAME")) == NULL) { DEBUG_RUNTIME_MSGOUT("无法取得数据库名"); exit(-1001); } strcpy(g_SqlDB.szDatabase,penv); tmpstr.trim(g_SqlDB.szDatabase); if((penv = getenv("YKT_USER")) == NULL) { DEBUG_RUNTIME_MSGOUT("无法取得数据库连接用户名"); exit(-1001); } strcpy(g_SqlDB.szLogin,penv); tmpstr.trim(g_SqlDB.szLogin); if((penv = getenv("YKT_PWD")) == NULL) { DEBUG_RUNTIME_MSGOUT("无法取得数据库连接密码"); exit(-1001); } strcpy(g_SqlDB.szPassword,penv); tmpstr.trim(g_SqlDB.szPassword); } else { DEBUG_RUNTIME_MSGOUT("数据库连接方式配置错误\n"); exit(-1001); } tf.Close(); return(true); }
int main(int argc,char *argv[]) { int rtn; pSqlDB = &(g_BUnit.m_SqlDB); // 供外部方便检查,主要用于DEBUGSQLERROR(msg) g_BUnit.pSvrLink = &g_SvrLink; g_LogFile.SetFlushDelay(0); g_LogFile.Open("bulog"); memset(pSqlDB,0,sizeof(ST_SQLDB)); openlog("fdykt_hhd",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL4); puts("Before Reading ini..."); if (argc<2) ReadIni("fdsvrall.ini"); else ReadIni(argv[1]); puts("读配置文件end!\n"); DEBUG_RUNTIME_MSGOUT("读配置文件end"); ResetBPFunctions(); if (argc>2) { ListBPFunctions(argv[2]); } pSqlDB->bConnected = 0; // 初始化数据库连接: SQLInitialize(); if (SQLConnectToServer()!=0) { DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n"); return(-100); } // 初始化与BCC连接: DEBUG_RUNTIME_MSGOUT("连接数据库成功!\n"); do { rtn = g_SvrLink.ToLink(&g_BUnit); if (rtn==1) { DEBUG_RUNTIME_MSGOUT("与业务调度中心(BCC)的连接成功!\n"); break; } else if (rtn==-100) { DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n"); puts("sleep waiting for connect BCC!"); mysleep(g_BUnit.iHBInterval); } else { // 应该属于故障,或对方并不是BCC DEBUG_RUNTIME_MSGOUT("未知错误\n"); return(rtn); } } while (1); setnoblockgetch(); /********************************************************************** Added by hhd at 2004-09-16 为了增加签到处理,达到共享内存的处理 增加共享内存和信号量 共享内存一共1024个字节,其中使用前18个字节 shm[0]:代表是否进行过签到的标志,如果为1,已经签过到但不知道是否成功 ,后续业务将不能进行签到处理,如果为其他值,系统将进行签到 shm[1]:代表签到是否成功的标志,如果为1,则标识签到成功,后续16个字节为 银行正常返回数据,可以使用 shm[2~17]:前8个字节为加密的PIN密钥,后8个字节为加密的MAC密钥 ***********************************************************************/ /********************************************************************** Update by hhd at 2004-10-27 为了增加签到处理,达到共享内存的处理 增加共享内存和信号量 为了反映每个终端的当前工作状态,在共享内存中设置一个状态标志 共享内存一共1024个字节,其中使用前26个字节 shm[0]:代表是否进行过签到的标志,如果为1,已经签过到但不知道是否成功 ,后续业务将不能进行签到处理,如果为其他值,系统将进行签到 shm[1]:代表签到是否成功的标志,如果为1,则标识签到成功,后续16个字节为 银行正常返回数据,可以使用 shm[2]:代表系统重新启动标志,如果不为1,系统进行初始化操作(进行设备 注册表中设备的状态的清空操作),然后系统将改标志置为1,其他BU启动 跳过该项操作 shm[10~25]:前8个字节为加密的PIN密钥,后8个字节为加密的MAC密钥 ***********************************************************************/ key_t key; int ret=0; struct shmid_ds buf; // Update by lq at 2005-03-10 // 将创建共享内存和设备签到移到bankguard中去 // 必须先运行bankguard此处操作才能完成 key=ftok(".",0); shmid=shmget(key,SEGSIZE,0666); if(-1==shmid) { DEBUG_RUNTIME_MSGOUT("获取共享内存失败,请确保bankguard已经启动\n"); return E_CREATE_SHARE_MEMORY; } shm=(char*)shmat(shmid,0,0); if((int)shm==-1) { DEBUG_RUNTIME_MSGOUT("映射共享内存失败"); return E_JOIN_SHARE_MEMORY; } semid=semget(key,1,0); if(semid==-1) { DEBUG_RUNTIME_MSGOUT("获取共享锁id失败"); return E_JOIN_SHARE_MEMORY; } while (g_SvrLink.LinkOK()) { switch (mygetch()) { case '?': case 'h': case 'H': printf("\nCommand List:\n"); printf("\t ? or h: display this Help informations!\n"); printf("\t x: To eXit this business unit.\n"); printf("\t d: Display functions status.\n"); printf("\t l: List functions status into <function.lst>.\n"); printf("Enter command to select:\n"); break; case 'x': case 'X': g_SvrLink.bExit = true; continue; break; case 'd': case 'D': ListBPFunctions(NULL); break; case 'l': case 'L': ListBPFunctions("function.lst"); break; } TestSQLConnect(); if (pSqlDB->bConnected==0) //这个变量有人维护吗? { mysleep(1000); if (!g_SvrLink.CheckLink()) break; // BCC exit (可能用户发现数据库连接断开,需要维护系统,导致手工将BCC退出同时也需要BU退出) if (SQLConnectToServer()!=0) { // SQL Link error: DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n"); } else { DEBUG_RUNTIME_MSGOUT("与数据库连接成功!\n"); } continue; } else g_SvrLink.Processing(&g_BUnit); if (g_SvrLink.bExit) break; } /* ****** Updated by CHENYH at 2004-4-14 11:07:19 ****** 经过测试后,CheckLink()工作正常,测试环境为:BCC(WIN)+BU(WIN),BCC(LINUX)+BU(WIN),BCC(LINUX)+BU(LINUX) while (1) { mysleep(1000); if (!g_SvrLink.CheckLink()) { printf("TEST CHECK LINK return <false>!\n"); break; } } */ shmdt(shm); shmctl(shmid,IPC_RMID,&buf); d_sem(semid); closelog(); g_SvrLink.Close(); SQLExit(); DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n"); g_LogFile.Close(); return(0); }
int main(int argc,char *argv[]) { int rtn; pSqlDB = &(g_BUnit.m_SqlDB); // 供外部方便检查,主要用于DEBUGSQLERROR(msg) g_BUnit.pSvrLink = &g_SvrLink; g_LogFile.SetFlushDelay(0); g_LogFile.Open("bulog"); openlog("yktbase",LOG_PID|LOG_CONS|LOG_NDELAY,LOG_LOCAL0); memset(pSqlDB,0,sizeof(ST_SQLDB)); //puts("Before Reading ini..."); if (argc<2) ReadIni("fdsvrall.ini"); else ReadIni(argv[1]); DEBUG_RUNTIME_MSGOUT("读配置文件end"); ResetBPFunctions(); if (argc>2) { ListBPFunctions(argv[2]); } pSqlDB->bConnected = 0; // 初始化数据库连接: SQLInitialize(); if (SQLConnectToServer()!=0) { DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n"); g_LogFile.Close(); closelog(); return(-100); } #ifndef WIN32 struct sigaction sigact; memset(&sigact,0,sizeof sigact); sigact.sa_handler = sig_alarm_handler; sigaction(SIGALRM,&sigact,NULL); #endif // 初始化与BCC连接: DEBUG_RUNTIME_MSGOUT("连接数据库成功!\n"); do { rtn = g_SvrLink.ToLink(&g_BUnit); if (rtn==1) { puts("与业务调度中心(BCC)的连接成功!\n"); break; } else if (rtn==-100) { DEBUG_RUNTIME_MSGOUT("估计业务调度中心(BCC)尚未正式启动,或者检查配置中的[SERVER]项参数\n"); puts("sleep waiting for connect BCC!"); mysleep(g_BUnit.iHBInterval); } else { g_LogFile.Close(); closelog(); return(rtn); } } while (1); setnoblockgetch(); while (g_SvrLink.LinkOK()) { /* switch (mygetch()) { case '?': case 'h': case 'H': printf("\nCommand List:\n"); printf("\t ? or h: display this Help informations!\n"); printf("\t x: To eXit this business unit.\n"); printf("\t d: Display functions status.\n"); printf("\t l: List functions status into <function.lst>.\n"); printf("Enter command to select:\n"); break; case 'x': case 'X': g_SvrLink.bExit = true; continue; break; case 'd': case 'D': ListBPFunctions(NULL); break; case 'l': case 'L': ListBPFunctions("function.lst"); break; } */ TestSQLConnect(); if (pSqlDB->bConnected==0) { mysleep(1000); if (!g_SvrLink.CheckLink()) break; // BCC exit (可能用户发现数据库连接断开,需要维护系统,导致手工将BCC退出同时也需要BU退出) if (SQLConnectToServer()!=0) { // SQL Link error: DEBUG_RUNTIME_MSGOUT("不能正常建立数据库连接, 检查配置和数据库服务器!\n"); } else { DEBUG_RUNTIME_MSGOUT("与数据库连接成功!\n"); } continue; } else g_SvrLink.Processing(&g_BUnit); if (g_SvrLink.bExit) break; } /* ****** Updated by CHENYH at 2004-4-14 11:07:19 ****** 经过测试后,CheckLink()工作正常,测试环境为:BCC(WIN)+BU(WIN),BCC(LINUX)+BU(WIN),BCC(LINUX)+BU(LINUX) while (1) { mysleep(1000); if (!g_SvrLink.CheckLink()) { printf("TEST CHECK LINK return <false>!\n"); break; } } */ g_SvrLink.Close(); closelog(); SQLExit(); DEBUG_RUNTIME_MSGOUT("业务处理单元BU系统正常退出!\n"); g_LogFile.Close(); return(0); }