Otra vez a la carga y es que le estoy pillando a esto el truco. Hace un tiempo estuvimos hablando en el general acerca del control de abusos del sistema.
Las soluciones pasaban por:
- Controlar el número de llamadas simultaneas: Macro Superdial, que se puede encontrar facilmente en voip-info.org.
- Solicitar un pin para el acceso a ciertas extensiones. En el hilo 'Mi primer perl AGI script', tenemos una solución.
- Establecer la duración de una llamada. Esto se puede hacer estableciendo el AbsoluteTimeout pero resulta que si lo hacemos en el dialplan directamente, este se queda marcado para todo quisqui (y por la prueba rápida que hice, para todas las extensiones). La solución un pequeño Script AGI que ponga el TimeOut para la llamada actual y para dar más flexibilidad que se pueda establecer en la BBDD.
El script en cuestión es muy sencillito:
#!/usr/bin/perl
#
use Asterisk::AGI;
use DBI;
$AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();
my ($user)=@ARGV;
$timeout = get_timeout($user);
#Si es 0 no establecemos restricciones alguna.
if ($timeout > 0) {
$AGI->exec('AbsoluteTimeout', $timeout);
}
sub get_timeout( $user ) {
%MYSQL = (
hostname => "localhost",
username => "root",
password => "udvucf",
database => "asterisk"
);
my $dbh = DBI->connect("dbi:mysql:$MYSQL{database}:$MYSQL{hostna me}","$MYSQL{username}","$MYSQL{password}")
|| die ("No pudo conectar\n");
my $query = "SELECT timeout FROM sipfriends WHERE username=$user";
my $recordset = $dbh->prepare($query);
$recordset->execute
|| die ("No pude ejecutar la consulta");
my $pin = $recordset->fetchrow_hashref;
return $pin->{timeout};
}
Nota: Hay que añadir un campo timeout en la tabla sipfriends, para indicar en segundos la duración máxima de la llamada.
Nota: Otro detalle sería definir la extensión t, para que cuando ocurra un Timeout de algún tipo de locución notificando el motivo.
Las soluciones pasaban por:
- Controlar el número de llamadas simultaneas: Macro Superdial, que se puede encontrar facilmente en voip-info.org.
- Solicitar un pin para el acceso a ciertas extensiones. En el hilo 'Mi primer perl AGI script', tenemos una solución.
- Establecer la duración de una llamada. Esto se puede hacer estableciendo el AbsoluteTimeout pero resulta que si lo hacemos en el dialplan directamente, este se queda marcado para todo quisqui (y por la prueba rápida que hice, para todas las extensiones). La solución un pequeño Script AGI que ponga el TimeOut para la llamada actual y para dar más flexibilidad que se pueda establecer en la BBDD.
El script en cuestión es muy sencillito:
#!/usr/bin/perl
#
use Asterisk::AGI;
use DBI;
$AGI = new Asterisk::AGI;
my %input = $AGI->ReadParse();
my ($user)=@ARGV;
$timeout = get_timeout($user);
#Si es 0 no establecemos restricciones alguna.
if ($timeout > 0) {
$AGI->exec('AbsoluteTimeout', $timeout);
}
sub get_timeout( $user ) {
%MYSQL = (
hostname => "localhost",
username => "root",
password => "udvucf",
database => "asterisk"
);
my $dbh = DBI->connect("dbi:mysql:$MYSQL{database}:$MYSQL{hostna me}","$MYSQL{username}","$MYSQL{password}")
|| die ("No pudo conectar\n");
my $query = "SELECT timeout FROM sipfriends WHERE username=$user";
my $recordset = $dbh->prepare($query);
$recordset->execute
|| die ("No pude ejecutar la consulta");
my $pin = $recordset->fetchrow_hashref;
return $pin->{timeout};
}
Nota: Hay que añadir un campo timeout en la tabla sipfriends, para indicar en segundos la duración máxima de la llamada.
Nota: Otro detalle sería definir la extensión t, para que cuando ocurra un Timeout de algún tipo de locución notificando el motivo.
Comentario