/* ============================================================================ Name : generate_context_conf.sh Author : ssc Version : v1.0 Copyright : ZYCOO copyright Description : Generate context info from mysql to context conf file ============================================================================ */ #include #include #include #include #include #include #include #include #include MYSQL *g_conn; // mysql 连接 MYSQL_RES *g_res; // mysql intercom记录集 MYSQL_ROW g_row; // 字符串数组,mysql 记录行 MYSQL_RES *d_res; // mysql phone记录集 MYSQL_ROW d_row; // 字符串数组,mysql 记录行 #define MAX_TRUNK_SIZE 256 #define MAX_SIZE 1024 #define MIDLE_SIZE 512 #define MINI_SIZE 64 #define MYSQL_CONNECT_CONF "/etc/asterisk/exten_gen.ini" #define EXTEN_CONTEXT_FILE "/etc/asterisk/extensions_context_custom.conf" #define EXTEN_USERS_CONTEXT_FILE "/etc/asterisk/extensions_users_context_custom.conf" #define EXTEN_USERS_GLOBAL_FILE "/etc/asterisk/extensions_users_global_custom.conf" #define KEYVALLEN 100 #define VERSION "V1.0.1" #define QUERY_INTERCOM_SQL "select id,exten from t_paging_devices where type_id in('2','5')" #define QUERY_IPPHONE_SQL "select id,exten,user_id from t_paging_devices where type_id in('3','6')" 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[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; // 返回成功 } int main(int argc, char **argv) { /* 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")); FILE *conf_fp = fopen(EXTEN_CONTEXT_FILE, "w+"); FILE *conf_users_fp = fopen(EXTEN_USERS_CONTEXT_FILE, "w+"); FILE *global_fp = fopen(EXTEN_USERS_GLOBAL_FILE, "w+"); if (conf_fp == NULL){ perror("Open context conf file Error: "); exit(1); } fprintf(conf_fp, ";!\n\ ;! Automatically generated configuration file\n\ ;! Filename: extensions_context_custom.conf (/etc/asterisk/extensions_context_custom.conf)\n\ ;! Generator: Generator Context\n\ ;! Creation Date: %s\n\ ;!\n\n\ ",\ mytime()\ ); if (conf_users_fp == NULL){ perror("Open context conf file Error: "); exit(1); } fprintf(conf_users_fp, ";!\n\ ;! Automatically generated configuration file\n\ ;! Filename: extensions_users_context_custom.conf (/etc/asterisk/extensions_users_context_custom.conf)\n\ ;! Generator: Generator User Context\n\ ;! Creation Date: %s\n\ ;!\n\n\ [DialRule_users]\n\ ",\ mytime()\ ); if (global_fp == NULL){ perror("Open context conf file Error: "); exit(1); } fprintf(global_fp, ";!\n\ ;! Automatically generated configuration file\n\ ;! Filename: extensions_users_global_custom.conf (/etc/asterisk/extensions_users_global_custom.conf)\n\ ;! Generator: Generator User Global\n\ ;! Creation Date: %s\n\ ;!\n\n\ ",\ mytime()\ ); if (init_mysql()){ print_mysql_error(NULL); exit(1); } //将所有类型为对讲终端的设备赋予所在group的权限。 if (executesql(QUERY_INTERCOM_SQL)){ print_mysql_error(NULL); exit(1); } g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while ((g_row=mysql_fetch_row(g_res))){ // 打印结果集 if (g_row[0] == NULL || g_row[1] == NULL){ printf("some feild is empty!\n"); continue; } int setout = 1; fprintf(conf_fp, "[DialRule_%s]\n",g_row[1]); fprintf(conf_fp, "include => cdr-action\n"); fprintf(conf_fp, "include => call-trigger\n"); memset(sql_tmp,0,sizeof(sql_tmp)); //获取对讲终端所在队列的号码 sprintf(sql_tmp,"select exten from t_paging_deviceGroups JOIN t_paging_groups on t_paging_groups.id = t_paging_deviceGroups.GroupId where DeviceId = %s",g_row[0]); if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } d_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while ((d_row=mysql_fetch_row(d_res))){ // 打印结果集 if (d_row[0] == NULL){ printf("some feild is empty!\n"); continue; } fprintf(conf_fp, "include => extens-group-%s\n", d_row[0]); fprintf(conf_fp, "include => phones-group-%s\n", d_row[0]); } memset(sql_tmp,0,sizeof(sql_tmp)); //获取对讲终端所在队列的管理员ID sprintf(sql_tmp,"select UserId from t_paging_deviceGroups JOIN t_paging_userGroups on t_paging_deviceGroups.GroupId = t_paging_userGroups.GroupId where DeviceId = %s group by UserId",g_row[0]); if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } d_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while ((d_row=mysql_fetch_row(d_res))){ // 打印结果集 if (d_row[0] == NULL){ printf("some feild is empty!\n"); continue; } int q = 100000 + atoi(d_row[0]); fprintf(conf_fp, "include => manager-queue-%d\n", q); } memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"select exten from t_paging_groups JOIN t_paging_userGroups on\ t_paging_groups.id = t_paging_userGroups.GroupId where t_paging_userGroups.UserId\ in(select UserId from t_paging_deviceGroups JOIN t_paging_userGroups on\ t_paging_deviceGroups.GroupId = t_paging_userGroups.GroupId where DeviceId = %s) group by exten",g_row[0]); if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } d_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while ((d_row=mysql_fetch_row(d_res))){ // 打印结果集 if (d_row[0] == NULL){ printf("some feild is empty!\n"); continue; } fprintf(conf_fp, "include => paging-group-%s\n", d_row[0]); } } //IP话机根据所绑定的用户赋予所在group的权限。 if (executesql(QUERY_IPPHONE_SQL)){ print_mysql_error(NULL); exit(1); } g_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while ((g_row=mysql_fetch_row(g_res))){ // 打印结果集 if (g_row[0] == NULL || g_row[1] == NULL){ printf("some feild is empty!\n"); continue; } int setout = 1; fprintf(conf_fp, "[DialRule_%s]\n",g_row[1]); fprintf(conf_fp, "include => cdr-action\n"); fprintf(conf_fp, "include => featurecodes\n"); //获取对讲终端所在队列的号码 memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"select exten from t_paging_deviceGroups JOIN t_paging_groups on t_paging_groups.id = t_paging_deviceGroups.GroupId where DeviceId = %s",g_row[0]); if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } d_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while ((d_row=mysql_fetch_row(d_res))){ // 打印结果集 if (d_row[0] == NULL){ printf("some feild is empty!\n"); continue; } fprintf(conf_fp, "include => phones-group-%s\n", d_row[0]); fprintf(conf_fp, "include => paging-group-%s\n", d_row[0]); } if(g_row[2]){ memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"select t_paging_users.id,t_paging_users.level from t_paging_users join t_paging_devices on t_paging_users.id = t_paging_devices.user_id\ where t_paging_devices.exten=%s",g_row[1]); //查询分机号所属的用户ID和等级 if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } d_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while((d_row=mysql_fetch_row(d_res))){ if (d_row[0] == NULL || d_row[1] == NULL){ printf("some feild is empty!\n"); continue; } fprintf(conf_fp, "include => DialRule_users\n"); fprintf(conf_users_fp, "exten => %s,1,Macro(stdexten,%s,SIP/%s)\n",g_row[1],g_row[1],g_row[1]); fprintf(global_fp, "USER_ID_%s = %s\n",g_row[1],d_row[0]); fprintf(global_fp, "USER_LEVEL_%s = %s\n",g_row[1],d_row[1]); } memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"select exten,t_paging_userServices.tPagingServiceId as service_id from t_paging_groups\ JOIN t_paging_userGroups on t_paging_groups.id = t_paging_userGroups.GroupId\ JOIN t_paging_userServices on t_paging_userServices.UserId = t_paging_userGroups.UserId\ where t_paging_userServices.tPagingServiceId in(1,4,7,9) and t_paging_userGroups.UserId\ in(select t_paging_users.id from t_paging_users join t_paging_devices on t_paging_users.id = t_paging_devices.user_id\ where t_paging_devices.exten=%s) order by t_paging_userServices.tPagingServiceId",g_row[1]); //查询分机所属管理员的权限以及所管理的组 if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } d_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while ((d_row=mysql_fetch_row(d_res))){ // 打印结果集 if (d_row[0] == NULL || d_row[1] == NULL){ printf("some feild is empty!\n"); continue; } int id = atoi(d_row[1]); switch(id){ case 1: fprintf(conf_fp, "include => paging-group-%s\n", d_row[0]); break; case 4: fprintf(conf_fp, "include => extens-group-%s\n", d_row[0]); break; case 7: fprintf(conf_fp, "include => call-trigger\n"); break; case 9: if(setout){ fprintf(conf_fp, "include => CallingRule_OutCall\n"); setout = 0; } break; } } }else{ memset(sql_tmp,0,sizeof(sql_tmp)); sprintf(sql_tmp,"select UserId from t_paging_deviceGroups JOIN t_paging_userGroups on t_paging_deviceGroups.GroupId = t_paging_userGroups.GroupId where DeviceId = %s group by UserId",g_row[0]); if (executesql(sql_tmp)){ print_mysql_error(NULL); exit(1); } d_res = mysql_store_result(g_conn); // 从服务器传送结果集至本地,mysql_use_result直接使用服务器上的记录集 while ((d_row=mysql_fetch_row(d_res))){ // 打印结果集 if (d_row[0] == NULL){ printf("some feild is empty!\n"); continue; } int q = 100000 + atoi(d_row[0]); fprintf(conf_fp, "include => manager-queue-%d\n", q); } } } fclose(conf_fp); fclose(conf_users_fp); fclose(global_fp); mysql_free_result(g_res); // 释放结果集 mysql_free_result(d_res); // 释放结果集 mysql_close(g_conn); // 关闭链接 }