tag:blogger.com,1999:blog-41449554997896399032024-03-13T12:19:35.782-07:00ink08ink08http://www.blogger.com/profile/04127493430631834293noreply@blogger.comBlogger2125tag:blogger.com,1999:blog-4144955499789639903.post-45909855819566447452010-07-28T00:02:00.000-07:002010-07-29T01:58:21.603-07:00asterisk равномерное использование транков#!/usr/bin/perl<br />
<br />
# load module<br />
use Asterisk::AGI;<br />
use DBI;<br />
#use date::Format;<br />
<br />
<br />
<br />
# connect<br />
my $dbh = DBI->connect("DBI:Pg:dbname=asterisk;host=127.0.0.1", "asterisk_user", "passwd", {'RaiseError' => 1});<br />
<br />
<br />
my %trunks=("name1" => "SIP/994",<br />
"name2" => "SIP/993",<br />
"name3" => "SIP/992",<br />
"name4" => "SIP/991"); #89839<br />
<br />
my %trunks_id=("name1" => "994",<br />
"name2" => "993",<br />
"name3" => "992",<br />
"name4" => "991");<br />
<br />
my $Default_trunk="SIP/63762xx";<br />
my $Default_trunk_id="63762xx";<br />
<br />
my %calls=();<br />
my @calls_order=();<br />
<br />
my $LIMIT=2000*60;<br />
my $min=$LIMIT;<br />
my $min_trunk="name1";<br />
<br />
foreach $trunk (keys(%trunks)){<br />
my $sth = $dbh->prepare("SELECT sum(billsec) AS calltime FROM cdr WHERE date_trunc('month',calldate) = date_trunc('month',now()) AND dstchannel LIKE '$trunks{$trunk}-%' ;");<br />
$sth->execute();<br />
<br />
while(my $ref = $sth->fetchrow_hashref()) {<br />
if($ref->{'calltime'} < $LIMIT){<br />
$calls{$trunk}=$ref->{'calltime'};<br />
<br />
if ($min > $ref->{'calltime'} ){<br />
$min=$ref->{'calltime'};<br />
$min_trunk=$trunk;<br />
}<br />
<br />
}<br />
if(not $ref){<br />
$calls{$trunk}=0;<br />
}<br />
}#end while<br />
}<br />
<br />
$dbh->disconnect();<br />
<br />
#@calls_order = sort { $calls{$b} cmp $calls{$a} } keys %calls; <br />
@calls_order = sort { $calls{$a} <=> $calls{$b} } keys %calls; <br />
<br />
<br />
#foreach $trunk (@calls_order){<br />
# print "$trunk = $calls{$trunk}\n";<br />
# $AGI->verbose("$trunk = $calls{$trunk}\n",3);<br />
#}<br />
#print "min $min_trunk\n";<br />
#$AGI->verbose("min $min_trunk\n",3);<br />
<br />
<br />
<br />
<br />
$|=1;<br />
my $AGI = new Asterisk::AGI;<br />
$AGI->setcallback(\&mycallback);<br />
my %input = $AGI->ReadParse();<br />
sleep(1);<br />
my $num = $input{'extension'};<br />
my $caller_id = $input{'callerid'};<br />
if (!$num) {<br />
exit;<br />
}<br />
<br />
my $num1 = substr($num,1,6);<br />
my $syscmd1=`perl -ne "print if m/$num1/" /usr/share/asterisk/agi-bin/cods.txt`;<br />
chomp($syscmd1); <br />
if($syscmd1==0){<br />
$AGI->exec('Playback', "/var/lib/asterisk/sounds/record/blocked_call"); <br />
exit; <br />
}<br />
<br />
my $use_default=1;<br />
<br />
#$AGI->stream_file("/var/lib/asterisk/sounds/record/limit_call","*"); <br />
$AGI->exec('Playback', "/var/lib/asterisk/sounds/record/limit_call"); <br />
<br />
$AGI->verbose("Executing Dial $num $num1 $caller_id $syscmd1 \n",3);<br />
foreach $trunk (@calls_order){<br />
$AGI->set_callerid($trunks_id{$trunk});<br />
my $syscmd=`asterisk -r -x "core show channels" | grep "$trunks{$trunk}"| wc -l`;<br />
chomp($syscmd);<br />
<br />
if($syscmd==0){<br />
#$AGI->verbose("????? Status $trunks{$trunk} '$ret' '$status'\n",3);<br />
# my $ret=$AGI->exec('Dial', "$trunks{$trunk}/$num");<br />
<br />
my $ret=$AGI->exec('Dial', "$trunks{$trunk}/$num|120|L(191664)");<br />
my $status=$AGI->channel_status();<br />
<br />
if( ($status==0 || $status==1) && $ret!=1 ){<br />
$AGI->verbose("????? OK! $caller_id $num ret=$ret status=$status syscmd=$syscmd\n",3);<br />
$use_default=0;<br />
last;<br />
}else{<br />
$AGI->verbose("????????? error $caller_id $num $trunks{$trunk}/$num '$ret' status=$status syscmd=$syscmd \n",3);<br />
}<br />
}<br />
}<br />
<br />
if($use_default==1){<br />
$AGI->set_callerid($Default_trunk_id);<br />
my $ret=$AGI->exec('Dial', "$Default_trunk/$num");<br />
$AGI->verbose("????????? error_Default_trunk $caller_id $num $Default_trunk/$num ret=$ret \n",3);<br />
}<br />
<br />
sleep(1);<br />
exit;<br />
<br />
sub mycallback {<br />
my ($returncode) = @_;<br />
&log("CALLBACK");<br />
&cleanup;<br />
#print STDERR "User Disconnected ($returncode)\n";<br />
$AGI->verbose("!!!!!!!!!! ($returncode)\n");<br />
exit($returncode);<br />
}ink08http://www.blogger.com/profile/04127493430631834293noreply@blogger.com1tag:blogger.com,1999:blog-4144955499789639903.post-23630050279073432802010-07-02T12:40:00.000-07:002010-07-27T23:57:49.240-07:00ipsec strongswan (linux <--> cisco ) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.0.0/16 -j SNAT --to-source x.x.x.x<br />
<br />
# ipsec.conf - strongSwan IPsec configuration file<br />
<br />
# basic configuration<br />
<br />
config setup<br />
# plutodebug=all<br />
# crlcheckinterval=600<br />
# strictcrlpolicy=yes<br />
# cachecrls=yes<br />
#nat_traversal=yes<br />
charonstart=yes<br />
plutostart=yes<br />
<br />
<br />
conn %default<br />
left=x.x.x.x<br />
leftsubnet=192.168.1.0/24<br />
leftsourceip=192.168.1.1<br />
leftid=x.x.x.x<br />
auth=esp<br />
type=tunnel<br />
authby=secret<br />
esp=3des-sha1-modp1024<br />
ike=3des-sha1-modp1024<br />
keyexchange=ikev1<br />
keyingtries=0<br />
leftfirewall=yes<br />
<br />
conn office<br />
right=y.y.y.y<br />
rightsubnet=192.168.190.0/24<br />
rightid=y.y.y.y<br />
auto=start<br />
<br />
<br />
include /var/lib/strongswan/ipsec.conf.incink08http://www.blogger.com/profile/04127493430631834293noreply@blogger.com0