As I mentioned the other day, I'm building a RADIUS client in Python for sending disconnect messages to Cisco routers.

One hang-up with the pyrad package is that it requires a dictionary file in order to map RADIUS attribute names to codes and types. In the case of my client, I only need two attributes: User-Name and Calling-Station-Id. I don't want to have to create a dictionary file for just these two entries. Fortunately, the StringIO module allows me to create an object that acts like a file, but works with a string I provide.

In my code, I can now do this:

from pyrad.client import Client
from pyrad.dictionary import Dictionary
from StringIO import StringIO

dict = StringIO("ATTRIBUTE User-Name 1 string\n" + 
                "ATTRIBUTE Calling-Station-Id 31 string")
client = Client(server="nas_hostname", 
                secret="super_secret",
                acctport=3799,
                dict=Dictionary(dict))

Because StringIO provides all the methods that a normal file object does, the Dictionary() class is none the wiser.