11.09.2012

Аналитика занятости линий для БД

Скриптик для анализа одновременного занятия линий.

Суть простая выбираем промежуток когда считаываем кол-во звонков, например каждые 5 минут начиная с 2012-09-01. И смотрим какие звонки к какому промежутку относятся. на выходе пара: время – кол-во линий.

Играя SQL запросами можно получить статистику по каналу или по префиксу, вообщем инструмент нужный, но данная реализация крайне медленная. Времени на разработку совсем нет, а решение принимать хочется на основании конкретных данных.

#!/usr/bin/perl

use strict;
use DBI;
use Time::Local;
use Date::Parse;

my $dbh = DBI->connect(‘dbi:Pg:database=yooxy’, ‘pavel’,”) or die $DBI::errstr;

#get all calls
my $date_start = ‘2012-09-09 00:00:00’;

my $leg = 300; #in seconds
my $calls_query = ‘select time,duration from acc where time > \”.$date_start.’\’;’;
my $sth = $dbh->prepare($calls_query);
$sth->execute;
my $ary_ref = $sth->fetchall_arrayref;

my $start_time = str2time($date_start);
my $a;
my $i,my $i2;
my %values;
$dbh->disconnect;
foreach ($a=$start_time;$a = $a + $leg;) {
$i2++;
foreach (@$ary_ref) {
$i++;
my $date1 = $_->[0];
my $duration = 60;# $_->[1];
my $line = $a;

my $start = str2time($date1);
my $end = str2time($date1) + $duration;

if (($line > $start) and ($line < $end)) { print “o$start < $line < $end\n”; $values{$a}++};

}

if ($values{$a} > 0) {print scalar(localtime($a)),”;”,$values{$a},”\n”;} else {print scalar(localtime($a)),”;”,0,”\n”;

};

last if $a > time();
}
print “\ncalls $i2; iter $i;”;

 

9.09.2012

Новичкам в камалио

По умолчанию в kamailio.conf разрешены звонки с внешних доменов(поле FROM) на внутренний домен. Привести это может вот к чему, если у вас в дальнейшем Kamailio использует модуль DROUTING или както иначе вы маршрутизируетет звонки, то звонок предназначенный для локального пользователя (по затее разработчиков) может быть отправлен на внешний gateway.

Будьте внимательны!

# authenticate if from local subscriber
if (from_uri==myself)
{
if (!proxy_authorize(“$fd”, “subscriber”)) {
proxy_challenge(“$fd”, “0”);
exit;
}
if (is_method(“PUBLISH”))
{
if ($au!=$fU || $au!=$tU) {
sl_send_reply(“403″,”Forbidden auth ID”);
exit;
}
if ($au!=$rU) {
sl_send_reply(“403″,”Forbidden R-URI”);
exit;
}
#!ifdef WITH_MULTIDOMAIN
if ($fd!=$rd) {
sl_send_reply(“403″,”Forbidden R-URI domain”);
exit;
}
#!endif
} else {
if ($au!=$fU) {
sl_send_reply(“403″,”Forbidden auth ID”);
exit;
}
}

consume_credentials();
# caller authenticated
} else {
# caller is not local subscriber, then check if it calls
# a local destination, otherwise deny, not an open relay here
if (!uri==myself)
{
sl_send_reply(“403″,”Not relaying”);
exit;

}

Решение проблемы на мой взгляд в следующем, можно запретить входящие звонки вообще с IP кроме тех, кроме определенных, но грамотнее видимо будет, для “входящих” звонков не применять правило DROUTING.

 

1.09.2012

uac_registrant

Относительно недавно в opensips появилась возможность регистрироваться на sip серверах. Собственно uac_registrant этим и занимается. Проблема с которой я столкнулся выглядела так: Попытка регистрации, sip-сервер возвращает ошибку WRONG_CREDENTIALS (6) и после этого uac_registrant  более не регистрируется до перезагрузки Opensips.
Логика в данном случае вроде бы правильная, не верно указанные данные не должны отправляться повторно, но в моем случае данные были верны и после перезагрузки регистрация проходила успешно.
Почему некоторые провайдеры выдают такую ошибку – сказать сложно, однако, такое случается. Asterisk в этом случае, кстати не стесняется – продолжает пытаться зарегистраироваться.
Разработчики Opensips сказали примерно следующее:

State 6 is WRONG_CREDENTIALS_STATE.
The reason that the server doesn’t try to re-register is because the
credentials are no longer valid.
The credentials should be updated and the server restarted to take
into account the updated credentials.

Если эту проблему не исправить, то в любой момент времени можно потерять регистрацию на сервере и перестать получать входящие вызовы. Решение для себя я заделал конечно по принципу костыля, но по большому счету за долгие месяцы – проблем не возникло:

В файле registrant.c, в районе 735 строчки, можно исключить данный код ошибки из списка тех, после которых попытки регистрации прекращаются.

at line: 735:
case REGISTERING_STATE:
case AUTHENTICATING_STATE:
break;
case WRONG_CREDENTIALS_STATE:
case REGISTER_TIMEOUT_STATE:
case INTERNAL_ERROR_STATE:

Привет!

1.09.2012

Начало.

Добро пожаловать в блог посвященный Opensips. Изначально задача в том чтобы, когда требуется можно было посмотреть проблемы с которыми сталкивался ранее и не вспоминать, а что же там такое было. Почему-то за пару лет активной работы с Opensips такая необходимость есть.

Также здесь будут выкладываться решение наиболее популярных задач, таких как ограничение одновременных разговоров, мониторинг, работа с базами данных, сбор статистики и многое другое.

Привет!

| Posted in Общее | No Comments »