2011-07-11 8 views
6

Estoy intentando permitir que un subproceso con espacio de arena con Pypy se comunique, utilizando un protocolo limitado, con el proceso principal.Uso del módulo de socket en el espacio aislado Pypy

Después de revisar el código fuente del pypy/pypy/translator/sandbox/sandlib.py incluido con Pypy, parece que hay un VirtualizedSocketProc que permite llamadas os.open para abrir sockets. Cambié algunas funciones del código (por ejemplo, permitiendo conexiones TCP en puertos limitados), pero se ha cambiado muy poco. Sin embargo, no puedo importar el módulo socket de Pypy porque requiere un módulo _socket inexistente, que parece estar ubicado en las partes del código del intérprete.

¿Es lo que intento hacer factible? Si es así, ¿cómo importo el módulo de socket? Si no, ¿qué más puedo hacer?

+2

¿Puede explicar con más detalle por qué está tratando de abrir el zócalo fuera del entorno "protegido"? (No a juzgar, he hecho cosas similares en numerosas ocasiones, y hay algunos enfoques que quizás no hayas considerado). Sería más fácil responder la pregunta con más detalle. – synthesizerpatel

+0

Estoy intentando permitir que el proceso de espacio aislado se comunique con el proceso principal. Abrir una toma parecía una buena idea; Tengo controles para restringir el número de puerto, el host, etc. y los sockets parecían una manera fácil de comunicar los dos procesos. – nickname

+0

Específicamente, deseo ofrecer acceso restringido a algunas funciones disponibles fuera del entorno limitado. – nickname

Respuesta

4

He investigado esto más a fondo, y parece que este es un problema bastante fundamental. El módulo socket, implementado a nivel de biblioteca (dentro de los directorios lib) es esencialmente un shell vacío para la biblioteca _socket, que es un módulo de nivel de intérprete definido en el directorio pypy/module. Para aquellos que no están familiarizados con PyPy, hay dos tipos de módulos que se pueden importar, que corresponden aproximadamente a las bibliotecas Pure-Python y C en CPython. Los módulos implementados a nivel de biblioteca pueden incluirse fácilmente en el entorno limitado, y de hecho están incluidos en el entorno de prueba "predeterminado" pypy_interact. Sin embargo, los módulos escritos a nivel de intérprete no están disponibles dentro de la caja de arena.

Parece que mi enfoque fue fundmanetaly defectuoso, debido a esta distinción fundamental. En cambio, hay algunas otras opciones que usted puede considerar, caso de que tenga el mismo problema:

  1. Uso os.open directamente con un nombre de archivo que comienza con tcp://. Esto realmente funciona muy bien y es mi enfoque favorito.
  2. Implemente su propia biblioteca socket. Esto ciertamente no es preferible, pero creo que sería posible crear una biblioteca de zócalos relativamente vacía que simplemente se comunique con el controlador de la zona de pruebas como se describe anteriormente, envolviendo la funcionalidad del zócalo. Incluso podría ser posible modificar la biblioteca de socket predeterminada para lograr esto (sin incluir _socket, por ejemplo).
Cuestiones relacionadas