cat /etc/asterisk/extensions.conf|grep agi.py:
Код:
;exten => s,1,Agi( agi.py,start,${ARG1},${ARG2},${ARG3},${ARG4});
exten => _X.,n,Agi( agi.py,auth,u_${usr},secret,${CALLERID(num)},${usr},${CHANNEL})
exten => h,1,Agi( agi.py,stop,u_${usr},${CHANNEL},${CALLERID(num)},${usr},${CDR(billsec)})
exten => _8.,n, Agi( agi.py,auth,u_${usr},secret,${usr},${EXTEN},${CHANNEL})
exten => h,1,Agi( agi.py,stop,u_${usr},${CHANNEL},${usr},${callingNUM},${CDR(billsec)})
exten => _9X.,n, Agi( agi.py,auth,u_${usr},secret,${usr},${EXTEN},${CHANNEL}) ; ******
exten => _X.,n, Agi( agi.py,auth,u_${usr},secret,${usr},${EXTEN},${CHANNEL}) ; *******
exten => h,1,Agi( agi.py,stop,u_${usr},${CHANNEL},${usr},${callingNUM},${CDR(billsec)})
cat /usr/share/asterisk/agi-bin/agi.py:
Код:
#!/usr/bin/python
import socket, sys
import pyrad.packet
from pyrad.client import Client
from pyrad.dictionary import Dictionary
import asterisk.agitb, asterisk.agi
asterisk.agitb.enable(display = False, logdir = '/var/log/asterisk/')
agi=asterisk.agi.AGI()
asterisk.agitb.enable(agi, False, '/var/log/asterisk')
def auth(user,password,src,dst,id):
srv=Client(server="8.8.8.8", secret="12345678", dict=Dictionary("/etc/radiusclient-ng/dictionary", "/etc/radiusclient-ng/dictionary.cisco"))
req=srv.CreateAuthPacket(code=pyrad.packet.AccessRequest)
req["NAS-IP-Address"] = "192.168.121.20"
req["User-Name"] = user
req["Password"] = req.PwCrypt(password)
req["Calling-Station-Id"] = src
req["Called-Station-Id"] = dst
req["Service-Type"] = 10
req["h323-conf-id"] = id
maxdur=0
try:
reply=srv.SendPacket(req)
except pyrad.client.Timeout:
agi.verbose("RADIUS server does not reply")
#sys.exit(1)
return 0
except socket.error, error:
agi.verbose("Network error: " + error[1])
#sys.exit(1)
return 0
if reply.code==pyrad.packet.AccessAccept:
agi.verbose("Access accepted")
maxdur=int(reply[(9, 102)][0].split("=")[1])*1000
agi.verbose("Max duration: %d" % maxdur)
else:
agi.verbose("Access denied")
agi.hangup()
return maxdur
def start(user,id,src,dst):
srv=Client(server="8.8.8.8", secret="12345678", dict=Dictionary("/etc/radiusclient-ng/dictionary", "/etc/radiusclient-ng/dictionary.cisco"))
req=srv.CreateAcctPacket()
req["Acct-Status-Type"]="Start"
req["NAS-IP-Address"] = "192.168.121.20"
req["User-Name"] = user
req["Calling-Station-Id"] = src
req["Called-Station-Id"] = dst
req["Acct-Session-Id"] = id
req["h323-conf-id"] = id
req["h323-call-type"]="VoIP"
req["h323-call-origin"]="originate"
try:
reply=srv.SendPacket(req)
except pyrad.client.Timeout:
agi.verbose("RADIUS server does not reply")
sys.exit(1)
except socket.error, error:
agi.verbose("Network error: " + error[1])
sys.exit(1)
def stop(user,id,src,dst,dur):
srv=Client(server="8.8.8.8", secret="12345678", dict=Dictionary("/etc/radiusclient-ng/dictionary", "/etc/radiusclient-ng/dictionary.cisco"))
req=srv.CreateAcctPacket()
req["Acct-Status-Type"]="Stop"
req["NAS-IP-Address"] = "192.168.121.20"
req["User-Name"] = user
req["Calling-Station-Id"] = src
req["Called-Station-Id"] = dst
req["Acct-Session-Id"] = id
req["h323-conf-id"] = id
req["Acct-Session-Time"] = int(dur)
try:
reply=srv.SendPacket(req)
except pyrad.client.Timeout:
agi.verbose("RADIUS server does not reply")
sys.exit(1)
except socket.error, error:
agi.verbose("Network error: " + error[1])
sys.exit(1)
agi.verbose("begin")
if sys.argv[1]=="auth":
if len(sys.argv[2])>1 and len(sys.argv[3]) > 1 and len(sys.argv[4]) >1 and len(sys.argv[5]) >1:
agi.verbose("auth")
maxdur=auth(sys.argv[2],sys.argv[3],sys.argv[4],sys.argv[5],sys.argv[6])
agi.set_variable('maxdur',str(maxdur))
else:
agi.verbose("auth: bad params")
elif sys.argv[1]=="start":
if len(sys.argv[2])>1 and len(sys.argv[3]) > 1 and len(sys.argv[4]) and len(sys.argv[5])>1 :
agi.verbose("start")
start(sys.argv[2],sys.argv[3],sys.argv[4],sys.argv[5])
else:
agi.verbose("start: bad params")
elif sys.argv[1]=="stop":
if len(sys.argv[2])>1 and len(sys.argv[3]) > 1 and len(sys.argv[4]) and len(sys.argv[5])>1 :
agi.verbose("stop")
stop(sys.argv[2],sys.argv[3],sys.argv[4],sys.argv[5],sys.argv[6])
else:
agi.verbose("stop: bad params")
else:
agi.verbose("bad action")
agi.verbose("end")
Как-то так...
зы:
надо pyst и pyrad пакетики питона
в pyrad/client.py зашиты authport=1812, acctport=1813, можно там поправить,если отличаются. radiusclient-ng ващето нафиг не нужен, тока диктионарий от него