%PDF- %PDF-
| Direktori : /proc/self/root/lib/python3/dist-packages/execnet/ |
| Current File : //proc/self/root/lib/python3/dist-packages/execnet/gateway_socket.py |
# -*- coding: utf-8 -*-
import sys
from execnet.gateway_bootstrap import HostNotFound
try:
bytes
except NameError:
bytes = str
class SocketIO:
def __init__(self, sock, execmodel):
self.sock = sock
self.execmodel = execmodel
socket = execmodel.socket
try:
# IPTOS_LOWDELAY
sock.setsockopt(socket.SOL_IP, socket.IP_TOS, 0x10)
sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)
except (AttributeError, socket.error):
sys.stderr.write("WARNING: cannot set socketoption")
def read(self, numbytes):
"Read exactly 'bytes' bytes from the socket."
buf = bytes()
while len(buf) < numbytes:
t = self.sock.recv(numbytes - len(buf))
if not t:
raise EOFError
buf += t
return buf
def write(self, data):
self.sock.sendall(data)
def close_read(self):
try:
self.sock.shutdown(0)
except self.execmodel.socket.error:
pass
def close_write(self):
try:
self.sock.shutdown(1)
except self.execmodel.socket.error:
pass
def wait(self):
pass
def kill(self):
pass
def start_via(gateway, hostport=None):
"""return a host, port tuple,
after instanciating a socketserver on the given gateway
"""
if hostport is None:
host, port = ("localhost", 0)
else:
host, port = hostport
from execnet.script import socketserver
# execute the above socketserverbootstrap on the other side
channel = gateway.remote_exec(socketserver)
channel.send((host, port))
(realhost, realport) = channel.receive()
# self._trace("new_remote received"
# "port=%r, hostname = %r" %(realport, hostname))
if not realhost or realhost == "0.0.0.0":
realhost = "localhost"
return realhost, realport
def create_io(spec, group, execmodel):
assert not spec.python, "socket: specifying python executables not yet supported"
gateway_id = spec.installvia
if gateway_id:
host, port = start_via(group[gateway_id])
else:
host, port = spec.socket.split(":")
port = int(port)
socket = execmodel.socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
io = SocketIO(sock, execmodel)
io.remoteaddress = "%s:%d" % (host, port)
try:
sock.connect((host, port))
except execmodel.socket.gaierror:
raise HostNotFound(str(sys.exc_info()[1]))
return io