Upgrade 3CX to v18 and get it hosted free!

PERL-SIPCALLOUT-AGI

Author image
#!/usr/bin/perl
// SipDialOUT.agi by imran 
use Asterisk::AGI;
use lib "/var/lib/asterisk/agi-bin";
use Db;

$AGI = new Asterisk::AGI;
$|=1;

my %input = $AGI->ReadParse();
$Digit	=$ARGV[0];
$CLI	=$ARGV[1];
#$Zap="Zap/18-12312";

my %CDR_HASH;
my $gsm_file="";
my $wav_file="";
my $d_path  ="/recordings";

$CDR_HASH{CALLERID}	 =$CLI;
$CDR_HASH{CALLRECORDINGFILE} ='';      

MyVerbose("Call is being originated from CLI: $CLI");

if($CLI eq "")
{
	MyVerbose("User not recognized on channel bank CLI : $CLI");	
	exitWithCongestion();
}


if($Digit==9)
{

		$DialedNo= $AGI->get_data('dialtone',6000,1);
		MyVerbose("\$DialedNo : $DialedNo");
		
		$DialedNo1= $AGI->get_data('silence',5000,3);
		MyVerbose("\$DialedNo1 : $DialedNo1");
		
		
		$TimeOut =5000;
		$Digit  	=3;
		if($DialedNo1 =~/^3/gsi)
		{
			$TimeOut=10000;	
			$Digit  	=7;
		}
		elsif($DialedNo ==1)
		{
			$TimeOut=8000;	
			$Digit  	=5;
		}
		elsif($DialedNo ==0)
		{
			$TimeOut=11000;	
			$Digit  	=10;
		}
		
		$DialedNo2= $AGI->get_data('silence',$TimeOut,$Digit);
		MyVerbose("\$DialedNo2 : $DialedNo2");
		
		$DialedNo1.=$DialedNo2;
		
		$DialedNoToValid=$DialedNo . $DialedNo1;
		$DialedNo ="" . $DialedNo . $DialedNo1;
		MyVerbose("\$DialedNo : $DialedNo");
		
		my $dialstr;
		$dialstr = "Zap/g1/" . $DialedNo . "|1000|tTL(" . ((30*60 + 0)*1000) .":7000:5000)"; 
		MyVerbose("\$dialstr : $dialstr");
		
		if(!IsInteger($DialedNo))
		{
			exitWithCongestion();
		}
		
		%Rights	=		GetLineRights($CLI);
		%Type=GetDialedNumberType("$DialedNoToValid"); 
		
		$Authorized=1;
		if($Type{localNumber} && !$Rights{IsLocalAllowed})
		{
			MyVerbose("CLI : $CLI is not authorized to call to Local # $DialedNoToValid");
			$Authorized=0;
		}
		
		if($Type{Mobile} && !$Rights{IsMobileAllowed})
		{ 
			MyVerbose("CLI : $CLI is not authorized to call to Mobile # $DialedNoToValid");                                                
			$Authorized=0;                                  
		}                                                 
		
		if($Type{NationWide} && !$Rights{IsNationWideAllowed})
		{
			MyVerbose("CLI : $CLI is not authorized to call to NWD # $DialedNoToValid");                                                
			$Authorized=0;
		}
		if($Type{International} && !$Rights{IsInternationalAllowed})
		{
			MyVerbose("CLI : $CLI is not authorized to call to International # $DialedNoToValid");                                                
			$Authorized=0;
		}
		if(!$Authorized)
		{
			$AGI->answer();
			$AGI->stream_file('auth-incorrect');
			sleep(4);
			exitWithCongestion();
		}
		if($Type{Mobilink})
		{
			$dialstr = "Zap/g4/" . $DialedNoToValid . "|1000|tTL(" . ((30*60 + 0)*1000) .":7000:5000)"; 
			$CDR_HASH{CALLEDID}	 =$DialedNoToValid ;
			$CDR_HASH{TRUNK}="Zap/g4/";
		}
		else
		{
			$CDR_HASH{CALLEDID}	 =$DialedNo;
			$CDR_HASH{TRUNK}="Zap/g1/";
		}
		$AGI->answer();
							
		$res = $AGI->exec("SetCIDNum $Rights{DirectPhone}");
		$res = $AGI->exec("SetCIDName $Rights{Name}");
		
		if ($Rights{CALLRECORDING})
		{
			callrecording($CDR_HASH{CALLEDID});
		}
		
		$res = $AGI->exec("DIAL $dialstr");
		
		$answeredtime = $AGI->get_variable("ANSWEREDTIME");
		$dialstatus = $AGI->get_variable("DIALSTATUS");
		$CDR_HASH{DIALSTATUS}=$dialstatus;
		$CDR_HASH{ANSWERTIME}=$answeredtime;
		MyVerbose("\$answeredtime: $answeredtime");
		MyVerbose("\$dialstatus: $dialstatus");
		
		
} ################ end digit 9 if case
elsif($Digit==1)
{
		$DialedNo=$AGI->get_data('silence',20000,3);
		$DialedNo ="1" . $DialedNo;
		$dialstr = "SIP/" . $DialedNo . "\@carrier|1000|trTL(" . ((30*60 + 0)*1000) .":7000:5000)"; 
		
		if(!IsInteger($DialedNo))
		{
			exitWithCongestion();
		}
		
		
		$CDR_HASH{TRUNK}="Sip";
		$CDR_HASH{CALLEDID}	 =$DialedNo;
		
		if ($Rights{CALLRECORDING})
		{
			callrecording($CDR_HASH{CALLEDID});
		}
		
		$res = $AGI->exec("DIAL $dialstr");	
		
		$answeredtime = $AGI->get_variable("ANSWEREDTIME");
		$dialstatus = $AGI->get_variable("DIALSTATUS");
		$CDR_HASH{DIALSTATUS}=$dialstatus;
		$CDR_HASH{ANSWERTIME}=$answeredtime;
		
		MyVerbose1("\$dialstatus: $dialstatus");
		
}################ end digit 1 if else case
elsif($Digit==2)
{
		$DialedNo=$AGI->get_data('silence',20000,2);
		$DialedNo ="2" . $DialedNo;
		$dialstr = "SIP/" . $DialedNo . "\@carrier|1000|trTL(" . ((30*60 + 0)*1000) .":7000:5000)"; 
		if(!IsInteger($DialedNo))
		{
			exitWithCongestion();
		}
		
		$CDR_HASH{TRUNK}="Sip";
		$CDR_HASH{CALLEDID}	 =$DialedNo;
		
		if ($Rights{CALLRECORDING})
		{
			callrecording($CDR_HASH{CALLEDID});
		}
		
		$res = $AGI->exec("DIAL $dialstr");	
		
		$answeredtime = $AGI->get_variable("ANSWEREDTIME");
		$dialstatus = $AGI->get_variable("DIALSTATUS");
		$CDR_HASH{DIALSTATUS}=$dialstatus;
		$CDR_HASH{ANSWERTIME}=$answeredtime;
		 
		MyVerbose("\$dialstatus: $dialstatus");
				
} ################ end digit 2 if else case


if ( $dialstatus eq 'ANSWER')
{
	#saveCdrData(%CDR_HASH);
}                            


if ($Rights{CALLRECORDING})
{
	my $C = $AGI->get_variable(CHANNEL);
	my $t = $AGI->exec("StopMonitor $C");
	$AGI->hangup();
	sleep(2);
	system("sox $d_path/$gsm_file $d_path/$wav_file");	
}

saveCdrData(%CDR_HASH);

$AGI->hangup();
exit;


sub MyVerbose
{
   my ($Msg) = @_;
	#return;
	$Msg =~  s/\n/ /gi ;
	$AGI->verbose("DialoutCLI.pl_Debug: $Msg", 3) ;	
}

sub IsInteger 
{
    	my $InputString = shift;
    	
    	if ($InputString !~ /^[0-9]+$/) 
    	{
    		return 0;
    	}
    	else 
    	{
    		return 1;	
    	}	
}

sub exitWithCongestion
{
    MyVerbose("Executing hangup due to invalid dialed number");
    $res = $AGI->exec("Congestion");
    sleep(3);
    $AGI->hangup();
    exit;
}
    
sub GetLineRights
{
	  	my $Line = shift;
	  	
	  	@Result=Db->ExecuteQuery("
	  	select
			IsLocalAllowed          ,
			IsMobileAllowed         ,
			IsNationWideAllowed     ,
			IsInternationalAllowed  ,
			
			Name,
			DirectPhone,
			CallRecording,
			VoiceMail
			
			from siprelation
			where
			username=\"$Line\"
	  	");
	  	my %Hash;
	  	$Hash{IsLocalAllowed}		=				$Result[1][0];
	  	$Hash{IsMobileAllowed}		=				$Result[1][1];
	  	$Hash{IsNationWideAllowed}	=				$Result[1][2];
	  	$Hash{IsInternationalAllowed}	=				$Result[1][3];
	  	
# by imran					
	  	$Hash{Name}				=				$Result[1][4];
	  	$Hash{DirectPhone}			=				$Result[1][5];
	  	$Hash{CALLRECORDING}		=				$Result[1][6];
	  	$Hash{VOICEMAIL}			=				$Result[1][7];
# end	  	
	  	
	  	return %Hash;
	
}

sub GetDialedNumberType
{
	  	my $DialNumber = shift;
	  	
	  	my %Hash;
	  	$Hash{localNumber}		=0;
	  	$Hash{Mobile}			=0;
	  	$Hash{Mobilink}		=0;
	  	$Hash{NationWide}		=0;
	  	$Hash{International}	=0;
	  	
	  	if(length($DialNumber)==7)
	  	{
	  		$Hash{localNumber}				=1;
	  		
	  	}
	  	
	  	if( (substr($DialNumber,0,2) eq "03") && (length($DialNumber)==11) )
		{                           
			
			$Hash{Mobile}					=1;      
		}                                
	  	
	 	if( ( ($DialNumber =~ /^0300/gsi) || ($DialNumber =~ /^0301/gsi)) && (length($DialNumber)==11))
	  	{
	  		$Hash{Mobilink}				=1;
	  	}
	  		
	  	
	  	if($DialNumber =~ /^00/gsi)
	  	{
	  		$Hash{International}			=1;
	  	}
	  	if(($DialNumber =~ /^0/gsi) && !$Hash{International} && !$Hash{Mobile}) 
	  	{
	  		$Hash{NationWide}				=1;
	  	}
	  		
	return %Hash;
}

# table mycdr by imran
# IN Hash
# OUT nothing
sub saveCdrData
{ 
	my (%HASH)=@_;

	$HASH{CONTEXT}  ="";
	
	$HASH{BILLSEC}  = "";


	Db->ExecuteQuery("insert into mycdr(src,dst,dcontext,channel,duration,billsec,disposition,calldate,recordedfile)
	values('$HASH{CALLERID}','$HASH{CALLEDID}','$HASH{CONTEXT}','$HASH{TRUNK}','$HASH{ANSWERTIME}','$HASH{BILLSEC}','$HASH{DIALSTATUS}',sysdate(),'$HASH{CALLRECORDINGFILE}')");
	
}

sub callrecording
{
	my ($phoneno) =@_;
	my $CalledNumber = $phoneno;
	my $CurDate;
	my $calleridnum = $CLI;
	
	$CurDate = $AGI->get_variable("DATETIME");
	$CurDate =~ s/://gsi;
	$CurDate=substr($CurDate,4,4) . substr($CurDate,2,2) .substr($CurDate,0,2) .substr($CurDate,8,7);
	$gsm_file = "Callfrom-$calleridnum-CallTo-$CalledNumber-at-$CurDate.gsm";
	$wav_file = "Callfrom-$calleridnum-CallTo-$CalledNumber-at-$CurDate.WAV";
	$res = $AGI->exec("Monitor gsm|$d_path/Callfrom-$calleridnum-CallTo-$CalledNumber-at-$CurDate|m");
	
	$CDR_HASH{CALLRECORDINGFILE} = $gsm_file;
} 


Article Reviews

Write a Review

Your email address will not be published. Required fields are marked *

Required Field. Minimum 5 characters.

Required Field. Minimum 5 characters, maximum 50.

Required field.There is an error with this field.

Required Field.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

There are no reviews for this article. Be the first one to write a review.
Get 3CX - Absolutely Free!
Link up your team and customers Phone System Live Chat Video Conferencing

Hosted or Self-managed. Up to 10 users free forever. No credit card. Try risk free.

3CX
A 3CX Account with that email already exists. You will be redirected to the Customer Portal to sign in or reset your password if you've forgotten it.