Yu.ding 3 년 전
부모
커밋
9d88f4f0a4
6개의 변경된 파일1060개의 추가작업 그리고 671개의 파일을 삭제
  1. 1 139
      usr/src/extension_gen.c
  2. 337 0
      usr/src/fail2ban_conf.c
  3. 321 0
      usr/src/fail2ban_rule.bak.c
  4. 292 0
      usr/src/fail2ban_rule.c
  5. 109 19
      usr/src/generate_extension_conf.c
  6. 0 513
      usr/src/generate_group_conf.c copy.bak

+ 1 - 139
usr/src/extension_gen.c

@@ -18,9 +18,7 @@
 #include<mysql/mysql.h>
 #include<mysql/mysqld_error.h>
 #include<mysql/errmsg.h>
-#include <md5.h>
 #include <ctype.h>
-#include <cjson/cJSON.h>
 
 #define EXTEN_GEN_CFG "/etc/asterisk/exten_gen.ini"
 #define USER_WEBRTC_CONFIG_FILE "/etc/asterisk/users_webrtc.conf" 
@@ -74,143 +72,7 @@ void getstring(char *buf,char *db_cfg){
 	strcpy(db_cfg,str1);
 }
 
-//对比license文件 by dingyu
-static int check_license(void)
-{
-	char g_host_name[64];
-	char g_user_name[64] = "root";
-	char g_password[64];
-	char g_db_name[64] = "init_db";
-	char sql[256];
-	const unsigned int g_db_port = 3306;
-    MYSQL *g_conn;
-    MYSQL_RES *g_res;
-    MYSQL_ROW g_row;
-	cJSON *pJson;
-	FILE *fp;		//文件1指针
-	FILE *fp2;		//文件2指针
-	int	line=0;
-	int i;
-	struct MD5Context md5;
-	unsigned char sum[16];
-	char file_str[1024];
-	char file_str2[1024];
-	char file_str3[1024];
-	char sumbuf[128];
-
-    memset(limited_datetime,'\0', sizeof(limited_datetime));
-    memset(serveruuid,'\0',sizeof(serveruuid));
-    strcpy(g_host_name,getenv("MYSQL"));
-    strcpy(g_password,getenv("MYSQL_ROOT_PASSWORD"));
-
-	g_conn = mysql_init(NULL);
-	if(mysql_real_connect(g_conn, g_host_name, g_user_name, g_password, g_db_name, g_db_port, NULL, 0))
-	{
-		/*query the database according the sql*/
-		mysql_query(g_conn, "set names utf8");
-        memset(sql,'\0', sizeof(sql));
-		sprintf(sql, "select * from D_T_S_Z_L where prop_key='SYSTEM_UUID'");
-		if (mysql_real_query(g_conn, sql, strlen(sql)) != 0){
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-		g_res = mysql_store_result(g_conn);
-		if(mysql_num_rows(g_res) == 0){
-			mysql_free_result(g_res); //释放结果
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-		g_row=mysql_fetch_row(g_res);
-
-		if(g_row[2] == NULL){
-			mysql_free_result(g_res); //释放结果
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-        strcpy(serveruuid,g_row[2]);
-		memset(sql,'\0', sizeof(sql));
-		sprintf(sql, "select * from D_T_S_Z_L where prop_key='LIMITED_DATETIME'");
-		if (mysql_real_query(g_conn, sql, strlen(sql)) != 0){
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-		g_res = mysql_store_result(g_conn);
-		if(mysql_num_rows(g_res) == 0){
-			mysql_free_result(g_res); //释放结果
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-		g_row=mysql_fetch_row(g_res);
-
-		if(g_row[2] == NULL){
-			mysql_free_result(g_res); //释放结果
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-        strcpy(limited_datetime,g_row[2]);
-        mysql_free_result(g_res);
-        mysql_close(g_conn);
-        fp=fopen("/music/license","r");//创建的文件
-        if(fp==NULL)
-        {
-            printf("open error\n");
-            return 0;
-        }
-        memset(file_str3,'\0',sizeof(file_str3));
-        if(fgets(file_str3,sizeof(file_str3),fp)){
-            if (file_str3[strlen(file_str3) - 1] == '\n')
-            {
-                file_str3[strlen(file_str3) - 1] = '\0';
-            }
-            pJson =  cJSON_Parse(file_str3);
-            if ( !pJson ) {
-                printf( "parse failed!\n");
-                fclose(fp);
-                return 0;
-            }
-            maxclients = cJSON_GetObjectItem(pJson, "number")->valueint;
-            cJSON_Delete(pJson);
-           
-            memset(file_str,'\0',sizeof(file_str));
-            sprintf(file_str,"%s+%d+8675309-Zycoo-nwcavertingoureyes@Coocenter.com",serveruuid,maxclients);
-            MD5Init(&md5);
-            MD5Update(&md5, (unsigned char *) file_str, strlen(file_str));
-            MD5Final(sum, &md5);
-            char tmp[16];
-            memset(sumbuf,0,sizeof(sumbuf));
-            memset(file_str2,0,sizeof(file_str2));
-            for(i=0;i<16;i++)
-            {
-                memset(tmp,0,sizeof(tmp));
-                sprintf(tmp,"%02x",sum[i]);
-                strcat(sumbuf,tmp);
-            }
-            fp2=fopen("/init/sql/.limited","r");//创建的文件
-            if(fp2==NULL)
-            {
-                printf("open error\n");
-                return 0;
-            }
-            while(fgets(file_str2,sizeof(file_str2),fp2))//逐行循环读取文件,直到文件结束 
-            {
-                line++;
-                if(strstr(file_str2,sumbuf))  //检查字符串是否在该行中,如果在,则输出该行
-                {
-                    fclose(fp2);
-                    return 1;
-                }
-            }
-            fclose(fp2);//关闭文件,结束
-        }
-        fclose(fp);//关闭文件,结束
-    }
-	return 0;
-}
-
 int main(int argc, char *argv[]){
-	if(!check_license()){
-		return 0;
-	}
 	FILE *fp,*fp_cfg;
 	MYSQL_FIELD *exten_field;
 	unsigned int field_count;
@@ -246,7 +108,7 @@ int main(int argc, char *argv[]){
 		switch(*argv[1]){
 			case '0':
 				//res	= mysql_query(&conn,"SELECT * from t_pbx_users_extension order by exten asc");
-				res	= mysql_query(&conn,"SELECT * from t_pbx_users_extension order by exten asc limit 500");
+				res	= mysql_query(&conn,"SELECT * from t_pbx_users_extension order by exten asc");
 				if(res){
 					fprintf(stderr,"SELECT error: %s\n",mysql_error(&conn));
 					return -1;

+ 337 - 0
usr/src/fail2ban_conf.c

@@ -0,0 +1,337 @@
+/*
+============================================================================
+Name        : generate_paging_conf.sh
+Author      : ssc
+Version     : v1.0
+Copyright   : ZYCOO copyright
+Description : Generate paging info from mysql to paging conf file
+============================================================================
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <time.h>
+#include <ctype.h>
+#include <mysql/mysql.h>
+
+MYSQL *g_conn; // mysql 连接
+MYSQL_RES *g_res; // mysql group记录集
+MYSQL_ROW g_row; // 字符串数组,mysql 记录行
+MYSQL_RES *d_res; // mysql device记录集
+MYSQL_ROW d_row; // 字符串数组,mysql 记录行
+
+#define NORMAL_SIZE 256
+#define MAX_SIZE 2048
+#define MIDLE_SIZE 512
+#define MINI_SIZE 64
+#define CONFIG_FILE "/etc/fail2ban/jail.conf"
+#define KEYVALLEN 100
+#define VERSION "V1.0.1"
+
+#define FAIL2BAN_BASIC_SQL "select name,enable,max_retry,find_time,ban_time from t_pbx_fail2ban_basic"
+#define FAIL2BAN_SIP_IGNORED_SQL "select ip,netmask_length from t_pbx_fail2ban_ignored where protocol_sip='1' and enable='1'"
+#define FAIL2BAN_SSH_IGNORED_SQL "select ip,netmask_length from t_pbx_fail2ban_ignored where protocol_ssh='1' and enable='1'"
+
+char g_host_name[MINI_SIZE];
+char g_user_name[MINI_SIZE];
+char g_password[MINI_SIZE];
+char g_db_name[MINI_SIZE];
+const unsigned int g_db_port = 3306;
+
+//读取配置文件函数----功能:删除左边空格
+char *l_trim(char *szOutput, const char *szInput)
+{
+    assert(szInput != NULL);
+    assert(szOutput != NULL);
+    assert(szOutput != szInput);
+    for   (NULL; *szInput != '\0' && isspace(*szInput); ++szInput)
+    {
+        ;
+    }
+    return strcpy(szOutput, szInput);
+}
+
+//   删除右边的空格   
+char *r_trim(char *szOutput, const char *szInput)
+{
+    char *p = NULL;
+    assert(szInput != NULL);
+    assert(szOutput != NULL);
+    assert(szOutput != szInput);
+    strcpy(szOutput, szInput);
+    for(p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p)
+    {
+        ;
+    }
+    *(++p) = '\0';
+    return szOutput;
+}
+
+//   删除两边的空格   
+char *a_trim(char *szOutput, const char *szInput)
+{
+    char *p = NULL;
+    assert(szInput != NULL);
+    assert(szOutput != NULL);
+    l_trim(szOutput, szInput);
+    for   (p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p)
+    {
+        ;
+    }
+    *(++p) = '\0';
+    return szOutput;
+}
+//main函数接口 参数1:配置文件路径 参数2:配置文件的那一部分,如general 参数3:键名 参数4:键值
+int GetProfileString(char *profile, char *AppName, char *KeyName, char *KeyVal )
+{
+    char appname[32], keyname[32];
+    char *buf, *c;
+    char buf_i[KEYVALLEN], buf_o[KEYVALLEN];
+    FILE *fp;
+    int found = 0; /* 1 AppName 2 KeyName */
+    if( (fp = fopen( profile, "r" )) == NULL )
+    {
+        printf( "openfile [%s] error [%s]\n", profile, strerror(errno) );
+        return(-1);
+    }
+    fseek( fp, 0, SEEK_SET );
+    memset( appname, 0, sizeof(appname) );
+    sprintf( appname, "[%s]", AppName );
+
+    while( !feof(fp) && fgets( buf_i, KEYVALLEN, fp ) != NULL )
+    {
+        l_trim(buf_o, buf_i);
+        if( strlen(buf_o) <= 0 )
+            continue;
+        buf = NULL;
+        buf = buf_o;
+
+        if( found == 0 )
+        {
+            if( buf[0] != '[' )
+            {
+                continue;
+            }
+            else if ( strncmp(buf, appname, strlen(appname)) == 0 )
+            {
+                found = 1;
+                continue;
+            }
+
+        }
+        else if( found == 1 )
+        {
+            if( buf[0] == '#' )
+            {
+                continue;
+            }
+            else if ( buf[0] == '[' )
+            {
+                break;
+            }
+            else
+            {
+                if( (c = (char *)strchr(buf, '=')) == NULL )
+                    continue;
+                memset( keyname, 0, sizeof(keyname) );
+
+                sscanf( buf, "%[^=|^ |^\t]", keyname );
+                if( strcmp(keyname, KeyName) == 0 )
+                {
+                    sscanf( ++c, "%[^\n]", KeyVal );
+                    char *KeyVal_o = (char *)malloc(strlen(KeyVal) + 1);
+                    if(KeyVal_o != NULL)
+                    {
+                        memset(KeyVal_o, 0, sizeof(KeyVal_o));
+                        a_trim(KeyVal_o, KeyVal);
+                        if(KeyVal_o && strlen(KeyVal_o) > 0)
+                            strcpy(KeyVal, KeyVal_o);
+                        free(KeyVal_o);
+                        KeyVal_o = NULL;
+                    }
+                    found = 2;
+                    break;
+                }
+                else
+                {
+                    continue;
+                }
+            }
+        }
+    }
+    fclose( fp );
+    if( found == 2 )
+        return(0);
+    else
+        return(-1);
+}
+
+char * mytime(){
+        time_t my_time;
+        time(&my_time);
+        char *time_string = ctime(&my_time);
+        if (time_string[strlen(time_string) - 1] == '\n')
+        {
+                time_string[strlen(time_string) - 1] = '\0';
+        }
+        return time_string;
+}
+
+void print_mysql_error(const char *msg) { // 打印最后一次错误
+if (msg)
+    printf("%s: %s\n", msg, mysql_error(g_conn));
+else
+    puts(mysql_error(g_conn));
+}
+
+int executesql(const char * sql) {
+/*query the database according the sql*/
+if (mysql_real_query(g_conn, sql, strlen(sql))) // 如果失败
+    return -1; // 表示失败
+
+return 0; // 成功执行
+}
+
+
+int init_mysql() { // 初始化连接
+// init the database connection
+g_conn = mysql_init(NULL);
+
+/* connect the database */
+if(!mysql_real_connect(g_conn, g_host_name, g_user_name, g_password, g_db_name, g_db_port, NULL, 0)) // 如果失败
+    return -1;
+
+// 是否连接已经可用
+if (executesql("set names utf8")) // 如果失败
+    return -1;
+
+return 0; // 返回成功
+}
+
+int main(int argc, char **argv) {
+    char in[8] = {0};
+	char tmp[MIDLE_SIZE] = {0};
+	char ignored[MIDLE_SIZE] = {0};
+	char cmd[MIDLE_SIZE] = {0};
+
+    strcpy(g_host_name,getenv("MYSQL"));
+    strcpy(g_user_name,getenv("MYSQL_USER"));
+    strcpy(g_password,getenv("MYSQL_PASSWORD"));
+    strcpy(g_db_name,getenv("MYSQL_DATABASE"));
+
+    if (init_mysql()){
+        print_mysql_error(NULL);
+        exit(1);
+    }
+
+    if (executesql(FAIL2BAN_BASIC_SQL)){
+        print_mysql_error(NULL);
+        exit(1);
+    }
+
+    g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集
+    FILE *conf_fail2ban_fp = fopen(CONFIG_FILE, "w+");
+
+    if (conf_fail2ban_fp == NULL){
+        perror("Open paging conf file Error: ");
+        exit(1);
+    }
+
+    fprintf(conf_fail2ban_fp, "[DEFAULT]\n\
+ignoreip = 127.0.0.1/32\n\
+bantime  = 3600\n\
+maxretry = 3\n\
+backend = auto\n\
+banaction = iptables-multiport\n\
+mta = mail\n\
+protocol = tcp\n\
+chain = INPUT\n\
+action_ = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n\
+action_mw = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n\
+action_mwl = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n\
+action = \%(action_)s\n\n\
+"\
+);
+
+    while ((g_row=mysql_fetch_row(g_res)))
+    { // 打印结果集
+        if (g_row[0] == NULL || g_row[1] == NULL || g_row[2] == NULL || g_row[3] == NULL || g_row[4] == NULL)
+        {
+            printf("some feild is empty!\n");
+            continue;
+        }
+
+        if(strcmp((const char *)g_row[1], "1") == 0)
+            strcpy(in, "true");
+        else
+            strcpy(in, "false");
+
+        if(strcmp((const char*)g_row[0], "sip") == 0){
+            if (executesql(FAIL2BAN_SIP_IGNORED_SQL)){
+                print_mysql_error(NULL);
+                exit(1);
+            }
+            d_res = mysql_store_result(g_conn);
+            memset(ignored,0,sizeof(ignored));
+            while(d_row = mysql_fetch_row(d_res))
+            {
+                strcat(ignored,(char *)d_row[0]);
+                strcat(ignored,"/");
+                strcat(ignored,(char *)d_row[1]);
+                strcat(ignored," ");
+            }
+            fprintf(conf_fail2ban_fp, "[sip-iptables]\n\
+enabled = %s\n\
+ignoreip = 127.0.0.1/32 %s \n\
+filter = sip\n\
+action = iptables-allports[name=VOIP, protocol=all]\n\
+logpath = /var/log/asterisk/messages\n\
+maxretry = %s\n\
+findtime = %s\n\
+bantime = %s\n\n\
+",\
+in, ignored, g_row[2], g_row[3], g_row[4]
+);
+            mysql_free_result(d_res);
+        }
+        else if(strcmp((const char*)g_row[0], "ssh") == 0)
+        {
+            if (executesql(FAIL2BAN_SSH_IGNORED_SQL)){
+                print_mysql_error(NULL);
+                exit(1);
+            }
+            d_res = mysql_store_result(g_conn);
+            memset(ignored,0,sizeof(ignored));
+            while(d_row = mysql_fetch_row(d_res))
+            {
+                strcat(ignored,(char *)d_row[0]);
+                strcat(ignored,"/");
+                strcat(ignored,(char *)d_row[1]);
+                strcat(ignored," ");
+            }
+            fprintf(conf_fail2ban_fp, "[SSH]\n\
+enabled = %s\n\
+ignoreip = 127.0.0.1/32 %s \n\
+port = 22\n\
+filter = sshd\n\
+logpath = /var/log/auth.log\n\
+maxretry = %s\n\
+findtime = %s\n\
+bantime = %s\n\n\
+",\
+in, ignored, g_row[2], g_row[3], g_row[4]
+);
+            mysql_free_result(d_res);
+        }
+    }
+    fclose(conf_fail2ban_fp);
+    mysql_free_result(g_res); // 释放结果集
+    mysql_close(g_conn); // 关闭链接
+    	
+	sprintf(cmd,"echo \"\" > /var/log/auth.log;echo \"\" > /var/log/fail2ban.log ;echo \"\" > /var/log/asterisk/messages;asterisk -rx \"logger reload\";service fail2ban restart");
+
+	system(cmd);
+}

+ 321 - 0
usr/src/fail2ban_rule.bak.c

@@ -0,0 +1,321 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<strings.h>
+#include<string.h>
+#include<mysql/mysql.h>
+#include<mysql/mysqld_error.h>
+#include<stdarg.h>
+#include<ctype.h>
+#include<sys/types.h>  
+#include<ifaddrs.h>  
+#include<netinet/in.h>   
+#include<arpa/inet.h>  
+#include<net/if.h> 
+#include <sys/ioctl.h> 
+#include <sys/socket.h>
+#include <fcntl.h>
+
+#define CONFIG_FILE "/etc/fail2ban/jail.conf"
+#define DBCONFIG "/etc/asterisk/exten_gen.ini"
+#define NETCONFIG "/etc/rc.conf"
+#define WEBCONFIG "/usr/local/rest-server/config/application.properties"
+#define SIZE 256
+#define SIZE_K 1024
+/*该程序的功能是从数据库中读取fail2ban的配置信息然后写到fail2ban的配置文件中然后重启fail2ban服务使配置生效,界面配置fail2ban的时候调用,需要编译*/
+
+char *getconfig(const char *file_path, const char *name)
+{
+	char str[SIZE] = {0};
+	char *p = NULL, *value = NULL;
+	int tmp = 0, len = 0;
+
+	FILE *fp = fopen(file_path, "r");
+	while(fgets(str, SIZE, fp)){
+		if(strstr(str, name)){
+			p = strstr(str, "=");
+			len = p - str;
+			value = malloc(50);
+			bzero(value, 50);
+			while(str[len] != '\n'){
+				if(str[len] == ' ' || str[len] == '='){
+					len++;
+					continue;
+				}else
+					value[tmp++] = str[len++];
+			}
+			//printf("%s : %s\n",name, value);
+			break;
+		}
+		
+	}
+	return value;
+}
+
+MYSQL *connect_mysql(MYSQL *conn)
+{
+	char *dbserver = getconfig(DBCONFIG, "dbserverip");
+	char *dbuser = getconfig(DBCONFIG, "dbuser");
+	char *dbpasswd = getconfig(DBCONFIG, "dbpasswd");
+	char *dbname = getconfig(DBCONFIG, "dbname");
+	mysql_init(conn);
+	if(!mysql_real_connect(conn, dbserver, dbuser, dbpasswd, dbname,0,"",0)){
+		printf("error:%s\n",mysql_error(conn));	
+		return NULL;
+	}
+	if(dbserver)free(dbserver);
+	if(dbuser)free(dbuser);
+	if(dbpasswd)free(dbpasswd);
+	if(dbname)free(dbname);
+	int utf8;  
+	utf8=mysql_query(conn,"set names utf8");  	
+	return conn;
+}
+
+int netmask_str2len(char* mask)
+{
+    int netmask = 0;
+    unsigned int mask_tmp;
+
+    mask_tmp = ntohl((int)inet_addr(mask));
+    while (mask_tmp & 0x80000000)
+    {
+        netmask++;
+        mask_tmp = (mask_tmp << 1);
+    }
+
+    return netmask;    
+}
+
+char * get_addr(char *addr, int flag, char *dev)
+{
+    int sockfd = 0;  
+    struct sockaddr_in *sin;
+    struct ifreq ifr;
+
+    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+    {
+        perror("socket error!\n");
+        return NULL;
+    }
+
+    memset(&ifr, 0, sizeof(ifr));
+    snprintf(ifr.ifr_name, (sizeof(ifr.ifr_name) - 1), "%s", dev);
+
+    if(ioctl(sockfd, flag, &ifr) < 0 )
+    {
+        perror("ioctl error!\n");
+        close(sockfd);
+        return NULL;
+    }
+    close(sockfd);
+
+    sin = (struct sockaddr_in *)&ifr.ifr_addr;
+    snprintf((char *)addr, 32, "%s", inet_ntoa(sin->sin_addr));        
+
+    return addr;
+}
+
+char *get_fb_config(char *buf)
+{
+	MYSQL conn;
+	MYSQL_RES *res;
+	MYSQL_ROW row;
+	MYSQL conn1;
+	MYSQL_RES *res1;
+	MYSQL_ROW row1;
+	char sql[SIZE] = {0};
+	char tmp[SIZE_K*2] = {0};
+	char ignored[SIZE_K*2] = {0};
+	int len1 = 16, len2 = 16, len3 = 16,len4 = 16;
+	char wanip[32] = {0};
+	char lanip[32] = {0};
+	char virip[32] = {0};
+	char virip_lan[32] = {0};
+	char netmask_wan[32] = {0};
+	char netmask_lan[32] = {0};
+	char netmask_vir[32] = {0};
+	char netmask_vir_lan[32] = {0};
+	
+	get_addr(wanip, SIOCGIFADDR,"eth0");
+	get_addr(lanip, SIOCGIFADDR,"eth1");
+	get_addr(virip, SIOCGIFADDR,"eth0:0");
+	get_addr(virip_lan, SIOCGIFADDR,"eth1:0");
+#if 0	
+	get_addr(netmask_wan, SIOCGIFNETMASK,"eth0");
+	get_addr(netmask_lan, SIOCGIFNETMASK,"eth1");
+	get_addr(netmask_vir, SIOCGIFNETMASK,"eth0:0");
+	get_addr(netmask_vir_lan, SIOCGIFNETMASK,"eth1:0");
+	
+	if(strlen(netmask_wan))
+		len1 = netmask_str2len(netmask_wan);
+	
+	if(strlen(netmask_lan))
+		len2 = netmask_str2len(netmask_lan);
+	
+	if(strlen(netmask_vir))
+		len3 = netmask_str2len(netmask_vir);
+	if(strlen(netmask_vir_lan))
+		len4 = netmask_str2len(netmask_vir_lan);
+#endif	
+	/*set default rules*/
+	strcat(buf,"[DEFAULT]\n");
+	strcat(buf,"ignoreip = 127.0.0.1/32\n");
+	strcat(buf,"bantime  = 3600\n");
+	strcat(buf,"maxretry = 3\n");
+	strcat(buf,"backend = auto\n");
+	strcat(buf,"banaction = iptables-multiport\n");
+	strcat(buf,"mta = mail\n");
+	strcat(buf,"protocol = tcp\n");
+	strcat(buf,"chain = INPUT\n");
+	strcat(buf,"action_ = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
+	strcat(buf,"action_mw = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
+	strcat(buf,"action_mwl = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
+	strcat(buf,"action = \%(action_)s\n\n");
+
+	MYSQL *conn_mysql = &conn;
+	if(!connect_mysql(conn_mysql))
+		return 0;
+
+	sprintf(sql, "select name,enable,max_retry,find_time,ban_time from t_fail2ban_basic");
+	if(mysql_real_query(conn_mysql, sql, strlen(sql))){
+		printf("select  data from table t_fail2ban_basic faild !\n");
+		return 0;
+	}
+	res = mysql_store_result(conn_mysql);
+
+	char in[10] = {0};
+
+	MYSQL *conn_mysql1 = &conn1;
+	if(!connect_mysql(conn_mysql1))
+		return 0;
+
+	while(row = mysql_fetch_row(res))
+	{
+		bzero(in, 10);
+		bzero(tmp,strlen(tmp));
+		bzero(ignored,strlen(ignored));
+		if(!strcmp((const char *)row[1], "1"))
+			strcpy(in, "true");
+		else
+			strcpy(in, "false");
+		
+		if(strlen(virip) && strlen(virip_lan))
+			sprintf(ignored,"%s/%d %s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3,virip_lan,len4);
+		else if(strlen(virip))
+			sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3);
+		else if(strlen(virip_lan))
+			sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip_lan,len4);
+		else
+			sprintf(ignored,"%s/%d %s/%d ",wanip,len1, lanip,len2);
+		
+		if(!strcmp((const char*)row[0], "sip")){
+			bzero(sql,strlen(sql));
+			sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_sip='1' and enable='1'");
+			if(mysql_real_query(conn_mysql1, sql, strlen(sql))){
+				printf("select  data from table t_fail2ban_ignored faild !\n");
+				return 0;
+			}
+			res1 = mysql_store_result(conn_mysql1);
+			while(row1 = mysql_fetch_row(res1))
+			{
+				strcat(ignored,(char *)row1[0]);
+				strcat(ignored,"/");
+				strcat(ignored,(char *)row1[1]);
+				strcat(ignored," ");
+			}
+			
+			sprintf(tmp,"[sip-iptables]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nfilter = sip\naction = iptables-allports[name=VOIP, protocol=all]\nlogpath = /var/log/asterisk/messages\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n", in, ignored, row[2], row[3], row[4]);
+			mysql_free_result(res1);
+		}
+		else if(!strcmp((const char*)row[0], "ssh")){
+			bzero(sql,strlen(sql));
+			sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_ssh='1' and enable='1'");
+			if(mysql_real_query(conn_mysql1, sql, strlen(sql))){
+				printf("select  data from table t_fail2ban_ignored faild !\n");
+				return 0;
+			}
+			res1 = mysql_store_result(conn_mysql1);
+			while(row1 = mysql_fetch_row(res1))
+			{
+				strcat(ignored,(char *)row1[0]);
+				strcat(ignored,"/");
+				strcat(ignored,(char *)row1[1]);
+				strcat(ignored," ");
+			}
+			char *sshport = getconfig("/etc/asterisk/service.conf","ssh_port");
+			sprintf(tmp,"[SSH]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nport = %s\nfilter = sshd\nlogpath = /var/log/auth.log\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n",in, ignored, sshport, row[2], row[3], row[4]);
+			free(sshport);
+			mysql_free_result(res1);
+		}
+		else if(!strcmp((const char*)row[0], "https")){
+		#if 1
+			bzero(sql,strlen(sql));
+			sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_https='1' and enable='1'");
+			if(mysql_real_query(conn_mysql1, sql, strlen(sql))){
+				printf("select  data from table t_fail2ban_ignored faild !\n");
+				return 0;
+			}
+			res1 = mysql_store_result(conn_mysql1);
+			while(row1 = mysql_fetch_row(res1))
+			{
+				strcat(ignored,(char *)row1[0]);
+				strcat(ignored,"/");
+				strcat(ignored,(char *)row1[1]);
+				strcat(ignored," ");
+			}
+			char *web_port=getconfig(WEBCONFIG, "server.port");
+			sprintf(tmp,"[HTTPS]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nport = %s\nfilter = https\nlogpath = /var/log/invalid_web_visit.log\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n",in, ignored, web_port, row[2], row[3], row[4]);
+			free(web_port);
+			mysql_free_result(res1);
+		#endif
+		}
+		else if(!strcmp((const char*)row[0], "iax")){
+			bzero(sql,strlen(sql));
+			sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_iax='1' and enable='1'");
+			if(mysql_real_query(conn_mysql1, sql, strlen(sql))){
+				printf("select  data from table t_fail2ban_ignored faild !\n");
+				return 0;
+			}
+			res1 = mysql_store_result(conn_mysql1);
+			while(row1 = mysql_fetch_row(res1))
+			{
+				strcat(ignored,(char *)row1[0]);
+				strcat(ignored,"/");
+				strcat(ignored,(char *)row1[1]);
+				strcat(ignored," ");
+			}
+			sprintf(tmp, "[iax-iptables]\nenabled = %s\nignoreip = 127.0.0.1/32 %s\nfilter = iax2\naction = iptables-allports[name=VOIP, protocol=all]\nlogpath = /var/log/asterisk/messages\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n", in, ignored, row[2], row[3], row[4]);
+			mysql_free_result(res1);
+		}
+		strcat(buf,tmp);
+	}
+	
+	mysql_free_result(res);
+	mysql_close(conn_mysql);
+	mysql_close(conn_mysql1);
+
+	return buf;
+}
+
+
+int main(int argc, char *argv[])
+{
+	char buf[SIZE_K*8]={0};
+	char cmd[SIZE] = {0};
+	FILE *fp = NULL;
+
+#if 1	
+	get_fb_config(buf);
+	printf("%s",buf);
+	fp = fopen(CONFIG_FILE, "w");
+	if(strlen(buf))
+		fputs(buf, fp);
+	fclose(fp);
+	
+	sprintf(cmd,"echo \"\" > /var/log/auth.log;echo \"\" > /var/log/fail2ban.log ;echo \"\" >/var/log/invalid_web_visit.log;echo \"\" > /var/log/asterisk/messages;asterisk -rx \"logger reload\";service fail2ban restart");
+
+	system(cmd);
+#endif
+	return 0;
+}
+

+ 292 - 0
usr/src/fail2ban_rule.c

@@ -0,0 +1,292 @@
+#include<stdio.h>
+#include<stdlib.h>
+#include<strings.h>
+#include<string.h>
+#include<mysql/mysql.h>
+#include<mysql/mysqld_error.h>
+#include<stdarg.h>
+#include<ctype.h>
+#include<sys/types.h>  
+#include<ifaddrs.h>  
+#include<netinet/in.h>   
+#include<arpa/inet.h>  
+#include<net/if.h> 
+#include <sys/ioctl.h> 
+#include <sys/socket.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#define CONFIG_FILE "/etc/fail2ban/jail.conf"
+#define DBCONFIG "/etc/asterisk/exten_gen.ini"
+#define NETCONFIG "/etc/rc.conf"
+#define WEBCONFIG "/usr/local/rest-server/config/application.properties"
+#define SIZE 256
+#define SIZE_K 1024
+/*该程序的功能是从数据库中读取fail2ban的配置信息然后写到fail2ban的配置文件中然后重启fail2ban服务使配置生效,界面配置fail2ban的时候调用,需要编译*/
+
+char *getconfig(const char *file_path, const char *name)
+{
+	char str[SIZE] = {0};
+	char *p = NULL, *value = NULL;
+	int tmp = 0, len = 0;
+
+	FILE *fp = fopen(file_path, "r");
+	while(fgets(str, SIZE, fp)){
+		if(strstr(str, name)){
+			p = strstr(str, "=");
+			len = p - str;
+			value = malloc(50);
+			bzero(value, 50);
+			while(str[len] != '\n'){
+				if(str[len] == ' ' || str[len] == '='){
+					len++;
+					continue;
+				}else
+					value[tmp++] = str[len++];
+			}
+			//printf("%s : %s\n",name, value);
+			break;
+		}
+		
+	}
+	return value;
+}
+
+int connect_mysql(MYSQL *conn)
+{
+	//char *dbserver = getconfig(DBCONFIG, "dbserverip");
+	//char *dbuser = getconfig(DBCONFIG, "dbuser");
+	//char *dbpasswd = getconfig(DBCONFIG, "dbpasswd");
+	//char *dbname = getconfig(DBCONFIG, "dbname");
+	char dbserver[64];
+	char dbuser[64];
+	char dbpasswd[64];
+	char dbname[64];
+	unsigned int dbport = 3306;
+
+	strcpy(dbserver,getenv("MYSQL"));
+	strcpy(dbuser,getenv("MYSQL_USER"));
+	strcpy(dbpasswd,getenv("MYSQL_PASSWORD"));
+	strcpy(dbname,getenv("MYSQL_DATABASE"));
+
+	printf("connect---1\n");
+	conn = mysql_init(NULL);
+	printf("connect---2\n");
+	if(!mysql_real_connect(conn, dbserver, dbuser, dbpasswd, dbname,dbport,NULL,0)){
+		printf("error:%s\n",mysql_error(conn));	
+		return -1;
+	}
+	// 是否连接已经可用
+	if (mysql_query(conn,"set names utf8")) // 如果失败
+		return -1;
+	printf("connect---3\n");
+	return 0;
+}
+
+int netmask_str2len(char* mask)
+{
+    int netmask = 0;
+    unsigned int mask_tmp;
+
+    mask_tmp = ntohl((int)inet_addr(mask));
+    while (mask_tmp & 0x80000000)
+    {
+        netmask++;
+        mask_tmp = (mask_tmp << 1);
+    }
+
+    return netmask;    
+}
+
+char * get_addr(char *addr, int flag, char *dev)
+{
+    int sockfd = 0;  
+    struct sockaddr_in *sin;
+    struct ifreq ifr;
+
+    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+    {
+        perror("socket error!\n");
+        return NULL;
+    }
+
+    memset(&ifr, 0, sizeof(ifr));
+    snprintf(ifr.ifr_name, (sizeof(ifr.ifr_name) - 1), "%s", dev);
+
+    if(ioctl(sockfd, flag, &ifr) < 0 )
+    {
+        perror("ioctl error!\n");
+        close(sockfd);
+        return NULL;
+    }
+    close(sockfd);
+
+    sin = (struct sockaddr_in *)&ifr.ifr_addr;
+    snprintf((char *)addr, 32, "%s", inet_ntoa(sin->sin_addr));        
+
+    return addr;
+}
+
+char *get_fb_config(char *buf)
+{
+	MYSQL *conn;
+	MYSQL_RES *res;
+	MYSQL_ROW row;
+	MYSQL_RES *res1;
+	MYSQL_ROW row1;
+	char sql[SIZE] = {0};
+	char tmp[SIZE_K*2] = {0};
+	char ignored[SIZE_K*2] = {0};
+	int len1 = 16, len2 = 16, len3 = 16,len4 = 16;
+/*
+	char wanip[32] = {0};
+	char lanip[32] = {0};
+	char virip[32] = {0};
+	char virip_lan[32] = {0};
+	char netmask_wan[32] = {0};
+	char netmask_lan[32] = {0};
+	char netmask_vir[32] = {0};
+	char netmask_vir_lan[32] = {0};
+	
+	get_addr(wanip, SIOCGIFADDR,"eth0");
+	get_addr(lanip, SIOCGIFADDR,"eth1");
+	get_addr(virip, SIOCGIFADDR,"eth0:0");
+	get_addr(virip_lan, SIOCGIFADDR,"eth1:0");
+	get_addr(netmask_wan, SIOCGIFNETMASK,"eth0");
+	get_addr(netmask_lan, SIOCGIFNETMASK,"eth1");
+	get_addr(netmask_vir, SIOCGIFNETMASK,"eth0:0");
+	get_addr(netmask_vir_lan, SIOCGIFNETMASK,"eth1:0");
+	
+	if(strlen(netmask_wan))
+		len1 = netmask_str2len(netmask_wan);
+	
+	if(strlen(netmask_lan))
+		len2 = netmask_str2len(netmask_lan);
+	
+	if(strlen(netmask_vir))
+		len3 = netmask_str2len(netmask_vir);
+	if(strlen(netmask_vir_lan))
+		len4 = netmask_str2len(netmask_vir_lan);
+*/
+	/*set default rules
+	strcat(buf,"[DEFAULT]\n");
+	strcat(buf,"ignoreip = 127.0.0.1/32\n");
+	strcat(buf,"bantime  = 3600\n");
+	strcat(buf,"maxretry = 3\n");
+	strcat(buf,"backend = auto\n");
+	strcat(buf,"banaction = iptables-multiport\n");
+	strcat(buf,"mta = mail\n");
+	strcat(buf,"protocol = tcp\n");
+	strcat(buf,"chain = INPUT\n");
+	strcat(buf,"action_ = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
+	strcat(buf,"action_mw = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
+	strcat(buf,"action_mwl = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
+	strcat(buf,"action = \%(action_)s\n\n");
+*/
+	printf("connect mysql!\n");
+	if(connect_mysql(conn))
+		return 0;
+
+	sprintf(sql, "select name,enable,max_retry,find_time,ban_time from t_pbx_fail2ban_basic");
+	if(mysql_real_query(conn, sql, strlen(sql))){
+		printf("select  data from table t_pbx_fail2ban_basic faild !\n");
+		return 0;
+	}
+	printf("sql result for '%s'!\n", sql);
+	res = mysql_store_result(conn);
+
+	char in[10] = {0};
+
+	while(row = mysql_fetch_row(res))
+	{
+		printf("datainfo %s,%s,%s,%s,%s !\n", row[0], row[1], row[2], row[3], row[4]);
+		bzero(in, 10);
+		bzero(tmp,strlen(tmp));
+		bzero(ignored,strlen(ignored));
+		if(!strcmp((const char *)row[1], "1"))
+			strcpy(in, "true");
+		else
+			strcpy(in, "false");
+		
+		/*
+		if(strlen(virip) && strlen(virip_lan))
+			sprintf(ignored,"%s/%d %s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3,virip_lan,len4);
+		else if(strlen(virip))
+			sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3);
+		else if(strlen(virip_lan))
+			sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip_lan,len4);
+		else
+			sprintf(ignored,"%s/%d %s/%d ",wanip,len1, lanip,len2);
+		*/
+		if(!strcmp((const char*)row[0], "sip")){
+			bzero(sql,strlen(sql));
+			sprintf(sql, "select ip,netmask_length from t_pbx_fail2ban_ignored where protocol_sip='1' and enable='1'");
+			if(mysql_real_query(conn, sql, strlen(sql))){
+				printf("select  data from table t_pbx_fail2ban_ignored faild !\n");
+				return 0;
+			}
+			printf("sql result for '%s'!\n", sql);
+			res1 = mysql_store_result(conn);
+			while(row1 = mysql_fetch_row(res1))
+			{
+				strcat(ignored,(char *)row1[0]);
+				strcat(ignored,"/");
+				strcat(ignored,(char *)row1[1]);
+				strcat(ignored," ");
+			}
+			
+			sprintf(tmp,"[sip-iptables]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nfilter = sip\naction = iptables-allports[name=VOIP, protocol=all]\nlogpath = /var/log/asterisk/messages\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n", in, ignored, row[2], row[3], row[4]);
+			mysql_free_result(res1);
+		}
+		else if(!strcmp((const char*)row[0], "ssh")){
+			bzero(sql,strlen(sql));
+			sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_ssh='1' and enable='1'");
+			if(mysql_real_query(conn, sql, strlen(sql))){
+				printf("select  data from table t_fail2ban_ignored faild !\n");
+				return 0;
+			}
+			res1 = mysql_store_result(conn);
+			while(row1 = mysql_fetch_row(res1))
+			{
+				strcat(ignored,(char *)row1[0]);
+				strcat(ignored,"/");
+				strcat(ignored,(char *)row1[1]);
+				strcat(ignored," ");
+			}
+			//char *sshport = getconfig("/etc/asterisk/service.conf","ssh_port");
+			sprintf(tmp,"[SSH]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nport = 22\nfilter = sshd\nlogpath = /var/log/auth.log\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n",in, ignored, row[2], row[3], row[4]);
+			//sprintf(tmp,"[SSH]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nport = %s\nfilter = sshd\nlogpath = /var/log/auth.log\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n",in, ignored, sshport, row[2], row[3], row[4]);
+			//free(sshport);
+			mysql_free_result(res1);
+		}
+		strcat(buf,tmp);
+	}
+	
+	mysql_free_result(res);
+	mysql_close(conn);
+
+	return buf;
+}
+
+
+int main(int argc, char *argv[])
+{
+	char buf[SIZE_K*8]={0};
+	char cmd[SIZE] = {0};
+	FILE *fp = NULL;
+
+#if 1	
+	get_fb_config(buf);
+	printf("%s",buf);
+	fp = fopen(CONFIG_FILE, "w");
+	if(strlen(buf))
+		fputs(buf, fp);
+	fclose(fp);
+	
+	sprintf(cmd,"echo \"\" > /var/log/auth.log;echo \"\" > /var/log/fail2ban.log ;echo \"\" >/var/log/invalid_web_visit.log;echo \"\" > /var/log/asterisk/messages;asterisk -rx \"logger reload\";service fail2ban restart");
+
+	system(cmd);
+#endif
+	return 0;
+}
+

+ 109 - 19
usr/src/generate_extension_conf.c

@@ -33,6 +33,8 @@ MYSQL_ROW g_row; // 字符串数组,mysql 记录行
 #define EXTEN_CALLTRIGGER_FILE "/etc/asterisk/extensions_call_trigger_custom.conf"
 #define EXTEN_FEATURECODES_FILE "/etc/asterisk/extensions_featurecodes_custom.conf"
 #define SIP_NAT_FILE "/etc/asterisk/sip_nat.conf"
+#define SIP_SETTINGS_FILE "/etc/asterisk/sip_settings.conf"
+#define RTP_SETTINGS_FILE "/etc/asterisk/rtp_settings.conf"
 #define KEYVALLEN 100
 #define VERSION "V1.0.1"
 
@@ -408,30 +410,46 @@ if (executesql(QUERY_GLOBAL_SQL)){
 
 g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集
 FILE *conf_inbound_fp = fopen(EXTEN_INBOUND_FILE, "w+");
-FILE *conf_global_fp = fopen(EXTEN_GLOBAL_FILE, "w+");
-FILE *conf_calltrigger_fp = fopen(EXTEN_CALLTRIGGER_FILE, "w+");
-FILE *conf_featurecodes_fp = fopen(EXTEN_FEATURECODES_FILE, "w+");
-FILE *conf_sip_nat_fp = fopen(SIP_NAT_FILE, "w+");
-
 if (conf_inbound_fp == NULL){
-        perror("Open paging conf file Error: ");
-        exit(1);
-    }
+    perror("Open inbound conf file Error: ");
+    exit(1);
+}
 
+FILE *conf_global_fp = fopen(EXTEN_GLOBAL_FILE, "w+");
 if (conf_global_fp == NULL){
-        perror("Open paging conf file Error: ");
-        exit(1);
-    }
+    perror("Open global conf file Error: ");
+    exit(1);
+}
 
+FILE *conf_calltrigger_fp = fopen(EXTEN_CALLTRIGGER_FILE, "w+");
 if (conf_calltrigger_fp == NULL){
-        perror("Open paging conf file Error: ");
-        exit(1);
-    }
+    perror("Open calltrigger conf file Error: ");
+    exit(1);
+}
 
+FILE *conf_featurecodes_fp = fopen(EXTEN_FEATURECODES_FILE, "w+");
 if (conf_featurecodes_fp == NULL){
-        perror("Open paging conf file Error: ");
-        exit(1);
-    }
+    perror("Open featurecodes conf file Error: ");
+    exit(1);
+}
+
+FILE *conf_sip_nat_fp = fopen(SIP_NAT_FILE, "w+");
+if (conf_sip_nat_fp == NULL){
+    perror("Open sip nat conf file Error: ");
+    exit(1);
+}
+
+FILE *conf_sipsetting_fp = fopen(SIP_SETTINGS_FILE, "w+");
+if (conf_sipsetting_fp == NULL){
+    perror("Open sip settings conf file Error: ");
+    exit(1);
+}
+
+FILE *conf_rtpsetting_fp = fopen(RTP_SETTINGS_FILE, "w+");
+if (conf_rtpsetting_fp == NULL){
+    perror("Open rtp settings conf file Error: ");
+    exit(1);
+}
 
     fprintf(conf_inbound_fp, ";!\n\
 ;! Automatically generated configuration file\n\
@@ -483,7 +501,27 @@ mytime()\
     fprintf(conf_sip_nat_fp, ";!\n\
 ;! Automatically generated configuration file\n\
 ;! Filename: sip_nat.conf (/etc/asterisk/sip_nat.conf)\n\
-;! Generator: Generator FEATURECODES\n\
+;! Generator: Generator SIP NAT\n\
+;! Creation Date: %s\n\
+;!\n\n\
+\n",\
+mytime()\
+);
+
+    fprintf(conf_sipsetting_fp, ";!\n\
+;! Automatically generated configuration file\n\
+;! Filename: sip_settings.conf (/etc/asterisk/sip_settings.conf)\n\
+;! Generator: Generator SIP SETTINGS\n\
+;! Creation Date: %s\n\
+;!\n\n\
+\n",\
+mytime()\
+);
+
+    fprintf(conf_rtpsetting_fp, ";!\n\
+;! Automatically generated configuration file\n\
+;! Filename: rtp_settings.conf (/etc/asterisk/rtp_settings.conf)\n\
+;! Generator: Generator RTP SETTINGS\n\
 ;! Creation Date: %s\n\
 ;!\n\n\
 \n",\
@@ -586,7 +624,7 @@ RINGTIME = 30\n\
         }
         else if(strcmp(g_row[1],"pbx.nat.config") == 0){
             pJson = cJSON_Parse(g_row[2]);
-            if(cJSON_GetObjectItem(pJson, "enable")->valueint == 1){
+            if(pJson && cJSON_GetObjectItem(pJson, "enable")->valueint == 1){
                 fprintf(conf_sip_nat_fp, "\
 externaddr = %s\n\
 externhost = %s\n\
@@ -596,6 +634,22 @@ cJSON_GetObjectItem(pJson, "externaddr")->valuestring,\
 cJSON_GetObjectItem(pJson, "externhost")->valuestring,\
 cJSON_GetObjectItem(pJson, "externrefresh")->valueint\
 );
+                if(cJSON_GetObjectItem(pJson, "externtcpport") && cJSON_GetObjectItem(pJson, "externtcpport")->valueint != 0)
+                {
+                    fprintf(conf_sip_nat_fp, "\
+externtcpport = %d\n\
+",\
+cJSON_GetObjectItem(pJson, "externtcpport")->valueint\
+);
+                }
+                if(cJSON_GetObjectItem(pJson, "externtlsport") && cJSON_GetObjectItem(pJson, "externtlsport")->valueint != 0)
+                {
+                    fprintf(conf_sip_nat_fp, "\
+externtlsport = %d\n\
+",\
+cJSON_GetObjectItem(pJson, "externtlsport")->valueint\
+);
+                }
                 cJSON *localnetArray = cJSON_GetObjectItem( pJson, "localnet");
                 if(localnetArray != NULL){
                     int array_size = cJSON_GetArraySize (localnetArray);
@@ -645,6 +699,41 @@ cJSON_GetObjectItem(pJson, "start")->valuestring,\
 cJSON_GetObjectItem(pJson, "stop")->valuestring\
 );
         }
+        else if(strcmp(g_row[1],"pbx.sipsettings.config") == 0){
+            pJson = cJSON_Parse(g_row[2]);
+            if(cJSON_GetObjectItem(pJson, "udp"))
+            {
+                fprintf(conf_sipsetting_fp, "udpbindaddr = 0.0.0.0:%d\n",cJSON_GetObjectItem(pJson, "udp")->valueint);
+            }
+            pSub = cJSON_GetObjectItem(pJson, "tcp");
+            if(pSub && cJSON_GetObjectItem(pSub, "enable")->valueint == 1){
+                fprintf(conf_sipsetting_fp, "\
+tcpenable = yes\n\
+tcpbindaddr = 0.0.0.0:%d\n\
+",\
+cJSON_GetObjectItem(pSub, "port")->valueint\
+);
+            }
+            pSub = cJSON_GetObjectItem(pJson, "tls");
+            if(pSub && cJSON_GetObjectItem(pSub, "enable")->valueint == 1){
+                fprintf(conf_sipsetting_fp, "\
+tlsenable = yes\n\
+tlsbindaddr = 0.0.0.0:%d\n\
+",\
+cJSON_GetObjectItem(pSub, "port")->valueint\
+);
+            }
+            pSub = cJSON_GetObjectItem(pJson, "rtp");
+            if(pSub){
+                fprintf(conf_rtpsetting_fp, "\
+rtpstart = %d\n\
+rtpend = %d\n\
+",\
+cJSON_GetObjectItem(pSub, "start_port")->valueint,\
+cJSON_GetObjectItem(pSub, "end_port")->valueint\
+);
+            }
+        }
         else if(strcmp(g_row[1],"paging.featurecodes.config") == 0){
             pJson = cJSON_Parse(g_row[2]);
             pSub = cJSON_GetObjectItem(pJson, "bargein");
@@ -697,6 +786,7 @@ fclose(conf_global_fp);
 fclose(conf_calltrigger_fp);
 fclose(conf_featurecodes_fp);
 fclose(conf_sip_nat_fp);
+fclose(conf_sipsetting_fp);
 mysql_free_result(g_res); // 释放结果集
 mysql_close(g_conn); // 关闭链接
 cJSON_Delete(pJson);

+ 0 - 513
usr/src/generate_group_conf.c copy.bak

@@ -1,513 +0,0 @@
-/*
-============================================================================
-Name        : generate_paging_conf.sh
-Author      : ssc
-Version     : v1.0
-Copyright   : ZYCOO copyright
-Description : Generate paging info from mysql to paging conf file
-============================================================================
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
-#include <time.h>
-#include <ctype.h>
-#include <cjson/cJSON.h>
-
-#include <mysql/mysql.h>
-
-MYSQL *g_conn; // mysql 连接
-MYSQL_RES *g_res; // mysql group记录集
-MYSQL_ROW g_row; // 字符串数组,mysql 记录行
-MYSQL_RES *d_res; // mysql device记录集
-MYSQL_ROW d_row; // 字符串数组,mysql 记录行
-
-#define MAX_TRUNK_SIZE 256
-#define MAX_SIZE 2048
-#define MIDLE_SIZE 512
-#define MINI_SIZE 64
-#define MYSQL_CONNECT_CONF "/etc/asterisk/exten_gen.ini"
-#define EXTEN_PAGING_FILE "/etc/asterisk/extensions_paging_custom.conf"
-#define EXTEN_EXTENS_FILE "/etc/asterisk/extensions_extens_custom.conf"
-#define EXTEN_IPPHONES_FILE "/etc/asterisk/extensions_phones_custom.conf"
-#define KEYVALLEN 100
-#define VERSION "V1.0.1"
-
-#define QUERY_PAGING_GROUP_SQL "select id,name,exten from t_paging_groups"
-
-char g_host_name[MINI_SIZE];
-char g_user_name[MINI_SIZE];
-char g_password[MINI_SIZE];
-char g_db_name[MINI_SIZE];
-const unsigned int g_db_port = 3306;
-char sql_tmp[MIDLE_SIZE];
-char exten_tmp[MAX_SIZE];
-char dest_tmp[MAX_SIZE];
-
-//读取配置文件函数----功能:删除左边空格
-char *l_trim(char *szOutput, const char *szInput)
-{
-    assert(szInput != NULL);
-    assert(szOutput != NULL);
-    assert(szOutput != szInput);
-    for   (NULL; *szInput != '\0' && isspace(*szInput); ++szInput)
-    {
-        ;
-    }
-    return strcpy(szOutput, szInput);
-}
-
-//   删除右边的空格   
-char *r_trim(char *szOutput, const char *szInput)
-{
-    char *p = NULL;
-    assert(szInput != NULL);
-    assert(szOutput != NULL);
-    assert(szOutput != szInput);
-    strcpy(szOutput, szInput);
-    for(p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p)
-    {
-        ;
-    }
-    *(++p) = '\0';
-    return szOutput;
-}
-
-//   删除两边的空格   
-char *a_trim(char *szOutput, const char *szInput)
-{
-    char *p = NULL;
-    assert(szInput != NULL);
-    assert(szOutput != NULL);
-    l_trim(szOutput, szInput);
-    for   (p = szOutput + strlen(szOutput) - 1; p >= szOutput && isspace(*p); --p)
-    {
-        ;
-    }
-    *(++p) = '\0';
-    return szOutput;
-}
-//main函数接口 参数1:配置文件路径 参数2:配置文件的那一部分,如general 参数3:键名 参数4:键值
-int GetProfileString(char *profile, char *AppName, char *KeyName, char *KeyVal )
-{
-    char appname[32], keyname[32];
-    char *buf, *c;
-    char buf_i[KEYVALLEN], buf_o[KEYVALLEN];
-    FILE *fp;
-    int found = 0; /* 1 AppName 2 KeyName */
-    if( (fp = fopen( profile, "r" )) == NULL )
-    {
-        printf( "openfile [%s] error [%s]\n", profile, strerror(errno) );
-        return(-1);
-    }
-    fseek( fp, 0, SEEK_SET );
-    memset( appname, 0, sizeof(appname) );
-    sprintf( appname, "[%s]", AppName );
-
-    while( !feof(fp) && fgets( buf_i, KEYVALLEN, fp ) != NULL )
-    {
-        l_trim(buf_o, buf_i);
-        if( strlen(buf_o) <= 0 )
-            continue;
-        buf = NULL;
-        buf = buf_o;
-
-        if( found == 0 )
-        {
-            if( buf[0] != '[' )
-            {
-                continue;
-            }
-            else if ( strncmp(buf, appname, strlen(appname)) == 0 )
-            {
-                found = 1;
-                continue;
-            }
-
-        }
-        else if( found == 1 )
-        {
-            if( buf[0] == '#' )
-            {
-                continue;
-            }
-            else if ( buf[0] == '[' )
-            {
-                break;
-            }
-            else
-            {
-                if( (c = (char *)strchr(buf, '=')) == NULL )
-                    continue;
-                memset( keyname, 0, sizeof(keyname) );
-
-                sscanf( buf, "%[^=|^ |^\t]", keyname );
-                if( strcmp(keyname, KeyName) == 0 )
-                {
-                    sscanf( ++c, "%[^\n]", KeyVal );
-                    char *KeyVal_o = (char *)malloc(strlen(KeyVal) + 1);
-                    if(KeyVal_o != NULL)
-                    {
-                        memset(KeyVal_o, 0, sizeof(KeyVal_o));
-                        a_trim(KeyVal_o, KeyVal);
-                        if(KeyVal_o && strlen(KeyVal_o) > 0)
-                            strcpy(KeyVal, KeyVal_o);
-                        free(KeyVal_o);
-                        KeyVal_o = NULL;
-                    }
-                    found = 2;
-                    break;
-                }
-                else
-                {
-                    continue;
-                }
-            }
-        }
-    }
-    fclose( fp );
-    if( found == 2 )
-        return(0);
-    else
-        return(-1);
-}
-
-char * mytime(){
-        time_t my_time;
-        time(&my_time);
-        char *time_string = ctime(&my_time);
-        if (time_string[strlen(time_string) - 1] == '\n')
-        {
-                time_string[strlen(time_string) - 1] = '\0';
-        }
-        return time_string;
-}
-
-void print_mysql_error(const char *msg) { // 打印最后一次错误
-if (msg)
-    printf("%s: %s\n", msg, mysql_error(g_conn));
-else
-    puts(mysql_error(g_conn));
-}
-
-int executesql(const char * sql) {
-/*query the database according the sql*/
-if (mysql_real_query(g_conn, sql, strlen(sql))) // 如果失败
-    return -1; // 表示失败
-
-return 0; // 成功执行
-}
-
-
-int init_mysql() { // 初始化连接
-// init the database connection
-g_conn = mysql_init(NULL);
-
-/* connect the database */
-if(!mysql_real_connect(g_conn, g_host_name, g_user_name, g_password, g_db_name, g_db_port, NULL, 0)) // 如果失败
-    return -1;
-
-// 是否连接已经可用
-if (executesql("set names utf8")) // 如果失败
-    return -1;
-
-return 0; // 返回成功
-}
-
-//对比license文件 by dingyu
-static int check_license(void)
-{
-	char g_host_name[64];
-	char g_user_name[64] = "root";
-	char g_password[64];
-	char g_db_name[64] = "init_db";
-	char sql[256];
-	const unsigned int g_db_port = 3306;
-    MYSQL *g_conn;
-    MYSQL_RES *g_res;
-    MYSQL_ROW g_row;
-	cJSON *pJson;
-	FILE *fp;		//文件1指针
-	FILE *fp2;		//文件2指针
-	int	line=0;
-	int i;
-	struct MD5Context md5;
-	unsigned char sum[16];
-	char file_str[1024];
-	char file_str2[1024];
-	char file_str3[1024];
-	char sumbuf[128];
-
-    memset(limited_datetime,'\0', sizeof(limited_datetime));
-    memset(serveruuid,'\0',sizeof(serveruuid));
-    strcpy(g_host_name,getenv("MYSQL"));
-    strcpy(g_password,getenv("MYSQL_ROOT_PASSWORD"));
-
-	g_conn = mysql_init(NULL);
-	if(mysql_real_connect(g_conn, g_host_name, g_user_name, g_password, g_db_name, g_db_port, NULL, 0))
-	{
-		/*query the database according the sql*/
-		mysql_query(g_conn, "set names utf8");
-        memset(sql,'\0', sizeof(sql));
-		sprintf(sql, "select * from D_T_S_Z_L where prop_key='SYSTEM_UUID'");
-		if (mysql_real_query(g_conn, sql, strlen(sql)) != 0){
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-		g_res = mysql_store_result(g_conn);
-		if(mysql_num_rows(g_res) == 0){
-			mysql_free_result(g_res); //释放结果
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-		g_row=mysql_fetch_row(g_res);
-
-		if(g_row[2] == NULL){
-			mysql_free_result(g_res); //释放结果
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-        strcpy(serveruuid,g_row[2]);
-		memset(sql,'\0', sizeof(sql));
-		sprintf(sql, "select * from D_T_S_Z_L where prop_key='LIMITED_DATETIME'");
-		if (mysql_real_query(g_conn, sql, strlen(sql)) != 0){
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-		g_res = mysql_store_result(g_conn);
-		if(mysql_num_rows(g_res) == 0){
-			mysql_free_result(g_res); //释放结果
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-		g_row=mysql_fetch_row(g_res);
-
-		if(g_row[2] == NULL){
-			mysql_free_result(g_res); //释放结果
-			mysql_close(g_conn); // 关闭链接
-			return 0;
-		}
-        strcpy(limited_datetime,g_row[2]);
-        mysql_free_result(g_res);
-        mysql_close(g_conn);
-        fp=fopen("/music/license","r");//创建的文件
-        if(fp==NULL)
-        {
-            printf("open error\n");
-            return 0;
-        }
-        memset(file_str3,'\0',sizeof(file_str3));
-        if(fgets(file_str3,sizeof(file_str3),fp)){
-            if (file_str3[strlen(file_str3) - 1] == '\n')
-            {
-                file_str3[strlen(file_str3) - 1] = '\0';
-            }
-            pJson =  cJSON_Parse(file_str3);
-            if ( !pJson ) {
-                printf( "parse failed!\n");
-                fclose(fp);
-                return 0;
-            }
-            maxclients = cJSON_GetObjectItem(pJson, "number")->valueint;
-            cJSON_Delete(pJson);
-           
-            memset(file_str,'\0',sizeof(file_str));
-            sprintf(file_str,"%s+%d+8675309-Zycoo-nwcavertingoureyes@Coocenter.com",serveruuid,maxclients);
-            MD5Init(&md5);
-            MD5Update(&md5, (unsigned char *) file_str, strlen(file_str));
-            MD5Final(sum, &md5);
-            char tmp[16];
-            memset(sumbuf,0,sizeof(sumbuf));
-            memset(file_str2,0,sizeof(file_str2));
-            for(i=0;i<16;i++)
-            {
-                memset(tmp,0,sizeof(tmp));
-                sprintf(tmp,"%02x",sum[i]);
-                strcat(sumbuf,tmp);
-            }
-            fp2=fopen("/init/sql/.limited","r");//创建的文件
-            if(fp2==NULL)
-            {
-                printf("open error\n");
-                return 0;
-            }
-            while(fgets(file_str2,sizeof(file_str2),fp2))//逐行循环读取文件,直到文件结束 
-            {
-                line++;
-                if(strstr(file_str2,sumbuf))  //检查字符串是否在该行中,如果在,则输出该行
-                {
-                    fclose(fp2);
-                    return 1;
-                }
-            }
-            fclose(fp2);//关闭文件,结束
-        }
-        fclose(fp);//关闭文件,结束
-    }
-	return 0;
-}
-
-int main(int argc, char **argv) {
-    if(!check_license()){
-        return 0;
-    }
-/*
-memset(g_host_name, 0, sizeof(g_host_name));
-memset(g_user_name, 0, sizeof(g_user_name));
-memset(g_password, 0, sizeof(g_password));
-memset(g_db_name, 0, sizeof(g_db_name));
-
-GetProfileString(MYSQL_CONNECT_CONF, "general", "dbserverip", g_host_name);
-GetProfileString(MYSQL_CONNECT_CONF, "general", "dbuser", g_user_name);
-GetProfileString(MYSQL_CONNECT_CONF, "general", "dbpasswd", g_password);
-GetProfileString(MYSQL_CONNECT_CONF, "general", "dbname", g_db_name);
-*/
-strcpy(g_host_name,getenv("MYSQL"));
-strcpy(g_user_name,getenv("MYSQL_USER"));
-strcpy(g_password,getenv("MYSQL_PASSWORD"));
-strcpy(g_db_name,getenv("MYSQL_DATABASE"));
-if (init_mysql()){
-    print_mysql_error(NULL);
-    exit(1);
-}
-
-if (executesql(QUERY_PAGING_GROUP_SQL)){
-    print_mysql_error(NULL);
-    exit(1);
-}
-
-g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集
-FILE *conf_paging_fp = fopen(EXTEN_PAGING_FILE, "w+");
-FILE *conf_extens_fp = fopen(EXTEN_EXTENS_FILE, "w+");
-FILE *conf_ipphones_fp = fopen(EXTEN_IPPHONES_FILE, "w+");
-
-if (conf_paging_fp == NULL){
-    perror("Open paging conf file Error: ");
-    exit(1);
-}
-
-    fprintf(conf_paging_fp, ";!\n\
-;! Automatically generated configuration file\n\
-;! Filename: extensions_paging_custom.conf (/etc/asterisk/extensions_paging_custom.conf)\n\
-;! Generator: Generator Paging\n\
-;! Creation Date: %s\n\
-;!\n\n\
-",\
-mytime()\
-);
-
-if (conf_extens_fp == NULL){
-    perror("Open extens conf file Error: ");
-    exit(1);
-}
-
-    fprintf(conf_extens_fp, ";!\n\
-;! Automatically generated configuration file\n\
-;! Filename: extensions_extens_custom.conf (/etc/asterisk/extensions_extens_custom.conf)\n\
-;! Generator: Generator Extens\n\
-;! Creation Date: %s\n\
-;!\n\n\
-",\
-mytime()\
-);
-
-if (conf_ipphones_fp == NULL){
-    perror("Open ipphones conf file Error: ");
-    exit(1);
-}
-
-    fprintf(conf_ipphones_fp, ";!\n\
-;! Automatically generated configuration file\n\
-;! Filename: extensions_phones_custom.conf (/etc/asterisk/extensions_phones_custom.conf)\n\
-;! Generator: Generator phones\n\
-;! Creation Date: %s\n\
-;!\n\n\
-",\
-mytime()\
-);
-while ((g_row=mysql_fetch_row(g_res))){ // 打印结果集
-    if (g_row[0] == NULL || g_row[1] == NULL || g_row[2] == NULL){
-        printf("some feild is empty!\n");
-        continue;
-    }
-    fprintf(conf_extens_fp, "[extens-group-%s]\n",g_row[2]);
-    fprintf(conf_ipphones_fp, "[phones-group-%s]\n",g_row[2]);
-    memset(sql_tmp,0,sizeof(sql_tmp));
-    sprintf(sql_tmp,"select exten,type_id,allowed_pa from t_paging_deviceGroups JOIN t_paging_devices on t_paging_devices.id = t_paging_deviceGroups.DeviceId\
-    where GroupId = %s and t_paging_devices.type_id in('1','2','3','5') and t_paging_devices.user_id is NULL",g_row[0]);
-    if (executesql(sql_tmp)){
-        print_mysql_error(NULL);
-        exit(1);
-    }
-    d_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集
-    memset(exten_tmp,0,sizeof(exten_tmp));
-    memset(dest_tmp,0,sizeof(dest_tmp));
-    while ((d_row=mysql_fetch_row(d_res))){ // 打印结果集
-        if (d_row[0] == NULL || d_row[1] == NULL){
-            printf("some feild is empty!\n");
-            continue;
-        }
-        if(strcmp(d_row[2],"yes") == 0){
-            sprintf(exten_tmp, "%sSIP/%s&", exten_tmp, d_row[0]);
-            sprintf(dest_tmp, "%s%s|", dest_tmp, d_row[0]);
-        }
-        
-        int id = atoi(d_row[1]);
-        switch(id){
-            case 1:
-                fprintf(conf_extens_fp, "exten => %s,1,Macro(page,%s,SIP/%s)\n",d_row[0],d_row[0],d_row[0]);
-                break;
-            case 2:
-                fprintf(conf_extens_fp, "exten => %s,1,Macro(intercom,%s,SIP/%s)\n",d_row[0],d_row[0],d_row[0]);
-                break;
-            case 3:
-            case 7:
-                fprintf(conf_ipphones_fp, "exten => %s,1,Macro(stdexten,%s,SIP/%s)\n",d_row[0],d_row[0],d_row[0]);
-                break;
-        }
-    }
-    if(strlen(exten_tmp) > 0){
-        exten_tmp[strlen(exten_tmp) - 1] = '\0';
-        dest_tmp[strlen(dest_tmp) - 1] = '\0';
-    }
-
-    fprintf(conf_extens_fp, "\n");
-
-    fprintf(conf_paging_fp, "\
-[paging-group-%s]\n\
-exten => %s,1,NoOp(%s)\n\
-same => n,MSet(__SRCEXTEN=${CALLERID(num)},__DESTS=%s,DATE=${STRFTIME(${EPOCH},,%%Y%%m%%d)},__UUID=${UNIQUEID},ALERTINFO=Alert-Info: Ring Answer,CALLINFO=Call-Info: <uri>\\;answer-after=0)\n\
-same => n,SIPAddHeader(${ALERTINFO})\n\
-same => n,SIPAddHeader(${CALLINFO})\n\
-same => n,System(/bin/sh /etc/scripts/shell_scripts.sh mkrcdir paging ${DATE})\n\
-same => n,Set(FILENAME=paging/${DATE}/paging-${SRCEXTEN}-${UUID}.wav)\n\
-same => n,MixMonitor(${FILENAME},b)\n\
-same => n,Macro(get-user-level,${SRCEXTEN},)\n\
-same => n,AGI(agi://${AGISERVERHOST}:${AGISERVERPORT},paging,${DESTS},${SESSION_LEVEL},${SESSION_USERID})\n\
-same => n,ExecIf(${ISNULL(${DESTS})}?Hangup())\n\
-same => n,ExecIf($['foo${enPaging_prompt_start}'='fooyes']?Set(STARTPROMPT=qA(${Paging_start_file})))\n\
-same => n,UserEvent(controlEvent,sessionlevel:${SESSION_LEVEL},sessionuserid:${SESSION_USERID},src:${SRCEXTEN},dest:${DESTS},uuid:${UUID},status:stop)\n\
-same => n,Wait(1)\n\
-same => n,GotoIf(${ISNULL(${DESTCHANS})}?default)\n\
-same => n,MSet(startT=${STRFTIME(${EPOCH},,%%s)},__CALLEE=${DESTS},__calltype=paging)\n\
-same => n,Page(${DESTCHANS},b(paging-update-status^s^1)${STARTPROMPT})\n\
-same => n,Hangup\n\
-same => n(default),Page(%s,b(paging-update-status^s^1)${STARTPROMPT})\n\
-same => n,Hangup\
-\n\n", \
-g_row[2],\
-g_row[2],\
-g_row[1],\
-dest_tmp,\
-exten_tmp\
-);
-    }
-fclose(conf_paging_fp);
-fclose(conf_extens_fp);
-mysql_free_result(g_res); // 释放结果集
-mysql_free_result(d_res);
-mysql_close(g_conn); // 关闭链接
-}