cherrypy / dev / urandom (или эквивалентный) не найден - ошибка - PullRequest
5 голосов
/ 29 марта 2012

Я использую сервер cherrypy 3.2.0 с Python 2.5.1, который выдает следующую ошибку каждые несколько дней для любой инструкции из пользовательского интерфейса, пока она не будет уничтожена и перезапущена: -

[29/Mar/2012:06:37:57] HTTP Traceback (most recent call last):
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 636, in respond
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 97, in run
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cprequest.py", line 57, in __call__
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 757, in init
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 162, in __init__
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 190, in _regenerate
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/lib/sessions.py", line 204, in generate_id
File "/usr/lib/python2.5/site-packages/CherryPy-3.2.0-py2.5.egg/cherrypy/_cpcompat.py", line 264, in random20
File "/usr/lib/python2.5/os.py", line 733, in urandom
NotImplementedError: /dev/urandom (or equivalent) not found

_cpcompat.py имеет следующий фрагмент кода, который предполагает, что на random.random есть запасной вариант в случае, если cherrypy не может прочитать /dev/urandom, но, похоже, не отступает от него.

</p> <pre><code>try: os.urandom(20) import binascii def random20(): return binascii.hexlify(os.urandom(20)).decode('ascii') except (AttributeError, NotImplementedError): import random # os.urandom not available until Python 2.4. Fall back to random.random. def random20(): return sha('%s' % random.random()).hexdigest()

Ниже приведен фрагмент кода из os.py, соответствующий контексту: -

if not _exists("urandom"):</p> <pre><code> def urandom(n): """urandom(n) -> str Return a string of n random bytes suitable for cryptographic use. """ try: _urandomfd = open("/dev/urandom", O_RDONLY) except (OSError, IOError): raise NotImplementedError("/dev/urandom (or equivalent) not found") bytes = "" while len(bytes) < n: bytes += read(_urandomfd, n - len(bytes)) close(_urandomfd) return bytes

В то же время, когда cherrypy не может прочитать /dev/urandom, следующий фрагмент кода работает нормально: -

python -c "import os;fd = open('/dev/urandom', 'r');print fd.read(5);fd.close()"

У меня два вопроса: -

  1. Почему выбрасывание вишни не реализовано, когда я могу прочитать случайные биты из / dev / urandom
  2. Почему _cpcompact.py не выполняет исключение, когда os.py поднимает NotImplementedError.

Ответы [ 3 ]

4 голосов
/ 04 апреля 2012

Это тоже не ответ, однако, по моему опыту, эта NotImplementedError ошибочна, но обнаруживается, когда «слишком много файлов» являются открытыми ошибками, и начинают появляться после того, как многопроцессорные процессы начинают генерировать неперехваченное исключение, оставленное навсегда болтаться в дочерних потокахили дочерние процессы.

Я бы начал дальнейшую отладку вверх по стеку и посмотрел бы, есть ли скрытые или скрытые исключения, генерируемые процессом

Вот пример моей трассировки стека, когда я начинаю видеть эту ошибку

Exception in thread Plotter:
Traceback (most recent call last):
  File "threading.pyc", line 532, in __bootstrap_inner
  File "plotters/edge.pyc", line 459, in run
  AttributeError: 'error' object has no attribute 'error'

OSError: [Errno 24] Too many open files
  File "multiprocessing/connection.pyc", line 150, in Client
  File "multiprocessing/connection.pyc", line 370, in deliver_challenge
    None
  File "os.pyc", line 756, in urandom
NotImplementedError: /dev/urandom (or equivalent) not found

Произошла ошибка AttributeError, в конце концов ... ошибка / urandom not found imlp error

1 голос
/ 29 марта 2012

Это не ответ, но, возможно, вы могли бы поместить некоторый отладочный код в os.py (я не могу себе представить, что это повлияет на любую другую программу, использующую import os, но стоит запомнить ее настроенную)

if not _exists("urandom"):
    def urandom(n):
        """urandom(n) -> str

        Return a string of n random bytes suitable for cryptographic use.

        """
        try:
            _urandomfd = open("/dev/urandom", O_RDONLY)
        # debug changes
        except (OSError, IOError) as Err:
            import syslog
            syslog.syslog(repr(Err))
        # /debug
            raise NotImplementedError("/dev/urandom (or equivalent) not found")
        bytes = ""
        while len(bytes) < n:
            bytes += read(_urandomfd, n - len(bytes))
        close(_urandomfd)
        return bytes

Надеюсь, это точно скажет вам, в чем заключается ошибка. (Конечно, вы можете заменить системный журнал просто записью в файл и т. Д.)

0 голосов
/ 01 августа 2013

Если в вашей системе еще не созданы / dev / random и / dev / urandom, их можно создать с помощью следующих команд:

mknod -m 644 / dev / random c 1 8

mknod -m 644 / dev / urandom c 1 9

chown root: root / dev / random / dev / urandom

...