/*** 2016.1.20 support Chinese utf8 2016.4.5 support wmi gen ,by zhi.qin changed 2016.06.24 modify codec prioty. 2016.07.01 modify _F1 field 2016.07.27 add _opus for opus _vp8 for vp8 ,extensions and webrtc 2016.09.26 add _F2 field for EX16S MAC storage 2016.11.21 modify _F2 to _exmacaddr ,add _exdahdichan 在users_extension新增字段: _exmacaddr (原来的_F2) not use 在users_extension新增字段: _exdahdichan (原来的_F3) not use 在users_extension新增字段:_vp8 在users_extension新增字段:_opus ***/ #include #include #include #include #include #include #define EXTEN_GEN_CFG "/etc/asterisk/exten_gen.ini" #define USER_WEBRTC_CONFIG_FILE "/etc/asterisk/users_webrtc.conf" MYSQL conn; MYSQL_RES *res_exten; MYSQL_ROW exten_row; char corr_str[20]; void connection(const char *host,const char *user,const char *password,const char *database){ mysql_init(&conn); if(mysql_real_connect(&conn,host,user,password,database,3306,NULL,0)){ mysql_set_character_set(&conn,"utf8"); printf("Connection success!\n"); }else{ fprintf(stderr,"Connection failed!\n"); if(mysql_errno(&conn)){ fprintf(stderr,"Connection error %d: %s\n",mysql_errno(&conn),mysql_error(&conn)); } exit -1; } } /* *file exten_gen.ini *dbserverip= *dbuser= *dbpasswd= *dbname= */ void getstring(char *buf,char *db_cfg){ char str1[100],str2[100],*tmp; int len; strcpy(str1,buf); tmp=strchr(str1,'='); strcpy(str2,tmp); if (isspace(str2[1])) strcpy(str1,&str2[2]); else strcpy(str1,&str2[1]); len=strlen(str1); if(str1[len-2] == '\r') str1[len-2]='\0'; else if(str1[len-1] == '\n') str1[len-1]='\0'; else str1[len]='\0'; //printf("str1=%s\n",str1); strcpy(db_cfg,str1); } int main(int argc, char *argv[]){ FILE *fp,*fp_cfg; MYSQL_FIELD *exten_field; unsigned int field_count; unsigned int i; //int dahdichan_en = 0; char *field_name = NULL; char codecs[100] = {0},dahdichan[10] = {0},buffer[100] = {0};//,db_cfg[4][30]; char *code_addr = NULL;//,*dbserverip = NULL,*dbuser = NULL,*dbpasswd = NULL,*dbname = NULL; char new_codecs[20][100]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; if ((fp_cfg=fopen(EXTEN_GEN_CFG,"r"))==NULL) { printf("File: %s is not open ,fail.\n",EXTEN_GEN_CFG); return -1; } /* while(fgets(buffer,100,fp_cfg)){ if(!strncasecmp(buffer,"dbserverip",10)) getstring(buffer,db_cfg[0]); if(!strncasecmp(buffer,"dbuser",6)) getstring(buffer,db_cfg[1]); if(!strncasecmp(buffer,"dbpasswd",8)) getstring(buffer,db_cfg[2]); if(!strncasecmp(buffer,"dbname",6)) getstring(buffer,db_cfg[3]); } */ char *hostname = getenv("MYSQL"); char *username = getenv("MYSQL_USER"); char *password = getenv("MYSQL_PASSWORD"); char *dbname = getenv("MYSQL_DATABASE"); connection(hostname,username,password,dbname); int res ; if(NULL != argv[1]){ switch(*argv[1]){ case '0': 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; }else{ res_exten = mysql_store_result(&conn); if(res_exten){ printf("Recieved %lu rows\n",(unsigned long)mysql_num_rows(res_exten)); } if(!(fp = fopen("/etc/asterisk/users_extension.conf","w+"))){ printf("Creating extension config file failed,please check it.\n"); return -1; } field_count = mysql_num_fields(res_exten); printf("field_count = %d\n",field_count); while(exten_row = mysql_fetch_row(res_exten)){ memset(codecs,0,sizeof(codecs)); // dahdichan_en = 0; // printf("....%s...\n",codecs[0]); for (i=0;i<20;i++) { memset(new_codecs[i],0,sizeof(new_codecs[i])); } //mysql_field_seek(res_exten,0);//point to the first field. for(i=0;iname,"id",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"createdAt",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"updatedAt",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"exten",strlen(exten_field->name))){ fprintf(fp,"[%s]\n",exten_row[i]); continue; } #if 0 //support EX16S if(!strncasecmp(exten_field->name,"_dahdichan",strlen(exten_field->name))){ if (strlen(exten_row[i]) > 0 ) strcpy(dahdichan,exten_row[i]);//save dahdi chan num continue; } if(!strncasecmp(exten_field->name,"_exmacaddr",strlen(exten_field->name))){ if (strlen(exten_row[i]) > 15) dahdichan_en = 1; continue; } #endif //end support //add acl for extensions if(!strncasecmp(exten_field->name,"F1",strlen(exten_field->name))){ if(!strncasecmp(exten_row[i],"remote",6)) { fprintf(fp,"acl = remote_extensions_acl\n"); } else fprintf(fp,"acl = local_extensions_acl\n"); continue; } if(!strncasecmp(exten_field->name,"F2",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"F3",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"F4",strlen(exten_field->name))) continue; //add codecs to cfg file. if(!strncasecmp(exten_field->name,"alaw",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"ulaw",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"g729",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"g726",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"g722",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"gsm",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"speex",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"opus",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"h261",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"h263",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"h263p",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"h264",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(!strncasecmp(exten_field->name,"vp8",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue; } else continue; } if(0 == strlen(exten_row[i])){ if(!strncasecmp(exten_field->name,"secret",strlen(exten_field->name))) ; else if(!strncasecmp(exten_field->name,"_vmsecret",strlen(exten_field->name))) ; else continue; } field_name = exten_field->name; //add by zhi.qin if(!strncasecmp(exten_field->name,"mailbox",strlen(exten_field->name))) { if(0 < strlen(exten_row[i]) && !strstr(exten_row[i],"@")){ fprintf(fp,"%s = %s@default\n",field_name,exten_row[i]); continue; } }//end 2016.04.05 //printf("%s = %s\n",field_name,exten_row[i]); fprintf(fp,"%s = %s\n",field_name,exten_row[i]); } // printf("codecs len %d\n",strlen(codecs)); // if(strlen(codecs) <= 4){ // printf("something wrong happened to codecs selection.\n"); // exit -1; // } // codecs[strlen(codecs)-1] = '\0'; // printf("codecs = %s\n",code_addr); fputs("disallow = all\n",fp); //process new_codecs for (i=0;i<20;i++) { if (new_codecs[i][0] != '\0') if (codecs[0] != '\0' ) strcat(codecs,","); code_addr = strcat(codecs,new_codecs[i]); } //printf("codecs = %s\n",code_addr); fprintf(fp,"allow = %s\n",code_addr); //if ( (dahdichan_en == 1) && (strlen(dahdichan) > 0) ) // fprintf(fp,"dahdichan = %s\n",dahdichan); fprintf(fp,"subscribemwi = no\n");//add by zhi.qin for sub mwi //fprintf(fp,"allow = %s\n",code_addr); fprintf(fp,"read = NULL\nwrite = NULL\n\n");//refuese sip exten permit access } } fclose(fp); break; case '1': res = mysql_query(&conn,"SELECT * from t_pbx_users_webrtc order by exten asc"); if(res){ fprintf(stderr,"SELECT error: %s\n",mysql_error(&conn)); return -1; }else{ res_exten = mysql_store_result(&conn); if((fp=fopen(USER_WEBRTC_CONFIG_FILE,"w+"))==NULL) {printf( "cannot open %s file,please check.\n",USER_WEBRTC_CONFIG_FILE);return -1;} fputs("[webrtc](!)\n",fp); fputs("srtpcapable = yes\n",fp); fputs("encryption = yes\n",fp); fputs("avpf = yes\n",fp); fputs("rtcp_mux = yes\n",fp); fputs("force_avp = yes\n",fp); fputs("icesupport = yes\n",fp); fputs("dtlsenable = yes\n",fp); fputs("dtlsverify = no\n",fp); fputs("dtlscertfile = /etc/asterisk/keys/asterisk.pem\n",fp); fputs("dtlscafile = /etc/asterisk/keys/ca.crt\n",fp); fputs("dtlssetup = actpass\n",fp); fputs("transport = ws,wss\n",fp); fputs("videosupport = no\n\n",fp); fputs("rtcp_mux = yes\n\n",fp); field_count = mysql_num_fields(res_exten); printf("field_count = %d\n",field_count); while(exten_row = mysql_fetch_row(res_exten)){ memset(codecs,0,sizeof(codecs)); // printf("....%s...\n",codecs[0]); //mysql_field_seek(res_exten,0);//point to the first field. for (i=0;i<20;i++) { memset(new_codecs[i],0,sizeof(new_codecs[i])); } for(i=0;iname,"id",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"exten",strlen(exten_field->name))){ fprintf(fp,"[%s](webrtc)\n",exten_row[i]); continue; } if(!strncasecmp(exten_field->name,"F1",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"F2",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"F3",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"F4",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"email",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"dahdichan",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"hasexten",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"directmedia",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"videosupport",strlen(exten_field->name))) continue; #if 0 //del 2015.11.19 if(!strncasecmp(exten_field->name,"_transport",strlen(exten_field->name))) continue; #endif if(!strncasecmp(exten_field->name,"encryption",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"srtpcapable",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"deny",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"permit",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"avpf",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"force_avp",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"icesupport",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"dtlsverify",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"dtlsenable",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"dtlscertfile",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"dtlscafile",strlen(exten_field->name))) continue; if(!strncasecmp(exten_field->name,"dtlssetup",strlen(exten_field->name))) continue; //add codecs to cfg file. if(!strncasecmp(exten_field->name,"alaw",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"ulaw",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"g729",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"g726",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"g722",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"gsm",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"speex",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"opus",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"h261",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"h263",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"h263p",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"h264",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(!strncasecmp(exten_field->name,"vp8",strlen(exten_field->name))){ if((atoi(exten_row[i]) > 0) && (atoi(exten_row[i]) < 20 )) { if (new_codecs[atoi(exten_row[i])][0] != '\0') { code_addr = strcat(new_codecs[atoi(exten_row[i])], ",");//not null } code_addr = strcat(new_codecs[atoi(exten_row[i])],exten_field->name); continue;; } else continue; } if(0 == strlen(exten_row[i])){ if(!strncasecmp(exten_field->name,"secret",strlen(exten_field->name))) ; else if(!strncasecmp(exten_field->name,"vmsecret",strlen(exten_field->name))) ; else continue; } field_name = exten_field->name; fprintf(fp,"%s = %s\n",field_name,exten_row[i]); } // printf("codecs len %d\n",strlen(codecs)); //if(strlen(codecs) <= 4){ // printf("something wrong happened to codecs selection.\n"); // exit -1; //} //codecs[strlen(codecs)-1] = '\0'; for (i=0;i<20;i++) { if (new_codecs[i][0] != '\0') if (codecs[0] != '\0' ) strcat(codecs,","); code_addr = strcat(codecs,new_codecs[i]); } // printf("codecs = %s\n",code_addr); fputs("disallow = all\n",fp); fprintf(fp,"allow = %s\n",code_addr); fprintf(fp,"read = NULL\nwrite=NULL\n\n");//refuese sip exten permit access } } fclose(fp); break; default: printf("You enter the wrong parameters.please check it\n"); break; } fclose(fp_cfg); mysql_free_result(res_exten); mysql_close(&conn); return 0; } else { fclose(fp_cfg); mysql_free_result(res_exten); mysql_close(&conn); return 0; } }