Current section

Files

Jump to
elixir_radius example.exs
Raw

example.exs

require Logger
#RadiusApp.start :normal,[]
#IO.puts inspect RadiusDict.Vendor.by_name("Cisco")
#IO.puts inspect RadiusDict.Attribute.by_name("Service-Type")
#IO.puts inspect RadiusDict.Value.by_name("Service-Type","Login-User")
#IO.puts inspect RadiusDict.Value.by_value(6,11)
#IO.puts inspect RadiusDict.Value.by_name("Cisco","Cisco-Disconnect-Cause","Unknown")
#IO.puts inspect RadiusDict.Value.by_value(9,195,11)
#IO.puts inspect RadiusDict.Value.by_value(9,1950,11)
secret = "112233"
attrs = [
{"User-Password","1234"},
#tagged attribute (rfc2868)
{"Tunnel-Type","PPTP"},
#equals
{"Tunnel-Type",{0,"PPTP"}},
{"Tunnel-Type",{10,"PPTP"}},
{"Service-Type","Login-User"},
#tag & value can be integer
{6,1},
#ipaddr
{"NAS-IP-Address",{1,2,3,4}},
{"NAS-IP-Address",0x12345678},
#ipv6addr
{"Login-IPv6-Host",{2003,0xefff,0,0,0,0,0,4}},
#VSA
{{"Vendor-Specific",9},[
{"Cisco-Disconnect-Cause",10},
{195,"Unknown"}
]},
#empty VSA?
{{"Vendor-Specific",311},[]},
#some unknown attribute
{255,"123456"}
]
#for request packets, leave auth=nil will generate with random bytes
p = %Radius.Packet{code: "Access-Request", id: 12, auth: nil, secret: secret, attrs: attrs}
#will return an iolist
data = Radius.Packet.encode p
Logger.debug "data=#{inspect data}"
p = Radius.Packet.decode :erlang.iolist_to_binary(data),secret
Logger.debug inspect p, pretty: true
#for response packets, set auth=request.auth for password decoding
p = %Radius.Packet{code: "Access-Accept", id: 12, auth: p.auth, secret: secret, attrs: p.attrs}
data = Radius.Packet.encode p
Logger.debug "data=#{inspect data}"
#password decoding SHOULD FAIL here, guess why?
p = Radius.Packet.decode :erlang.iolist_to_binary(data),p.secret
Logger.debug inspect p, pretty: true
#wrapper of gen_udp
{:ok,sk} = Radius.listen 1812
loop = fn(loop)->
#secret can be a string or a function returning a string
#{:ok,host,p} = Radius.recv sk,"123"
{:ok,host,p} = Radius.recv sk,fn(_host) -> secret end
IO.puts "From #{inspect host} : \n#{inspect p, pretty: true}"
resp = %Radius.Packet{code: "Access-Reject", id: p.id, auth: p.auth, secret: p.secret}
Radius.send sk,host,resp
loop.(loop)
end
loop.(loop)