Source code for rpyc_docker.rpyc_worker

from rpyc_docker.worker import Worker
import logging,rpyc

logger = logging.getLogger("rpyc_docker")
logger.setLevel(logging.INFO)

[docs]class RpycWorker(Worker): image = "ubuntu/rpyc_worker:pexpect" """ there is a conflict with the ports when starting containers this needs to be fixed """ def __init__(self,docker,mount = None): Worker.__init__(self) self.docker = docker self.mount = mount self._rpycPort = 9000 + self.workerNum - 1 self._vncPort = 5900 + self.workerNum - 1 self.browser = None self.driver = None @property def vncPort(self): """ :return: port vncserver is listening on :rtype: int """ return self._vncPort
[docs] def create_container(self,vncExternal=False): self.container = self.docker.create_container( self.image, ports = [5900,18812], working_dir = "/Development", volumes = ['/Development'], command = "rpyc_classic.py" ) port_bindings = { 18812: ('127.0.0.1',self.rpycPort), 5900: ('127.0.0.1',self.vncPort)} if vncExternal : port_bindings[5900] = (vncExternal,self.vncPort) binds = {} if self.mount : binds = { self.mount : { 'bind': '/Development', 'ro': False }} self.response = self.docker.start( self.container, port_bindings = port_bindings, privileged = True, binds = binds, ) #this option does not seem to work #set DNS in docker with #https://robinwinslow.co.uk/2014/08/27/fix-docker-networking/ #patching the container directly by modifying resolv.conf file resolvPath = self.docker.inspect_container(self.container)["ResolvConfPath"] self.cmd(u"echo 'nameserver 8.8.8.8' | sudo tee %s" % resolvPath)
[docs] def connect_rpyc(self): self.conn = rpyc.classic.connect("127.0.0.1",self.rpycPort) self.conn.modules.sys.path.insert(0,"/root") self.conn.modules.os.environ["USER"] = "root" return True
[docs] def write_file(self,filePath,content): os = self.conn.modules.os with self.conn.builtins.open(filePath,"w") as f: f.write(content) return True
[docs] def docker_ps(self): """gets all the processes running in the docker container""" psId = self.docker.exec_create(self.container,"ps") lines = self.docker.exec_start(psId,stream=False).splitlines() titles = map(lambda t: t.lower(),lines[0].split()) processes = [] for line in lines[1:]: process = {} for title,value in zip(titles,line.split()) : process[title] = value processes.append(process) return processes
[docs] def docker_ls(self,path = ""): psId = self.docker.exec_create(self.container,"ls %s" % path) lines = self.docker.exec_start(psId,stream=False).splitlines() return lines
[docs] def enable_logger(self,name = None,stdError=False): self.logStream = cStringIO.StringIO() if name : remote_logger = self.conn.modules.logging.getLogger(name) else: remote_logger = self.conn.modules.logging.getLogger() if stdError : handler = self.conn.modules.logging.StreamHandler( sys.stderr) remote_logger.addHandler(handler) handler = self.conn.modules.logging.StreamHandler( self.logStream) remote_logger.addHandler(handler)
[docs] def teardown(self): self.docker.stop(self.container) self.docker.remove_container(self.container)
def __del__(self): try: self.teardown() except: pass