#!/usr/bin/env python3 import asyncio import logging import traceback from os import path from pyrad.dictionary import Dictionary from pyrad.packet import AccessAccept from pyrad.server_async import ServerAsync from pyrad.server import RemoteHost try: import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) except: pass logging.basicConfig( level="DEBUG", format="%(asctime)s [%(levelname)-8s] %(message)s" ) def print_attributes(packet): print("Attributes returned by server:") for key, value in packet.items(): print(f"{key}: {value}") class FakeServer(ServerAsync): def __init__(self, loop, dictionary): ServerAsync.__init__( self, loop=loop, dictionary=dictionary, enable_pkt_verify=True, debug=True, ) def handle_auth_packet(self, protocol, packet, addr): print("Received an authentication request with id ", packet.id) print("Authenticator ", packet.authenticator.hex()) print("Secret ", packet.secret) print_attributes(packet) reply = self.CreateReplyPacket( packet, **{ "Service-Type": "Framed-User", "Framed-IP-Address": "192.168.0.1", "Framed-IPv6-Prefix": "fc66::/64", }, ) reply.code = AccessAccept protocol.send_response(reply, addr) def handle_acct_packet(self, protocol, packet, addr): print("Received an accounting request") print_attributes(packet) reply = self.CreateReplyPacket(packet) protocol.send_response(reply, addr) def handle_coa_packet(self, protocol, packet, addr): print("Received an coa request") print_attributes(packet) reply = self.CreateReplyPacket(packet) protocol.send_response(reply, addr) def handle_disconnect_packet(self, protocol, packet, addr): print("Received an disconnect request") print_attributes(packet) reply = self.CreateReplyPacket(packet) # COA NAK reply.code = 45 protocol.send_response(reply, addr) def main(path_to_dictionary): # create server and read dictionary loop = asyncio.get_event_loop() server = FakeServer(loop=loop, dictionary=Dictionary(path_to_dictionary)) # add clients (address, secret, name) server.hosts["127.0.0.1"] = RemoteHost( "127.0.0.1", b"Kah3choteereethiejeimaeziecumi", "localhost" ) try: # Initialize transports loop.run_until_complete( asyncio.ensure_future( server.initialize_transports( enable_auth=True, enable_acct=True, enable_coa=True ) ) ) try: # start server loop.run_forever() except KeyboardInterrupt: pass # Close transports loop.run_until_complete( asyncio.ensure_future(server.deinitialize_transports()) ) except Exception as exc: print("Error: ", exc) traceback.print_exc() # Close transports loop.run_until_complete( asyncio.ensure_future(server.deinitialize_transports()) ) loop.close() if __name__ == "__main__": dictionary = path.join(path.dirname(path.abspath(__file__)), "dictionary") main(dictionary)