#!/usr/bin/env python3 import asyncio import logging import traceback from os import path from pyrad.client_async import ClientAsync from pyrad.dictionary import Dictionary from pyrad.packet import AccessAccept logging.basicConfig( level="DEBUG", format="%(asctime)s [%(levelname)-8s] %(message)s" ) def create_request(client, user): return client.CreateAuthPacket( **{ "User-Name": user, "NAS-IP-Address": "192.168.1.10", "NAS-Port": 0, "Service-Type": "Login-User", "NAS-Identifier": "trillian", "Called-Station-Id": "00-04-5F-00-0F-D1", "Calling-Station-Id": "00-01-24-80-B3-9C", "Framed-IP-Address": "10.0.0.100", } ) def print_reply(reply): if reply.code == AccessAccept: print("Access accepted") else: print("Access denied") print("Attributes returned by server:") for key, value in reply.items(): print(f"{key}: {value}") def initialize_transport(loop, client): loop.run_until_complete( asyncio.ensure_future( client.initialize_transports( enable_auth=True, local_addr="127.0.0.1", local_auth_port=8000, enable_acct=True, enable_coa=True, ) ) ) def main(path_to_dictionary): client = ClientAsync( server="localhost", secret=b"Kah3choteereethiejeimaeziecumi", timeout=4, dict=Dictionary(path_to_dictionary), ) loop = asyncio.get_event_loop() try: # Initialize transports initialize_transport(loop, client) requests = [] for i in range(255): req = create_request(client, f"user{i}") future = client.SendPacket(req) requests.append(future) # Send auth requests asynchronously to the server loop.run_until_complete( asyncio.ensure_future( asyncio.gather(*requests, return_exceptions=True) ) ) for future in requests: if future.exception(): print("EXCEPTION ", future.exception()) else: reply = future.result() print_reply(reply) # Close transports loop.run_until_complete( asyncio.ensure_future(client.deinitialize_transports()) ) print("END") except Exception as exc: print("Error: ", exc) traceback.print_exc() # Close transports loop.run_until_complete( asyncio.ensure_future(client.deinitialize_transports()) ) loop.close() if __name__ == "__main__": dictionary = path.join(path.dirname(path.abspath(__file__)), "dictionary") main(dictionary)