Mit dem Asterisk Server wird per Telnet kommuniziert.
Sollte der Asteriskserver nicht im eigenen Netzwerk stehn, sollte die Verbindung über einen SSL Tunnel aufgebaut werden.
Die Konfiguration wird über die Sysconfig erledigt.
Hier der Code für /opt/otrs/bin/cgi-bin/click2dial.pl:
Code: Select all
#!/usr/bin/perl -w
#
# Asterisk - Click 2 Dial for OTRS via Telnet by André Bauer
#
# License: AGPL3
#
# use ../../ as lib location
use FindBin qw($Bin);
use lib "$Bin/../..";
use lib "$Bin/../../Kernel/cpan-lib";
use strict;
use warnings;
use Net::Telnet;
use CGI;
use Kernel::Config;
# get vars from sysconfig
my %CommonObject = ();
$CommonObject{ConfigObject} = Kernel::Config->new();
my $TELNET_HOST = $CommonObject{ConfigObject}->Get('Asterisk::Host');
my $TELNET_PORT = $CommonObject{ConfigObject}->Get('Asterisk::Port');
my $TELNET_USER = $CommonObject{ConfigObject}->Get('Asterisk::User');
my $TELNET_PASS = $CommonObject{ConfigObject}->Get('Asterisk::Password');
my $AST_CONTEXT = $CommonObject{ConfigObject}->Get('Asterisk::Context');
my $AST_WAITTIME = $CommonObject{ConfigObject}->Get('Asterisk::Waittime');
my $AST_DIALPREFIX = $CommonObject{ConfigObject}->Get('Asterisk::Dialprefix');
# get env vars
my $REFERER = $ENV{'HTTP_REFERER'};
# get vars from url
my $CGI = new CGI;
my $AST_CALLER = $CGI->param('agent');
my $AST_CALLED = $CGI->param('customer');
my $INTERNCALL = $CGI->param('intern');
# delete dialprefix
# thats for internal calls
# just add &intern=1 to click2dial url
if ($INTERNCALL eq "1"){
$AST_DIALPREFIX = "";
}
# check for args
if (($AST_CALLER eq "") || ($AST_CALLED eq "")) {
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>OTRS - VOIP Alert</title>\n";
if ($REFERER != ""){
print "<meta http-equiv=\"refresh\" content=\"1; url=$REFERER\">\n";
}
print "</head>\n";
print " <body>\n";
print "<script language=\"javascript\" type=\"text/javascript\">\n";
print "<!-- //\n";
print "alert('No Agent or Customer phonenumber given. Exiting.')\n";
print "// -->\n";
print "</script>\n";
print "</body>\n";
print "</html>\n";
return 0;
}
# delete unwanted chars from caller and called
$AST_CALLER =~ s/[^0-9]//g;
$AST_CALLED =~ s/[^0-9]//g;
# open telnet connection to asterisk server
my $TELNET_CONNECT = new Net::Telnet (Port => $TELNET_PORT,
Prompt => '/.*[\$%#>] $/',
Output_record_separator => '',
Errmode => 'return'
);
$TELNET_CONNECT->open("$TELNET_HOST");
$TELNET_CONNECT->waitfor('/0\n$/');
$TELNET_CONNECT->print("Action: Login\n");
$TELNET_CONNECT->print("Username: $TELNET_USER\n");
$TELNET_CONNECT->print("Secret: $TELNET_PASS\n\n");
if (!($TELNET_CONNECT->waitfor('/Authentication accept*/'))) {
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>OTRS - VOIP Alert</title>\n";
if ($REFERER != ""){
print "<meta http-equiv=\"refresh\" content=\"1; url=$REFERER\">\n";
}
print "</head>\n";
print " <body>\n";
print "<script language=\"javascript\" type=\"text/javascript\">\n";
print "<!-- //\n";
print "alert('Asterisk Manager Interface login failed, verify username and password: $TELNET_CONNECT->lastline')\n";
print "// -->\n";
print "</script>\n";
print "</body>\n";
print "</html>\n";
return 0;
}
$TELNET_CONNECT->print("Action: originate\n");
$TELNET_CONNECT->print("Exten: $AST_DIALPREFIX$AST_CALLED\n");
$TELNET_CONNECT->print("Context: $AST_CONTEXT\n");
$TELNET_CONNECT->print("Channel: SIP/$AST_CALLER\n");
$TELNET_CONNECT->print("Priority: 1\n");
$TELNET_CONNECT->print("WaitTime: $AST_WAITTIME\n");
$TELNET_CONNECT->print("Timeout: 10000\n");
$TELNET_CONNECT->print("Callerid: $AST_CALLER\n\n");
if (!($TELNET_CONNECT->waitfor('/Event: Newchannel.*/'))) {
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>OTRS - VOIP Alert</title>\n";
if ($REFERER != ""){
print "<meta http-equiv=\"refresh\" content=\"1; url=$REFERER\">\n";
}
print "</head>\n";
print "<body>\n";
print "<script language=\"javascript\" type=\"text/javascript\">\n";
print "<!-- //\n";
print "alert('Unable to determine call status: $TELNET_CONNECT->lastline')\n";
print "// -->\n";
print "</script>\n";
print "</body>\n";
print "</html>\n";
return 0;
}
$TELNET_CONNECT->print("Action: Logoff\n\n");
if ($REFERER eq ""){
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<title>VOIP Call from $AST_CALLER to $AST_CALLED</title>\n";
print "</head>\n";
print "<body>\n";
print "<p>VOIP Call from $AST_CALLER to $AST_CALLED</p>\n";
print "</script>\n";
print "</body>\n";
print "</html>\n";
}
else {
# redirect to referer (OTRS -> AgentTicketZoom)
print $CGI->redirect($REFERER);
}
exit 0;
Code: Select all
[ 'UserPhone', 'Phone (VOIP Call)', 'phone_1', 1, 0, 'var', 'click2dial.pl?agent=$Env{"UserComment"}&customer=$Data{"UserPhone"}', 0 ],
Hier der Code für /opt/otrs/Kernel/Config/Files/Asterisk.xml:
Code: Select all
<?xml version="1.0" encoding="iso-8859-1" ?>
<otrs_config version="1.0" init="Asterisk">
<CVS>$Id: Asterisk.xml,v 1.00 2009/09/24 10:00:00 abauer Exp $</CVS>
<ConfigItem Name="Asterisk::User" Required="0" Valid="0">
<Description Lang="en">The user name to access the Asterisk Server.</Description>
<Description Lang="de">Der Benutzername um den Asterisk Server benutzen zu koennen.</Description>
<Group>Framework</Group>
<SubGroup>Core::Asterisk</SubGroup>
<Setting>
<String Regex="">some_user</String>
</Setting>
</ConfigItem>
<ConfigItem Name="Asterisk::Password" Required="0" Valid="0">
<Description Lang="en">The password to access the Asterisk Server.</Description>
<Description Lang="de">Das Passwort um den Asterisk Server nutzen zu koennen.</Description>
<Group>Framework</Group>
<SubGroup>Core::Asterisk</SubGroup>
<Setting>
<String Regex="">some_pass</String>
</Setting>
</ConfigItem>
<ConfigItem Name="Asterisk::Host" Required="0" Valid="0">
<Description Lang="en">The host of the Asterisk Server.</Description>
<Description Lang="de">Der Host des Asterisk Servers.</Description>
<Group>Framework</Group>
<SubGroup>Core::Asterisk</SubGroup>
<Setting>
<String Regex="">127.0.0.1</String>
</Setting>
</ConfigItem>
<ConfigItem Name="Asterisk::Port" Required="0" Valid="0">
<Description Lang="en">The port of the Asterisk Server.</Description>
<Description Lang="de">Der Port des Asterisk Servers.</Description>
<Group>Framework</Group>
<SubGroup>Core::Asterisk</SubGroup>
<Setting>
<String Regex="">5038</String>
</Setting>
</ConfigItem>
<ConfigItem Name="Asterisk::Context" Required="0" Valid="0">
<Description Lang="en">The context used for the call.</Description>
<Description Lang="de">Der Kontext der beim Anruf benutzt wird.</Description>
<Group>Framework</Group>
<SubGroup>Core::Asterisk</SubGroup>
<Setting>
<String Regex="">from-internal</String>
</Setting>
</ConfigItem>
<ConfigItem Name="Asterisk::Waittime" Required="0" Valid="0">
<Description Lang="en">Ringtime customer.</Description>
<Description Lang="de">Klingeldauer Kunde.</Description>
<Group>Framework</Group>
<SubGroup>Core::Asterisk</SubGroup>
<Setting>
<String Regex="">60</String>
</Setting>
</ConfigItem>
<ConfigItem Name="Asterisk::Dialprefix" Required="0" Valid="0">
<Description Lang="en">Dialprefix.</Description>
<Description Lang="de">Amt.</Description>
<Group>Framework</Group>
<SubGroup>Core::Asterisk</SubGroup>
<Setting>
<String Regex="">0</String>
</Setting>
</ConfigItem>
</otrs_config>
Das ganze hab ich auch im Bugtracker gepostet. Eventuell wirds ja irgendwann, nach etwas Überarbeitung, integriert.
http://bugs.otrs.org/show_bug.cgi?id=4332