|
|
|
@ -52,12 +52,11 @@ void *ami_net(void *void_ami){
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(ami->net.is_connected == 1 && ami->asterisk.is_logged == 0){ |
|
|
|
|
if(ami_dispatch_login(ami) == -1){ |
|
|
|
|
ami_connect_login_down(&ami->net, &ami->asterisk); |
|
|
|
|
} |
|
|
|
|
ami_dispatch_login(ami); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(ami->net.is_connected == 1 && ami->asterisk.is_logged == 1){ |
|
|
|
|
if( ami->net.is_connected == 1 ){ |
|
|
|
|
sleep( 1 ); |
|
|
|
|
ami_communication_ami(ami); |
|
|
|
|
ami_connect_login_down(&ami->net, &ami->asterisk); |
|
|
|
|
|
|
|
|
@ -166,28 +165,41 @@ int ami_dispatch_action(AMI *ami, const char *action){
|
|
|
|
|
*/ |
|
|
|
|
int ami_dispatch_login(AMI *ami){ |
|
|
|
|
|
|
|
|
|
if( ami->net.is_connected == 0 || ami->asterisk.is_logged == 1 ){ |
|
|
|
|
if( ami->net.is_connected == 0 ){ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const char *str_login = NULL; |
|
|
|
|
|
|
|
|
|
str_login = build_str_login(&ami->credential); |
|
|
|
|
|
|
|
|
|
if( ami_dispatch_action(ami, str_login) == -1 ){ |
|
|
|
|
struct ss_action *action = NULL; |
|
|
|
|
action = ami_create_new_action(2); |
|
|
|
|
if(!action){ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
strcpy( action->name_action, "Login" ); |
|
|
|
|
strcpy( action->args[0].value, "_LOGIN_" ); |
|
|
|
|
|
|
|
|
|
free_str_login((char *) str_login); |
|
|
|
|
strcpy( action->args[1].key, "username" ); |
|
|
|
|
strncpy( action->args[1].value, ami->credential.username, strlen(ami->credential.username) ); |
|
|
|
|
|
|
|
|
|
if( ami_done_login( &ami->net ) == -1 ){ |
|
|
|
|
ami_connect_login_down(&ami->net, &ami->asterisk); |
|
|
|
|
return -1; |
|
|
|
|
strcpy( action->args[2].key, "secret" ); |
|
|
|
|
strncpy( action->args[2].value, ami->credential.password, strlen(ami->credential.password) ); |
|
|
|
|
|
|
|
|
|
const char *text_login = NULL; |
|
|
|
|
text_login = build_str_action(action); |
|
|
|
|
|
|
|
|
|
if(ami_dispatch_action(ami, text_login) == 1){ |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ami_login_up(&ami->asterisk); |
|
|
|
|
ami_destroy_action(action); |
|
|
|
|
str_action_free((char *)text_login); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
fail: |
|
|
|
|
str_action_free((char *)text_login); |
|
|
|
|
ami_destroy_action(action); |
|
|
|
|
ami_connect_login_down(&ami->net, &ami->asterisk); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -211,64 +223,6 @@ int ami_sock_close(int sock){
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* Verifica a resposta do login, se retornar 0 o usuário está logado |
|
|
|
|
* |
|
|
|
|
* \return sucesso 0, falha -1 |
|
|
|
|
*/ |
|
|
|
|
int ami_done_login( NET *net ){ |
|
|
|
|
|
|
|
|
|
int len_message_login = 90; |
|
|
|
|
char result_login[len_message_login]; |
|
|
|
|
char login_success[56] = "Response: Success\r\nMessage: Authentication accepted"; |
|
|
|
|
int bytes = 0; |
|
|
|
|
int attempt_wait_login = 0; |
|
|
|
|
|
|
|
|
|
while( 1 ){ |
|
|
|
|
struct pollfd pfd[1]; |
|
|
|
|
pfd[0].fd = net->sock; |
|
|
|
|
pfd[0].events = POLLIN; |
|
|
|
|
|
|
|
|
|
if(poll(pfd, 1, 10) == -1){ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(pfd[0].revents & POLLHUP) { |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(pfd[0].revents & POLLERR) { |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if(pfd[0].revents & POLLIN) { |
|
|
|
|
|
|
|
|
|
bytes = recv(net->sock, result_login, len_message_login - 1, 0); |
|
|
|
|
result_login[bytes] = '\0'; |
|
|
|
|
|
|
|
|
|
if(!strstr(result_login, "Response")){ |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(strstr(result_login, login_success) != NULL){ |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
else { /* login fail */ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
attempt_wait_login++; |
|
|
|
|
if(attempt_wait_login == 100){ |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
|
* Connectar a ami e retorna já está conectado |
|
|
|
|
* |
|
|
|
@ -279,7 +233,7 @@ int ami_connect_ami(NET *net){
|
|
|
|
|
while(1){ |
|
|
|
|
|
|
|
|
|
if (connect(net->sock, (struct sockaddr *)&net->sock_addr, sizeof(struct sockaddr_in) ) == -1){ |
|
|
|
|
usleep(10000); |
|
|
|
|
usleep( 100000 ); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -306,7 +260,6 @@ static int ami_create_socket(NET *net){
|
|
|
|
|
|
|
|
|
|
net->sock = socket(net->sock_addr.sin_family, SOCK_STREAM, 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -322,7 +275,7 @@ int ami_communication_ami(AMI *ami){
|
|
|
|
|
int bytes = 0; |
|
|
|
|
char more_buffer[MAX_BUFFER_NET + MAX_BUFFER_NET]; |
|
|
|
|
int i = 0; |
|
|
|
|
int timeout = 1; |
|
|
|
|
int timeout = 2; |
|
|
|
|
|
|
|
|
|
while(1){ |
|
|
|
|
struct pollfd pfd[1]; |
|
|
|
@ -352,7 +305,7 @@ int ami_communication_ami(AMI *ami){
|
|
|
|
|
else if(pfd[0].revents & POLLIN) { |
|
|
|
|
char *buffer = NULL; |
|
|
|
|
|
|
|
|
|
timeout = 1; |
|
|
|
|
timeout = 2; |
|
|
|
|
i = 0; |
|
|
|
|
|
|
|
|
|
if(ami->net.imcomplete_net == 0){ |
|
|
|
@ -382,6 +335,20 @@ int ami_communication_ami(AMI *ami){
|
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( ami->asterisk.is_logged == 0 ){ |
|
|
|
|
if(!strncmp( buffer, "Asterisk Call", 12 )){ |
|
|
|
|
memset(ami->asterisk.welcome, 0, 64); |
|
|
|
|
int i = 0; |
|
|
|
|
for( i = 0; i < 64 && *buffer != '\n' && *buffer != '\0'; i++ ){ |
|
|
|
|
ami->asterisk.welcome[i] = *(buffer); |
|
|
|
|
buffer++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ami->asterisk.welcome[i] = *(buffer); |
|
|
|
|
buffer++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
char *block = NULL; |
|
|
|
|
block = define_block(buffer, &buffer); |
|
|
|
|
while(block){ |
|
|
|
@ -396,20 +363,21 @@ int ami_communication_ami(AMI *ami){
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else{ |
|
|
|
|
|
|
|
|
|
if( i > 100 && i < 120){ |
|
|
|
|
timeout = 50; |
|
|
|
|
// 2 * 200 = 400 = 0.4 seconds
|
|
|
|
|
if( i > 200 ){ |
|
|
|
|
timeout = 100; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( i > 121 && i < 200){ |
|
|
|
|
// 100 * 4 = 400
|
|
|
|
|
if( i >= 203 ){ |
|
|
|
|
usleep(100000); // sleep 0.1 segundos
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( i > 150){ |
|
|
|
|
timeout = 100; |
|
|
|
|
if( i >= 208 ){ |
|
|
|
|
usleep(200000); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(i < 190){ |
|
|
|
|
if(i < 240){ |
|
|
|
|
++i; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|