pyrad icon indicating copy to clipboard operation
pyrad copied to clipboard

`select.poll()` not supported on OSX

Open ccsalway opened this issue 7 years ago • 1 comments

https://github.com/wichert/pyrad/blob/2d64523dcf1aedee672841b297570c37d291992b/example/server.py#L69

Traceback (most recent call last):
  File "/venv/lib/python2.7/site-packages/pyrad/server.py", line 300, in Run
    self._poll = select.poll()
AttributeError: 'module' object has no attribute 'poll'

This makes it impossible to develop on OSX :(

ccsalway avatar Sep 08 '18 14:09 ccsalway

To make this work on OSX, I did the following (this wont work on Linux):

In server.py:

changed the Run method as follows:

def Run(self):
    self._kq = select.kqueue()
    self._fdmap = {}
    self._PrepareSockets()

    while True:
        revents = self._kq.control([], 1, None)
        for event in revents:
            if event.filter == select.KQ_FILTER_READ:
                try:
                    fd = event.ident
                    fdo = self._fdmap[fd]
                    self._ProcessInput(fdo)
                except ServerPacketError as err:
                    logger.info('Dropping packet: ' + str(err))
                except packet.PacketError as err:
                    logger.info('Received a broken packet: ' + str(err))
            else:
                logger.error('Unexpected event in server main loop')

changed the _PrepareSockets method as follows:

def _PrepareSockets(self):
    """Prepare all sockets to receive packets."""
    for fd in self.authfds + self.acctfds + self.coafds:
        self._fdmap[fd.fileno()] = fd
        ev = select.kevent(fd.fileno(),
                           filter=select.KQ_FILTER_READ,
                           flags=select.KQ_EV_ADD | select.KQ_EV_ENABLE)
        self._kq.control([ev], 0, 0)
    if self.auth_enabled:
        self._realauthfds = list(map(lambda x: x.fileno(), self.authfds))
    if self.acct_enabled:
        self._realacctfds = list(map(lambda x: x.fileno(), self.acctfds))
    if self.coa_enabled:
        self._realcoafds = list(map(lambda x: x.fileno(), self.coafds))

ccsalway avatar Sep 09 '18 03:09 ccsalway