📄 .#loadaccount.pc.1.9
字号:
/************************************************************ * FileName: loadAccount.pc * Author: Jay * Date: 2004.05.21 * Version: V01.00.00.00 * Description: 1.读取要监控的Radius帐号和固定IP到共享内存中, * 2.定时扫描共享内存,处理那些不正常下线的帐号 * 3. * ************************************************************/#include <stdio.h>#include <iostream.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#include "loadAccount.h"#include "RtRadiusIP.h"#include "Config.h"#include "Log.h"#include "Tools.h"EXEC SQL INCLUDE sqlca;EXEC ORACLE OPTION (RELEASE_CURSOR = YES);#define SQLCODE sqlca.sqlcode#define SQLNOTFOUND 1403void usage (const char* _str){ printf("usage:%s <config file>\n",_str);}bool oracle_error(const char* _str){ int intSqlCode = SQLCODE; if (intSqlCode < 0) { cout <<_str<<SQLCODE << endl; cout << sqlca.sqlerrm.sqlerrmc << endl; writelog("%s,code:%ld,%s",_str,SQLCODE,sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK RELEASE; exit(-1); } return false;}int connectDB(const char* cname,const char* cpass){ EXEC SQL BEGIN DECLARE SECTION; char vc_name[32]=""; char vc_pass[32]=""; char vc_server[32]=""; EXEC SQL END DECLARE SECTION; if(cname==NULL || strlen(cname)>=32) { printf("用户名:[%s]不符合规范!\n"); writelog("用户名:[%s]不符合规范!\n"); return -1; } if(cpass==NULL || strlen(cpass)>=32) { printf("密码:[%s]不符合规范!\n"); writelog("密码:[%s]不符合规范!\n"); return -1; } strcpy(vc_name,cname); strcpy(vc_pass,cpass); EXEC SQL CONNECT :vc_name IDENTIFIED BY :vc_pass ; return 0;}int main (int argc,const char* argv[]){ if(argc!=2) { usage(argv[0]); return -1; } EXEC SQL WHENEVER SQLERROR DO oracle_error("ORACLE ERROR: "); EXEC SQL BEGIN DECLARE SECTION; char sql_account[100]=""; char sql_ip[20]=""; int sql_id=0; EXEC SQL END DECLARE SECTION; CConfig cfg; if(cfg.ReadConfig(argv[1]) !=0) { printf("打开配置文件[%s]失败!\n",argv[1]); exit(1); }; char dbuser[255]; memset(dbuser,0x00,sizeof(dbuser)); if(cfg.GetItemValue("DB","name",dbuser)!=0) { printf("配置文件格式错误,读取数据库用户名失败! [DB]:name\n"); exit(1); } char dbpasswd[255]; memset(dbpasswd,0x00,sizeof(dbpasswd)); if(cfg.GetItemValue("DB","passwd",dbpasswd)!=0) { printf("配置文件格式错误,读取数据库密码失败! [DB]:passwd\n"); exit(1); } char tmp[255]; int key,size; if (cfg.GetItemValue("IPWATCH","key",tmp)!=0) { printf("配置文件格式错误,读取共享内存key失败! [IPWATCH]:key\n"); exit(1); } key = atoi (tmp); if ( key <= 0) { printf("配置文件格式错误,[IPWATCH]:key必须为大于0的整数!\n"); exit(1); } if (cfg.GetItemValue("IPWATCH","size",tmp)!=0) { printf("配置文件格式错误,读取共享内存SIZE失败! [IPWATCH]:size\n"); exit(1); } size = atoi (tmp); if ( size <= 0) { printf("配置文件格式错误,[IPWATCH]:size必须为大于0的整数(单位Mb)!\n"); exit(1); } size = size*1024*1024; if(openlog("../log/loadAccount.log")!=0) { exit(1); } CRtRdsIP myrt; if (myrt.init(key,size)!=0) { writelog("初始化共享内存失败!"); printf("初始化共享内存失败!\n"); return -1; } myrt.reset(); writelog("初始化共享内存完成,连接数据库..."); if (connectDB(dbuser,dbpasswd)!=0) { printf("连接数据库失败!程序退出!\n"); writelog("connect database fail!process quit!\n"); exit(1); } writelog("连接数据库成功!"); //读取要监控的Radius帐号 EXEC SQL declare cur_account SCROLL cursor for select AAC_ID,AAC_ACCOUNT from TR_T_AIMEDACCOUNT; EXEC SQL declare cur_staticip SCROLL cursor for select ASI_ID,ASI_IPADDRESS from TR_T_AIMEDSTATICIP; EXEC SQL open cur_account; while(true) { EXEC SQL FETCH cur_account into :sql_id,:sql_account; if(SQLCODE == SQLNOTFOUND) break; CTools::rtrim(sql_account); if (myrt.addAccount(sql_account)!=0) { writelog("读取帐号[%s]失败!",sql_account); EXEC SQL CLOSE cur_account; EXEC SQL ROLLBACK WORK RELEASE; return -1; } //begin debug printf("add account:[%s]\n",sql_account); //end debug } EXEC SQL CLOSE cur_account; //增加要监控的静态IP ulong uip; struct in_addr inaddr; EXEC SQL open cur_staticip; while(true) { EXEC SQL FETCH cur_staticip into :sql_id,:sql_ip; if(SQLCODE == SQLNOTFOUND) break; printf("add ip:[%s][%u]\n",sql_ip,inaddr.s_addr); CTools::rtrim(sql_ip); if (inet_aton (sql_ip,&inaddr) == 0) { writelog("IP地址[%s] 转换失败!",sql_ip); EXEC SQL CLOSE cur_staticip; EXEC SQL ROLLBACK WORK RELEASE; return -1; } if (myrt.addStaticIP(inaddr.s_addr)!=0) { writelog("增加监控IP[%s]失败!",sql_ip); EXEC SQL CLOSE cur_staticip; EXEC SQL ROLLBACK WORK RELEASE; return -1; } printf("add ip:[%s][%u]\n",sql_ip,inaddr.s_addr); } EXEC SQL CLOSE cur_staticip; EXEC SQL ROLLBACK WORK RELEASE; //载入数据完毕,转入维护阶段 while(true) { sleep(5); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -