Exemplo n.º 1
0
def serve(handler):
    server = ThreadingTCPServer(('localhost', 0), handler)
    thread = threading.Thread(target=server.serve_forever, daemon=True)
    thread.start()
    yield server.server_address
    server.shutdown()
    server.server_close()
Exemplo n.º 2
0
def main():
    if len(sys.argv) < 2:
        print("Usage: {} binFile [port]\n\t".format(sys.argv[0]))
        exit(-1)

    binFile = sys.argv[1]
    port = DEFAULT_PORT if len(sys.argv) < 3 else int(sys.argv[2])

    print('binFile:', binFile, 'port:', port)
    server = ThreadingTCPServer(('', port), EncodeHandler)

    def sigint_handler(signum, frame):
        print('sig {} raised: {}'.format(signum, frame))
        server.socket.close()
        server.shutdown()
        sys.exit(0)

    signal.signal(signal.SIGINT,
                  sigint_handler)  # main thread will handle signals

    try:
        EncodeHandler.bitmapList = load_video_bin(binFile)
        waiterThread = Thread(target=server.serve_forever, args=())
        waiterThread.start()
        waiterThread.join()
    except Exception as e:
        print('exception raised:', e)
    finally:
        server.socket.close()
        server.shutdown()
Exemplo n.º 3
0
class Proxy():
    def __init__(self):
        if hasattr(subprocess, 'STARTUPINFO'):
            self.si = subprocess.STARTUPINFO()
            self.si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
        else:
            self.si = None

    def winrun(self, cmd):
        subprocess.check_output(cmd, stdin=subprocess.PIPE, stderr=subprocess.PIPE \
           , startupinfo=self.si, env=os.environ)

    def start(self, address, port):
        try:
            self.server = ThreadingTCPServer((address, int(port)),
                                             ProxyHandler)
            logger.info("server started at {}:{}".format(address, port))
            if setting.config['setproxy'] and sys.platform.startswith('win'):
                self.winrun(
                    os.path.join(basepath, 'sysproxy.exe') +
                    ' pac http://localhost:' +
                    str(setting.config['webuiport']) + '/pac/?t=' +
                    str(random.randrange(2**16)))
            self.server.serve_forever()
        except socket.error as e:
            logger.error(e)

    def shutdown(self):
        self.server.shutdown()

    def server_close(self):
        self.server.server_close()
Exemplo n.º 4
0
    def run(self):
        def signal_func(sig, stack):
            raise KeyboardInterrupt

        signal.signal(signal.SIGTERM, signal_func)
        try:
            self._logger.info("Start listening for other host's access.")
            addr = params.peer_address
            access_ip = addr.split(':')[0]
            access_port = int(addr.split(':')[1])
            peer_server = ThreadingTCPServer((access_ip, access_port),
                                             peers_handler)
            peer_server.socket = secure_socket(sock=peer_server.socket,
                                               server_side=True)

            listening_thread = threading.Thread(
                target=peer_server.serve_forever)
            listening_thread.setDaemon(True)
            listening_thread.start()

            self._logger.info("Device monitor start, listening %s." %
                              self._proxy_addr)
            device_server = TCPServer((self._proxy_ip, self._proxy_port),
                                      device_handler)
            device_server.serve_forever()
        except KeyboardInterrupt:
            self._logger.info("Device monitor receive KeyboardInterrupt.")
            device_server.shutdown()
            device_server.server_close()
            peer_server.shutdown()
            peer_server.server_close()
            self._logger.info("Device monitor closed.")
Exemplo n.º 5
0
class WebUI(object):

    version = "Bitcoin WebUI v0.0.1"

    def __init__(self, config):
        self.config = config
        credentials = config.rpcusername + ":" + config.rpcpassword
        self.rpcauth = "Basic " + base64.b64encode(
            credentials.encode("utf_8")).decode("ascii")
        self.httpd = None

    def start(self):
        self.httpd = ThreadingTCPServer(
            (self.config.bindip, self.config.bindport), RequestHandler, False)
        self.httpd.webui = self
        self.httpd.allow_reuse_address = True
        self.httpd.daemon_threads = True
        tcp_socket = socket.socket(self.httpd.address_family,
                                   self.httpd.socket_type)
        self.httpd.socket = ssl.wrap_socket(tcp_socket,
                                            self.config.privkeyfile,
                                            self.config.pubkeyfile, True)
        self.httpd.server_bind()
        self.httpd.server_activate()
        self.serverthread = Thread(None, self.httpd.serve_forever, "httpd")
        self.serverthread.start()

    def stop(self):
        self.httpd.shutdown()
        self.serverthread.join(5)
        self.httpd.server_close()
Exemplo n.º 6
0
class WebUI(object):

  version = "Bitcoin WebUI v0.0.1"


  def __init__(self, config):
    self.config = config
    credentials = config.rpcusername + ":" + config.rpcpassword
    self.rpcauth = "Basic " + base64.b64encode(credentials.encode("utf_8")).decode("ascii")
    self.httpd = None


  def start(self):
    self.httpd = ThreadingTCPServer((self.config.bindip, self.config.bindport), RequestHandler, False)
    self.httpd.webui = self
    self.httpd.allow_reuse_address = True
    self.httpd.daemon_threads = True
    tcp_socket = socket.socket(self.httpd.address_family, self.httpd.socket_type)
    self.httpd.socket = ssl.wrap_socket(tcp_socket, self.config.privkeyfile, self.config.pubkeyfile, True)
    self.httpd.server_bind()
    self.httpd.server_activate()
    self.serverthread = Thread(None, self.httpd.serve_forever, "httpd")
    self.serverthread.start()


  def stop(self):
    self.httpd.shutdown()
    self.serverthread.join(5)
    self.httpd.server_close()
Exemplo n.º 7
0
    def shutdown(self):
        """
        Safely shutdown server and thread

        :return: None
        """
        ThreadingTCPServer.shutdown(self)
        Thread.join(self)
Exemplo n.º 8
0
class Server:
    def __init__(self, port):
        server_logger.info('listening to connections...')
        ThreadingTCPServer.allow_reuse_address = True
        self.serve = ThreadingTCPServer(('', port), ServerRequestHandler)

    def run(self):
        self.serve.serve_forever()

    def stop(self):
        self.serve.shutdown()
Exemplo n.º 9
0
class tcp_server(QThread):  # 为了Handle能够发送Qt信号 所以使用Qthread
    dataChanged = pyqtSignal(dict)  # 自定义发送信号

    def __init__(self, port, mode):  # mode = 'grc' or 'hcr'
        super().__init__()
        self.serv = None
        self.port = port
        self.mode = mode

    def run(self):
        if self.mode == 'grc':
            self.serv = ThreadingTCPServer(('', self.port),
                                           GRC_Handler,
                                           bind_and_activate=False)
            self.serv.socket.settimeout(1)  # 设置超时, 以便能够退出线程
            self.serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,
                                        True)  # 设置端口重用, 以便异常socket断开后的重建
            self.serv.qthread = self  # 这里让Handle里面有信号的发射口

        elif self.mode == 'hcr':
            self.serv = ThreadingTCPServer(('', self.port),
                                           HCR_Handler,
                                           bind_and_activate=False)
            self.serv.socket.settimeout(1)  # 设置超时, 以便能够退出线程
            self.serv.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,
                                        True)  # 设置端口重用, 以便异常socket断开后的重建

        else:
            print("error")
            return
        # Bind and activate
        # self.setName("tcp_server " + self.mode)
        self.serv.server_bind()
        self.serv.server_activate()
        self.serv.serve_forever()

    def send_data(self, data):
        '''
            Args:
                data: bytes data
        '''
        if self.is_alive():
            for client in client_socket:
                client.sendall(data)

    def shutdown(self):
        for client in client_socket:
            client.shutdown(1)
        shutdown_flag[0] = True
        self.serv.socket.close()
        self.serv.shutdown()
        self.serv.server_close()
Exemplo n.º 10
0
 def run(self):
     server = ThreadingTCPServer(self.addr, _TcpConnection, bind_and_activate=True)
     server.mux = self
     Thread(target=server.serve_forever, name="TcpServerTransport_Listen").start()
     if self.announcer:
         self.announcer.transport.start()
     
     MuxTransport.run(self)
     
     if self.announcer:
         self.announcer.transport.stop()
     
     server.shutdown()
Exemplo n.º 11
0
class SockListener(BaseListener):
    handlerCls = SockServiceHandler

    def __init__(self, *args, **kwargs):
        super(SockListener, self).__init__(*args, **kwargs)
        # inject service_handler
        SockBoltHandler.service_handler = self.handler
        self.server = ThreadingTCPServer(self.address, SockBoltHandler)

    def run_forever(self):
        self.server.serve_forever()

    def shutdown(self):
        self.server.shutdown()
Exemplo n.º 12
0
    def test_nopassword(self):
        try:
            server = ThreadingTCPServer((ADDRESS, PORT), _TelnetNoUsernamePasswordRequestHandler)
            _, port = server.server_address
            self.port = port

            thread = Thread(target=server.serve_forever)
            thread.start()

            ch = TelnetCredentialChecker()
            self.assertTrue(ch.check(ADDRESS, self.port))
        finally:
            server.shutdown()
            server.server_close()
Exemplo n.º 13
0
class Proxy():
    def start(self, address, port):
        try:
            self.server = ThreadingTCPServer((address, int(port)), ProxyHandler)
            logger.info("server started at {}:{}".format(address, port))
            if sys.platform.startswith('win'):
                os.system(os.path.join(basepath, 'sysproxy.exe')+' pac http://localhost:7654/pac/?t=%random%')
            self.server.serve_forever()
        except socket.error as e:
            logger.error(e)
    def shutdown(self):
        self.server.shutdown()
    def server_close(self):
        self.server.server_close()
Exemplo n.º 14
0
class Master:
    def __init__(self, zk_hosts, zk_root, address):
        self.zk = KazooClient(zk_hosts)
        self.root = zk_root
        self.server = ThreadingTCPServer(address, MasterHandler)
        self.server.zk = self.zk
        self.server.root = self.root

    def start(self):
        self.zk.start()
        self.server.serve_forever()

    def shutdown(self):
        self.server.shutdown()
        self.zk.close()
Exemplo n.º 15
0
    def test_error(self):
        """Test what happens when TelnetCredsChecker is being run against something that is not telnet"""

        try:
            server = ThreadingTCPServer((ADDRESS, PORT), _NotTelnetRequestHandler)
            _, port = server.server_address
            self.port = port

            thread = Thread(target=server.serve_forever)
            thread.start()

            ch = TelnetCredentialChecker()
            self.assertFalse(ch.check(ADDRESS, self.port))
        finally:
            server.shutdown()
            server.server_close()
Exemplo n.º 16
0
def main(address=None):
    try:
        LOGGER.info("Server up.")
        if address is None:
            ip = socket.gethostbyname(socket.gethostname())
            port = params.controller_port

            address = ip + ':' + str(port)

        LOGGER.info("Server listening address %s." % address)

        ip = address.split(':')[0]
        port = int(address.split(':')[1])

        server = ThreadingTCPServer((ip, port), request_handler)
        server.socket = secure_socket(sock=server.socket, server_side=True)
        server.daemon_threads = True

        LOGGER.info("Creating work thread...")
        serv_thread = threading.Thread(target=server.serve_forever)
        serv_thread.setDaemon(True)
        serv_thread.start()
        LOGGER.info("server is running at %s." % address)

        a_table = access_table()
        while True:
            time.sleep(5)
            # LOGGER.critical(a_table.print())
    except KeyboardInterrupt:
        LOGGER.info("Receive keyboard interrupt, shut down...")
    except BaseException:
        LOGGER.error("Catch unhandled exception.")
        traceback.print_exc()
    finally:
        try:
            LOGGER.info("Exit handle loop...")
            server.shutdown()
            LOGGER.info("Close socket...")
            server.server_close()
        except:
            pass
        try:
            LOGGER.info("Wait all request handler threads...")
            serv_thread.join()
        except:
            pass
        LOGGER.info("Server down.")
Exemplo n.º 17
0
    def test_fail(self):
        try:
            server = ThreadingTCPServer((ADDRESS, PORT), _TelnetRequestHandler)
            _, port = server.server_address
            self.port = port

            server.telnet_username = INVALID_USERNAME
            server.telnet_password = INVALID_PASSWORD

            thread = Thread(target=server.serve_forever)
            thread.start()

            ch = TelnetCredentialChecker()
            self.assertFalse(ch.check(ADDRESS, self.port))
        finally:
            server.shutdown()
            server.server_close()
Exemplo n.º 18
0
class Server(Thread):

    def __init__(self, host, port, dispatcher):
        Thread.__init__(self)
        self.daemon = True
        self.server = ThreadingTCPServer((host, port), RequestHandler, bind_and_activate=False)
        self.server.allow_reuse_address = True
        self.server.server_bind()
        self.server.server_activate()
        self.server.dispatcher = dispatcher

    def run(self):
        logging.debug('server thread is running...')
        self.server.serve_forever()

    def stop(self):
        logging.debug('server thread will be stopped')
        self.server.shutdown()
        self.server.server_close()
        logging.debug('server thread is killed')
Exemplo n.º 19
0
class ThreadingServerInThread(object):
    """
    Context manager for running a threading http server in a thread.

    Since the Thread is not using "daemon=True", it will keep Python running
    until the context manager exits, which means until request completion.
    """

    def __init__(self, port=8000):
        self._server_address = ("127.0.0.1", port)
        self._handler = SimpleHTTPRequestHandlerHere
        self.httpd = ThreadingTCPServer(
            self._server_address, self._handler, bind_and_activate=False
        )

    def _bind_and_activate(self):
        try:
            self.httpd.server_bind()
            self.httpd.server_activate()
        except Exception as e:
            self.httpd.server_close()
            raise e

    def start(self):
        self._bind_and_activate()
        thread = threading.Thread(target=self.httpd.serve_forever)
        thread.start()

    def stop(self):
        self.httpd.shutdown()
        self.httpd.server_close()

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.stop()
Exemplo n.º 20
0
def run_server(_,
               address=CONFIG.SERVER_ADDR,
               port=CONFIG.SERVER_PORT,
               log_level='INFO'):
    """ Launches 'WG Forge' TCP server.
    """
    log.setLevel(log_level)
    ThreadingTCPServer.allow_reuse_address = True
    server = ThreadingTCPServer((address, port), GameServerRequestHandler)
    log.info('Serving on {}'.format(server.socket.getsockname()))
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        log.warn('Server stopped by keyboard interrupt, shutting down...')
    finally:
        try:
            GameServerRequestHandler.shutdown_all_sockets()
            Game.stop_all_games()
            if log.is_queued:
                log.stop()
        finally:
            server.shutdown()
            server.server_close()
Exemplo n.º 21
0
class Tunnel():
    """Open SOCKS tunnel to a :class:`Host`

    Each tunnel is opened in distinct thread so that BabooSSH is still usable
    while the tunnel is open.

    Attributes:
        connection (:class:`.Connection`): the tunnel exit
        port (int): the tunnel entrance (local) port. Uses a random port if
            none is provided.
    """
    def __init__(self, connection, port=None):
        self.connection = connection
        if port is None:
            port = 0
        self.connection.open()
        self.connection.used_by_tunnels.append(self)
        self.server = ThreadingTCPServer(('127.0.0.1', port), SocksProxy)
        self.server.output = self.connection.transport
        ip, newport = self.server.server_address
        self.port = newport
        self.thread = threading.Thread(target=self.server.serve_forever)
        self.thread.start()
        print("Tunnel to " + str(self.connection) + " open on port " +
              str(self.port))

    def close(self):
        """Close a previously opened port"""
        try:
            self.connection.used_by_tunnels.remove(self)
        except:
            pass
        self.server.shutdown()
        print("Tunnel port " + str(self.port) + " closed")

    def __str__(self):
        return str(self.port) + "->" + str(self.connection)
Exemplo n.º 22
0
class ThreadingServerInThread(object):
    """
    Context manager for running a threading http server in a thread.

    Since the Thread is not using "daemon=True", it will keep Python running
    until the context manager exits, which means until request completion.
    """

    def __init__(self, port=8000):
        self._server_address = ("127.0.0.1", port)
        self._handler = SimpleHTTPRequestHandlerHere
        self.httpd = ThreadingTCPServer(
            self._server_address, self._handler, bind_and_activate=False)

    def _bind_and_activate(self):
        try:
            self.httpd.server_bind()
            self.httpd.server_activate()
        except Exception as e:
            self.httpd.server_close()
            raise e

    def start(self):
        self._bind_and_activate()
        thread = threading.Thread(target=self.httpd.serve_forever)
        thread.start()

    def stop(self):
        self.httpd.shutdown()
        self.httpd.server_close()

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.stop()
Exemplo n.º 23
0
def EchoServer():
    server = ThreadingTCPServer(('127.0.0.1', 9999), EchoHandler)

    server_thread = threading.Thread(target=server.serve_forever,
                                     name='EchoServer',
                                     daemon=True)
    server_thread.start()

    try:
        while True:
            cmd = input('>>')
            if cmd.strip() == 'quit':
                server.shutdown()
                break
            print(threading.enumerate())
    except Exception as e:
        print(e)
    except KeyboardInterrupt:
        pass
    finally:
        print('exit')
        sys.exit(0)

    pass
Exemplo n.º 24
0
def ChatServer():
    FOMAT = '%(asctime)s %(thread)s %(threadName)s %(message)s'
    logging.basicConfig(level=logging.INFO, format=FOMAT)

    laddr = ('127.0.0.1', 9988)
    server = ThreadingTCPServer(laddr, ChatServerHanlder)
    print(server.socket)
    threading.Thread(target=server.serve_forever, name='server').start()

    try:
        while True:
            cmd = input(">>>>")
            if cmd == 'quit':
                server.shutdown()
                break
            print(threading.enumerate())
    except Exception as e:
        print(e)

    except KeyboardInterrupt:
        pass
    finally:
        print('exit')
        sys.exit(0)
Exemplo n.º 25
0
class WebUI(BaseFrontend):

    version = "theseven.webui v0.1.0"
    default_name = "WebUI"
    can_log = True
    can_configure = True
    can_autodetect = True
    settings = dict(
        BaseFrontend.settings,
        **{
            "port": {"title": "HTTP port", "type": "int", "position": 1000},
            "users": {
                "title": "Users",
                "type": "dict",
                "key": {"title": "User:Password", "type": "string"},
                "value": {
                    "title": "Privilege level",
                    "type": "enum",
                    "values": [
                        {"value": "readonly", "title": "Read only access"},
                        {"value": "admin", "title": "Full access"},
                    ],
                },
                "position": 2000,
            },
            "log_buffer_max_length": {"title": "Maximum log buffer length", "type": "int", "position": 3000},
            "log_buffer_purge_size": {"title": "Log buffer purge size", "type": "int", "position": 3010},
        }
    )

    @classmethod
    def autodetect(self, core):
        core.add_frontend(self(core))

    def __init__(self, core, state=None):
        super(WebUI, self).__init__(core, state)
        self.log_lock = RLock()

    def apply_settings(self):
        super(WebUI, self).apply_settings()
        if not "port" in self.settings:
            self.settings.port = 8832
        if not "users" in self.settings:
            self.settings.users = {"admin:mpbm": "admin"}
        if not "uiconfig" in self.settings:
            self.settings.uiconfig = {"loggadget": {"loglevel": self.core.default_loglevel}}
        if not "log_buffer_max_length" in self.settings:
            self.settings.log_buffer_max_length = 1000
        if not "log_buffer_purge_size" in self.settings:
            self.settings.log_buffer_purge_size = 100
        if self.started and self.settings.port != self.port:
            self.async_restart(3)

    def _reset(self):
        self.log_buffer = []
        self.log_listeners = []

    def _start(self):
        super(WebUI, self)._start()
        self.httpd = ThreadingTCPServer(("", self.settings.port), RequestHandler, False)
        self.httpd.webui = self
        self.httpd.allow_reuse_address = True
        self.httpd.daemon_threads = True
        self.httpd.server_bind()
        self.httpd.server_activate()
        self.serverthread = Thread(None, self.httpd.serve_forever, self.settings.name + "_httpd")
        self.serverthread.daemon = True
        self.serverthread.start()
        self.port = self.settings.port

    def _stop(self):
        self.httpd.shutdown()
        self.serverthread.join(10)
        self.httpd.server_close()
        super(WebUI, self)._stop()

    def write_log_message(self, source, timestamp, loglevel, messages):
        if not self.started:
            return
        data = {
            "timestamp": time.mktime(timestamp.timetuple()) * 1000 + timestamp.microsecond / 1000.0,
            "loglevel": loglevel,
            "source": source.settings.name,
            "message": [{"data": data, "format": format} for data, format in messages],
        }
        with self.log_lock:
            for queue in self.log_listeners:
                queue.put(data)
            self.log_buffer.append(data)
            if len(self.log_buffer) > self.settings.log_buffer_max_length:
                self.log_buffer = self.log_buffer[self.settings.log_buffer_purge_size :]

    def register_log_listener(self, listener):
        with self.log_lock:
            if not listener in self.log_listeners:
                self.log_listeners.append(listener)
            for data in self.log_buffer:
                listener.put(data)

    def unregister_log_listener(self, listener):
        with self.log_lock:
            while listener in self.log_listeners:
                self.log_listeners.remove(listener)
Exemplo n.º 26
0
# coding:utf-8
from socketserver import ThreadingTCPServer,StreamRequestHandler


class LogRequestHandler(StreamRequestHandler):
    def handle(self):
        print('client {} is online!'.format(self.client_address))
        filename = self.rfile.readline().decode().strip()
        fd = open('/logs/{0}'.format(filename),'a')
        while True:
            data = self.rfile.readline()
            if not data.strip():
                break
            fd.write(data.decode())
            fd.flush()
        print('close connection')
        fd.close()


if __name__ == '__main__':
    addr = ('192.168.2.53',8080)
    server = ThreadingTCPServer(addr,LogRequestHandler)
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
Exemplo n.º 27
0
        handler.serve_forever()
    except Exception as e:
        Script.log(e, lvl=Script.DEBUG)
        pass


ThreadingTCPServer.allow_reuse_address = True
_PORT = 48996
handler = ThreadingTCPServer(("", _PORT), proxy.JioTVProxy)
t = threading.Thread(target=serveForever, args=(handler, ))
t.setDaemon(True)
t.start()

if not Settings.get_boolean("popup"):
    xbmcgui.Dialog().ok(
        "JioTV Notification",
        "Now you can create your custom playlist from BotAllen Dashboard. [CR]Find out more at [B]https://botallen.com/#dashboard[/B] [CR][CR]If you like this add-on then consider donating from [B]https://botallen.com/#donate[/B] [CR][CR]Github: [B]https://github.com/botallen/repository.botallen[/B] [CR]Discord: [B]https://botallen.com/discord[/B] [CR][CR][I]You can disable this popup from settings[/I]"
    )

if Settings.get_boolean("m3ugen"):
    executebuiltin(
        "RunPlugin(plugin://plugin.video.jiotv/resources/lib/main/m3ugen/?notify=no)"
    )

monitor = Monitor()
while not monitor.abortRequested():
    if monitor.waitForAbort(10):
        handler.shutdown()
        handler.server_close()
        break
Exemplo n.º 28
0
class WebUI(BaseFrontend):

    version = "theseven.webui v0.1.0beta"
    default_name = "WebUI"
    can_log = True
    can_configure = True
    can_autodetect = True
    settings = dict(
        BaseFrontend.settings, **{
            "port": {
                "title": "HTTP port",
                "type": "int",
                "position": 1000
            },
            "users": {
                "title": "Users",
                "type": "dict",
                "key": {
                    "title": "User:Password",
                    "type": "string"
                },
                "value": {
                    "title":
                    "Privilege level",
                    "type":
                    "enum",
                    "values": [
                        {
                            "value": "readonly",
                            "title": "Read only access"
                        },
                        {
                            "value": "admin",
                            "title": "Full access"
                        },
                    ],
                },
                "position": 2000
            },
            "log_buffer_max_length": {
                "title": "Maximum log buffer length",
                "type": "int",
                "position": 3000
            },
            "log_buffer_purge_size": {
                "title": "Log buffer purge size",
                "type": "int",
                "position": 3010
            },
        })

    @classmethod
    def autodetect(self, core):
        core.add_frontend(self(core))

    def __init__(self, core, state=None):
        super(WebUI, self).__init__(core, state)
        self.log_lock = RLock()

    def apply_settings(self):
        super(WebUI, self).apply_settings()
        if not "port" in self.settings: self.settings.port = 8832
        if not "users" in self.settings:
            self.settings.users = {"admin:mpbm": "admin"}
        if not "uiconfig" in self.settings:
            self.settings.uiconfig = {
                "loggadget": {
                    "loglevel": self.core.default_loglevel
                }
            }
        if not "log_buffer_max_length" in self.settings:
            self.settings.log_buffer_max_length = 1000
        if not "log_buffer_purge_size" in self.settings:
            self.settings.log_buffer_purge_size = 100
        if self.started and self.settings.port != self.port:
            self.async_restart(3)

    def _reset(self):
        self.log_buffer = []
        self.log_listeners = []

    def _start(self):
        super(WebUI, self)._start()
        self.httpd = ThreadingTCPServer(("", self.settings.port),
                                        RequestHandler, False)
        self.httpd.webui = self
        self.httpd.allow_reuse_address = 1
        self.httpd.server_bind()
        self.httpd.server_activate()
        self.serverthread = Thread(None, self.httpd.serve_forever,
                                   self.settings.name + "_httpd")
        self.serverthread.daemon = True
        self.serverthread.start()
        self.port = self.settings.port

    def _stop(self):
        self.httpd.shutdown()
        self.serverthread.join(10)
        self.httpd.server_close()
        super(WebUI, self)._stop()

    def write_log_message(self, timestamp, loglevel, messages):
        if not self.started: return
        data = {
            "timestamp":
            time.mktime(timestamp.timetuple()) * 1000 +
            timestamp.microsecond / 1000,
            "loglevel":
            loglevel,
            "message": [{
                "data": data,
                "format": format
            } for data, format in messages],
        }
        with self.log_lock:
            for queue in self.log_listeners:
                queue.put(data)
            self.log_buffer.append(data)
            if len(self.log_buffer) > self.settings.log_buffer_max_length:
                self.log_buffer = self.log_buffer[self.settings.
                                                  log_buffer_purge_size:]

    def register_log_listener(self, listener):
        with self.log_lock:
            if not listener in self.log_listeners:
                self.log_listeners.append(listener)
            for data in self.log_buffer:
                listener.put(data)

    def unregister_log_listener(self, listener):
        with self.log_lock:
            while listener in self.log_listeners:
                self.log_listeners.remove(listener)
Exemplo n.º 29
0
def close_server(server: ThreadingTCPServer) -> None:
    server.shutdown()
    server.server_close()
Exemplo n.º 30
0
import sys
from socketserver import BaseRequestHandler, ThreadingTCPServer


class EchoHandler(BaseRequestHandler):
    def handle(self):
        print("Got connection from", self.client_address)
        while True:
            msg = self.request.recv(8192)
            if not msg:
                break
            print("Replying:", msg)
            self.request.send(msg)


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Usage: python main.py port")
        sys.exit(1)
    port = int(sys.argv[1])
    try:
        serv = ThreadingTCPServer(('', port), EchoHandler)
        serv.serve_forever()
    except KeyboardInterrupt:
        serv.shutdown()
        serv.server_close()
Exemplo n.º 31
0
class ModbusServer(object):

    """Modbus TCP server"""

    class ModbusService(BaseRequestHandler):

        def recv_all(self, size):
            if hasattr(socket, "MSG_WAITALL"):
                data = self.request.recv(size, socket.MSG_WAITALL)
            else:
                # Windows lacks MSG_WAITALL
                data = b''
                while len(data) < size:
                    data += self.request.recv(size - len(data))
            return data

        def handle(self):
            while True:
                rx_head = self.recv_all(7)
                # close connection if no standard 7 bytes header
                if not (rx_head and len(rx_head) == 7):
                    break
                # decode header
                (rx_hd_tr_id, rx_hd_pr_id,
                 rx_hd_length, rx_hd_unit_id) = struct.unpack('>HHHB', rx_head)
                # close connection if frame header content inconsistency
                if not ((rx_hd_pr_id == 0) and (2 < rx_hd_length < 256)):
                    break
                # receive body
                rx_body = self.recv_all(rx_hd_length - 1)
                # close connection if lack of bytes in frame body
                if not (rx_body and (len(rx_body) == rx_hd_length - 1)):
                    break
                # body decode: function code
                rx_bd_fc = struct.unpack('B', rx_body[0:1])[0]
                # close connection if function code is inconsistent
                if rx_bd_fc > 0x7F:
                    break
                # default except status
                exp_status = const.EXP_NONE
                # functions Read Coils (0x01) or Read Discrete Inputs (0x02)
                if rx_bd_fc in (const.READ_COILS, const.READ_DISCRETE_INPUTS):
                    (b_address, b_count) = struct.unpack('>HH', rx_body[1:])
                    # check quantity of requested bits
                    if 0x0001 <= b_count <= 0x07D0:
                        bits_l = DataBank.get_bits(b_address, b_count)
                        if bits_l:
                            # allocate bytes list
                            b_size = int(b_count / 8)
                            b_size += 1 if (b_count % 8) else 0
                            bytes_l = [0] * b_size
                            # populate bytes list with data bank bits
                            for i, item in enumerate(bits_l):
                                if item:
                                    byte_i = int(i/8)
                                    bytes_l[byte_i] = set_bit(bytes_l[byte_i], i % 8)
                            # format body of frame with bits
                            tx_body = struct.pack('BB', rx_bd_fc, len(bytes_l))
                            # add bytes with bits
                            for byte in bytes_l:
                                tx_body += struct.pack('B', byte)
                        else:
                            exp_status = const.EXP_DATA_ADDRESS
                    else:
                        exp_status = const.EXP_DATA_VALUE
                # functions Read Holding Registers (0x03) or Read Input Registers (0x04)
                elif rx_bd_fc in (const.READ_HOLDING_REGISTERS, const.READ_INPUT_REGISTERS):
                    (w_address, w_count) = struct.unpack('>HH', rx_body[1:])
                    # check quantity of requested words
                    if 0x0001 <= w_count <= 0x007D:
                        words_l = DataBank.get_words(w_address, w_count)
                        if words_l:
                            # format body of frame with words
                            tx_body = struct.pack('BB', rx_bd_fc, w_count * 2)
                            for word in words_l:
                                tx_body += struct.pack('>H', word)
                        else:
                            exp_status = const.EXP_DATA_ADDRESS
                    else:
                        exp_status = const.EXP_DATA_VALUE
                # function Write Single Coil (0x05)
                elif rx_bd_fc is const.WRITE_SINGLE_COIL:
                    (b_address, b_value) = struct.unpack('>HH', rx_body[1:])
                    f_b_value = bool(b_value == 0xFF00)
                    if DataBank.set_bits(b_address, [f_b_value]):
                        # send write ok frame
                        tx_body = struct.pack('>BHH', rx_bd_fc, b_address, b_value)
                    else:
                        exp_status = const.EXP_DATA_ADDRESS
                # function Write Single Register (0x06)
                elif rx_bd_fc is const.WRITE_SINGLE_REGISTER:
                    (w_address, w_value) = struct.unpack('>HH', rx_body[1:])
                    if DataBank.set_words(w_address, [w_value]):
                        # send write ok frame
                        tx_body = struct.pack('>BHH', rx_bd_fc, w_address, w_value)
                    else:
                        exp_status = const.EXP_DATA_ADDRESS
                # function Write Multiple Coils (0x0F)
                elif rx_bd_fc is const.WRITE_MULTIPLE_COILS:
                    (b_address, b_count, byte_count) = struct.unpack('>HHB', rx_body[1:6])
                    # check quantity of updated coils
                    if (0x0001 <= b_count <= 0x07B0) and (byte_count >= (b_count/8)):
                        # allocate bits list
                        bits_l = [False] * b_count
                        # populate bits list with bits from rx frame
                        for i, item in enumerate(bits_l):
                            b_bit_pos = int(i/8)+6
                            b_bit_val = struct.unpack('B', rx_body[b_bit_pos:b_bit_pos+1])[0]
                            bits_l[i] = test_bit(b_bit_val, i % 8)
                        # write words to data bank
                        if DataBank.set_bits(b_address, bits_l):
                            # send write ok frame
                            tx_body = struct.pack('>BHH', rx_bd_fc, b_address, b_count)
                        else:
                            exp_status = const.EXP_DATA_ADDRESS
                    else:
                        exp_status = const.EXP_DATA_VALUE
                # function Write Multiple Registers (0x10)
                elif rx_bd_fc is const.WRITE_MULTIPLE_REGISTERS:
                    (w_address, w_count, byte_count) = struct.unpack('>HHB', rx_body[1:6])
                    # check quantity of updated words
                    if (0x0001 <= w_count <= 0x007B) and (byte_count == w_count * 2):
                        # allocate words list
                        words_l = [0] * w_count
                        # populate words list with words from rx frame
                        for i, item in enumerate(words_l):
                            w_offset = i * 2 + 6
                            words_l[i] = struct.unpack('>H', rx_body[w_offset:w_offset + 2])[0]
                        # write words to data bank
                        if DataBank.set_words(w_address, words_l):
                            # send write ok frame
                            tx_body = struct.pack('>BHH', rx_bd_fc, w_address, w_count)
                        else:
                            exp_status = const.EXP_DATA_ADDRESS
                    else:
                        exp_status = const.EXP_DATA_VALUE
                else:
                    exp_status = const.EXP_ILLEGAL_FUNCTION
                # check exception
                if exp_status != const.EXP_NONE:
                    # format body of frame with exception status
                    tx_body = struct.pack('BB', rx_bd_fc + 0x80, exp_status)
                # build frame header
                tx_head = struct.pack('>HHHB', rx_hd_tr_id, rx_hd_pr_id, len(tx_body) + 1, rx_hd_unit_id)
                # send frame
                self.request.send(tx_head + tx_body)
            self.request.close()

    def __init__(self, host='localhost', port=const.MODBUS_PORT, no_block=False, ipv6=False):
        """Constructor

        Modbus server constructor.

        :param host: hostname or IPv4/IPv6 address server address (optional)
        :type host: str
        :param port: TCP port number (optional)
        :type port: int
        :param no_block: set no block mode, in this mode start() return (optional)
        :type no_block: bool
        :param ipv6: use ipv6 stack
        :type ipv6: bool
        """
        # public
        self.host = host
        self.port = port
        self.no_block = no_block
        self.ipv6 = ipv6
        # private
        self._running = False
        self._service = None
        self._serve_th = None

    def start(self):
        """Start the server.

        Do nothing if server is already running.
        This function will block if no_block is not set to True.
        """
        if not self.is_run:
            # set class attribute
            ThreadingTCPServer.address_family = socket.AF_INET6 if self.ipv6 else socket.AF_INET
            ThreadingTCPServer.daemon_threads = True
            # init server
            self._service = ThreadingTCPServer((self.host, self.port), self.ModbusService, bind_and_activate=False)
            # set socket options
            self._service.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
            self._service.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
            # TODO test no_delay with bench
            self._service.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
            # bind and activate
            self._service.server_bind()
            self._service.server_activate()
            # serve request
            if self.no_block:
                self._serve_th = Thread(target=self._serve)
                self._serve_th.daemon = True
                self._serve_th.start()
            else:
                self._serve()

    def stop(self):
        """Stop the server.

        Do nothing if server is already not running.
        """
        if self.is_run:
            self._service.shutdown()
            self._service.server_close()

    @property
    def is_run(self):
        """Return True if server running.

        """
        return self._running

    def _serve(self):
        try:
            self._running = True
            self._service.serve_forever()
        except:
            self._service.server_close()
            raise
        finally:
            self._running = False
Exemplo n.º 32
0
import sys
from socketserver import BaseRequestHandler, ThreadingTCPServer

class EchoHandler(BaseRequestHandler):

    def handle(self):
        print("Got connection from", self.client_address)
        while True:
            msg = self.request.recv(8192)
            if not msg:
                break
            print("Replying:", msg)
            self.request.send(msg)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("Usage: python main.py port")
        sys.exit(1)
    port = int(sys.argv[1])
    try:
        serv = ThreadingTCPServer(('', port), EchoHandler)
        serv.serve_forever()
    except KeyboardInterrupt:
        serv.shutdown()
        serv.server_close()
Exemplo n.º 33
0
def stop(srv: socketserver.ThreadingTCPServer):
    srv.shutdown()
    srv.close()
Exemplo n.º 34
0
class TcpServerTransport(MuxTransport):
    '''transport that accepts TCP connections as transports.

    Basically a mux transport coupled with a TcpServer. Each time somebody
    connects, the connection is wrapped into a transport and added to the
    muxer.

    There is (for now) no explicit notification about connects/disconnects;
    use the API for that.

    Use .close() for server-side disconnect.

    You can optionally pass an announcer (as returned by announcer_api.make_udp_announcer).
    It will be started/stopped together with the TcpServerTransport.

    Optionally, a keepalive message can be configured. On each connection,
    ``keepalive_msg`` is sent verbatim every ``keepalive_interval`` seconds
    while the connection is idle. Any sending or receiving resets the timer.
    You can change the attributes directly while transport is stopped.

    Threads:
     - TcpServerTransport.run() blocks (use .start() for automatic extra Thread)
     - .run() starts a new thread for listening to connections
     - each incoming connection will start another Thread.
    '''
    shorthand = 'tcpserv'

    @classmethod
    def fromstring(cls, expression):
        '''tcpserv:<interface>:<port>

        Leave <interface> empty to listen on all interfaces.
        '''
        _, iface, port = expression.split(':')
        return cls(port=int(port), interface=iface)

    def __init__(self,
                 port,
                 interface='',
                 announcer=None,
                 keepalive_msg=b'',
                 keepalive_interval=10,
                 buffersize=1024):
        self.addr = (interface, port)
        self.name = '%s:%s' % self.addr
        self.announcer = announcer
        self.keepalive_msg = keepalive_msg
        self.keepalive_interval = keepalive_interval
        self.buffersize = buffersize
        MuxTransport.__init__(self)

    def open(self):
        self.server = ThreadingTCPServer(self.addr,
                                         _TcpConnection,
                                         bind_and_activate=True)
        self.server.mux = self
        Thread(target=self.server.serve_forever,
               name="TcpServerTransport_Listen").start()
        if self.announcer:
            try:
                self.announcer.transport.start()
            finally:
                self.server.shutdown()

    def run(self):
        MuxTransport.run(self)

        if self.announcer:
            self.announcer.transport.stop()

        self.server.shutdown()
        self.server.server_close()

    def close(self, name):
        '''close the connection with the given sender/receiver name.
        '''
        for transport in self.transports:
            if transport.name == name:
                transport.transport_running.clear()
Exemplo n.º 35
0
class MainUI(Ui_ASTM_Clent):
    def _del_(self):
        if hasattr(self, "server"):
            self.server.shutdown()
            self.server = None
            self.t._stop()
            
    def searchClicked(self):
        sid = self.txtSearch.text()
        result = OperationDB().selectTest((sid,))
        print(result)
        self.searchCallBack(result)
        
    def testConnClicked(self):
        sendIP = self.txtSendIP.text()
        sendPort = self.txtSendPort.text()
        try:
            TCPClient(sendIP, sendPort).send(("testConn", ()), self.testConnCallBack)
        except Exception as e:
            print(e)
            self.txtConsole.append(str(e))
        
    def testConnCallBack(self, params):
        print(params)
        if params == "success":
            print(params)
            self.txtConsole.append(params)
            
    def listening(self):
        if hasattr(self, "server"):
            self.server.shutdown()
            self.server = None
            self.t._stop()
        listenIP = self.txtLocalIP.text()
        listenPort = self.txtLocalPort.text()
        try:
            self.server = ThreadingTCPServer((listenIP, int(listenPort)), EchoRequestHandler)
            print("server running at", listenIP, listenPort)
            self.txtConsole.append("server running at " + listenIP + " " + listenPort)
            self.t = Thread(target=self.server.serve_forever)
            self.t.start()
        except Exception as e:
            print(e)
            self.txtConsole.append(str(e))
    
    def connClicked(self):
        sendIP = self.txtSendIP.text()
        sendPort = self.txtSendPort.text()
        try:
            TCPClient(sendIP, sendPort).send(("testConn", ()), self.connCallBack)
        except Exception as e:
            print(e)
            self.txtConsole.append(str(e))
        
    def connCallBack(self, params):
        print(params)
        if params == "success":
            self.sendIP = self.txtSendIP.text()
            self.sendPort = self.txtSendPort.text()
            self.txtConsole.append(self.sendIP + ":" + self.sendPort + " connected.")
        else:
            self.txtConsole.append(self.sendIP + ":" + self.sendPort + " connect failed.")
        
    def orderButClicked(self):
        sid = self.txt_sid.text()
        pid = self.txt_pid.text()
        pname = self.txt_pname.text()
        page = self.txt_page.text()
        pgender = self.txt_gender.text()
        status = self.txt_status.text()
        if sid == "":
            self.txtConsole.append("please type sid")
            return
        if pid == "":
            self.txtConsole.append("please type pid")
            return
        if pname == "":
            self.txtConsole.append("please type name")
            return
        if page == "":
            self.txtConsole.append("please type age")
            return
        if pgender == "":
            self.txtConsole.append("please type gender")
            return
        if status == "":
            self.txtConsole.append("please type status")
            return
        albchecked = self.chk_ALB.isChecked()
        altchecked = self.chk_ALT.isChecked()
        astchecked = self.chk_AST.isChecked()
        alpchecked = self.chk_ALP.isChecked()
        mgchecked = self.chk_MG.isChecked()
        ggtchecked = self.chk_GGT.isChecked()
        hcychecked = self.chk_HCY.isChecked()
        uricchecked = self.chk_URIC.isChecked()
        bunchecked = self.chk_BUN.isChecked()
        cholchecked = self.chk_CHOL.isChecked()
        sycschecked = self.chk_SYCS.isChecked()
        glucchecked = self.chk_GLUC.isChecked()
        testnames = []
        if albchecked:
            testnames.append(self.chk_ALB.text())
        if altchecked:
            testnames.append(self.chk_ALT.text())
        if astchecked:
            testnames.append(self.chk_AST.text())
        if alpchecked:
            testnames.append(self.chk_ALP.text())
        if mgchecked:
            testnames.append(self.chk_MG.text())
        if ggtchecked:
            testnames.append(self.chk_GGT.text())
        if hcychecked:
            testnames.append(self.chk_HCY.text())
        if uricchecked:
            testnames.append(self.chk_URIC.text())
        if bunchecked:
            testnames.append(self.chk_BUN.text())
        if cholchecked:
            testnames.append(self.chk_CHOL.text())
        if sycschecked:
            testnames.append(self.chk_SYCS.text())
        if glucchecked:
            testnames.append(self.chk_GLUC.text())
        if len(testnames) == 0:
            self.txtConsole.append("please a test at least.")
            return
        params = (sid, pid, pname, page, pgender, status, testnames)
        result = OperationDB().orderEntry(params)
        self.orderEntryCallBack(result)
        
    def orderEntryCallBack(self, params):
        print(params)
        self.txtConsole.append(params)
#         transform data

#         TCPClient(self.sendIP, self.sendPort).send(("orderEntry", params), self.orderEntryCallBack)
        
    def searchCallBack(self, params):
        print(params)
        index = 0
        for param in params:
            if not param is None:
                _translate = QtCore.QCoreApplication.translate
                self.table_test.setRowCount(index + 1)
                if param[0] == "P":
                    item = QtWidgets.QTableWidgetItem()
                    self.table_test.setItem(index, 1, item)
                    item.setText(param[1])
                    item = QtWidgets.QTableWidgetItem()
                    self.table_test.setItem(index, 2, item)
                    item.setText(param[2])
                    item = QtWidgets.QTableWidgetItem()
                    self.table_test.setItem(index, 3, item)
                    item.setText(param[3])
                    item = QtWidgets.QTableWidgetItem()
                    self.table_test.setItem(index, 4, item)
                    item.setText(param[4])
                elif param[0] == "O":
                    item = QtWidgets.QTableWidgetItem()
                    self.table_test.setItem(index, 0, item)
                    item.setText(param[1])
                    item = QtWidgets.QTableWidgetItem()
                    self.table_test.setItem(index, 5, item)
                    item.setText(param[2])
                elif param[0] == "R":
                    item = QtWidgets.QTableWidgetItem()
                    self.table_test.setItem(index, 6, item)
                    item.setText(param[1])
                    item = QtWidgets.QTableWidgetItem()
                    self.table_test.setItem(index, 7, item)
                    item.setText(param[2])
                index += 1
        
    def closeWindown(self):
        if hasattr(self, "server"):
            self.server.shutdown()
            self.server = None
            self.t.stop()
Exemplo n.º 36
0
class ModbusServer(object):
    """Modbus TCP server"""
    class ModbusService(BaseRequestHandler):
        def recv_all(self, size):
            if hasattr(socket, "MSG_WAITALL"):
                data = self.request.recv(size, socket.MSG_WAITALL)
            else:
                # Windows lacks MSG_WAITALL
                data = b''
                while len(data) < size:
                    data += self.request.recv(size - len(data))
            return data

        def handle(self):
            while True:
                rx_head = self.recv_all(7)
                # close connection if no standard 7 bytes header
                if not (rx_head and len(rx_head) == 7):
                    break
                # decode header
                (rx_hd_tr_id, rx_hd_pr_id, rx_hd_length,
                 rx_hd_unit_id) = struct.unpack('>HHHB', rx_head)
                # close connection if frame header content inconsistency
                if not ((rx_hd_pr_id == 0) and (2 < rx_hd_length < 256)):
                    break
                # receive body
                rx_body = self.recv_all(rx_hd_length - 1)
                # close connection if lack of bytes in frame body
                if not (rx_body and (len(rx_body) == rx_hd_length - 1)):
                    break
                # body decode: function code
                rx_bd_fc = struct.unpack('B', rx_body[0:1])[0]
                # close connection if function code is inconsistent
                if rx_bd_fc > 0x7F:
                    break
                # default except status
                exp_status = const.EXP_NONE
                # functions Read Coils (0x01) or Read Discrete Inputs (0x02)
                if rx_bd_fc in (const.READ_COILS, const.READ_DISCRETE_INPUTS):
                    (b_address, b_count) = struct.unpack('>HH', rx_body[1:])
                    # check quantity of requested bits
                    if 0x0001 <= b_count <= 0x07D0:
                        bits_l = DataBank.get_bits(b_address, b_count)
                        if bits_l:
                            # allocate bytes list
                            b_size = int(b_count / 8)
                            b_size += 1 if (b_count % 8) else 0
                            bytes_l = [0] * b_size
                            # populate bytes list with data bank bits
                            for i, item in enumerate(bits_l):
                                if item:
                                    byte_i = int(i / 8)
                                    bytes_l[byte_i] = set_bit(
                                        bytes_l[byte_i], i % 8)
                            # format body of frame with bits
                            tx_body = struct.pack('BB', rx_bd_fc, len(bytes_l))
                            # add bytes with bits
                            for byte in bytes_l:
                                tx_body += struct.pack('B', byte)
                        else:
                            exp_status = const.EXP_DATA_ADDRESS
                    else:
                        exp_status = const.EXP_DATA_VALUE
                # functions Read Holding Registers (0x03) or Read Input Registers (0x04)
                elif rx_bd_fc in (const.READ_HOLDING_REGISTERS,
                                  const.READ_INPUT_REGISTERS):
                    (w_address, w_count) = struct.unpack('>HH', rx_body[1:])
                    # check quantity of requested words
                    if 0x0001 <= w_count <= 0x007D:
                        words_l = DataBank.get_words(w_address, w_count)
                        if words_l:
                            # format body of frame with words
                            tx_body = struct.pack('BB', rx_bd_fc, w_count * 2)
                            for word in words_l:
                                tx_body += struct.pack('>H', word)
                        else:
                            exp_status = const.EXP_DATA_ADDRESS
                    else:
                        exp_status = const.EXP_DATA_VALUE
                # function Write Single Coil (0x05)
                elif rx_bd_fc is const.WRITE_SINGLE_COIL:
                    (b_address, b_value) = struct.unpack('>HH', rx_body[1:])
                    f_b_value = bool(b_value == 0xFF00)
                    if DataBank.set_bits(b_address, [f_b_value]):
                        # send write ok frame
                        tx_body = struct.pack('>BHH', rx_bd_fc, b_address,
                                              b_value)
                    else:
                        exp_status = const.EXP_DATA_ADDRESS
                # function Write Single Register (0x06)
                elif rx_bd_fc is const.WRITE_SINGLE_REGISTER:
                    (w_address, w_value) = struct.unpack('>HH', rx_body[1:])
                    if DataBank.set_words(w_address, [w_value]):
                        # send write ok frame
                        tx_body = struct.pack('>BHH', rx_bd_fc, w_address,
                                              w_value)
                    else:
                        exp_status = const.EXP_DATA_ADDRESS
                # function Write Multiple Coils (0x0F)
                elif rx_bd_fc is const.WRITE_MULTIPLE_COILS:
                    (b_address, b_count,
                     byte_count) = struct.unpack('>HHB', rx_body[1:6])
                    # check quantity of updated coils
                    if (0x0001 <= b_count <= 0x07B0) and (byte_count >=
                                                          (b_count / 8)):
                        # allocate bits list
                        bits_l = [False] * b_count
                        # populate bits list with bits from rx frame
                        for i, item in enumerate(bits_l):
                            b_bit_pos = int(i / 8) + 6
                            b_bit_val = struct.unpack(
                                'B', rx_body[b_bit_pos:b_bit_pos + 1])[0]
                            bits_l[i] = test_bit(b_bit_val, i % 8)
                        # write words to data bank
                        if DataBank.set_bits(b_address, bits_l):
                            # send write ok frame
                            tx_body = struct.pack('>BHH', rx_bd_fc, b_address,
                                                  b_count)
                        else:
                            exp_status = const.EXP_DATA_ADDRESS
                    else:
                        exp_status = const.EXP_DATA_VALUE
                # function Write Multiple Registers (0x10)
                elif rx_bd_fc is const.WRITE_MULTIPLE_REGISTERS:
                    (w_address, w_count,
                     byte_count) = struct.unpack('>HHB', rx_body[1:6])
                    # check quantity of updated words
                    if (0x0001 <= w_count <= 0x007B) and (byte_count
                                                          == w_count * 2):
                        # allocate words list
                        words_l = [0] * w_count
                        # populate words list with words from rx frame
                        for i, item in enumerate(words_l):
                            w_offset = i * 2 + 6
                            words_l[i] = struct.unpack(
                                '>H', rx_body[w_offset:w_offset + 2])[0]
                        # write words to data bank
                        if DataBank.set_words(w_address, words_l):
                            # send write ok frame
                            tx_body = struct.pack('>BHH', rx_bd_fc, w_address,
                                                  w_count)
                        else:
                            exp_status = const.EXP_DATA_ADDRESS
                    else:
                        exp_status = const.EXP_DATA_VALUE
                else:
                    exp_status = const.EXP_ILLEGAL_FUNCTION
                # check exception
                if exp_status != const.EXP_NONE:
                    # format body of frame with exception status
                    tx_body = struct.pack('BB', rx_bd_fc + 0x80, exp_status)
                # build frame header
                tx_head = struct.pack('>HHHB', rx_hd_tr_id, rx_hd_pr_id,
                                      len(tx_body) + 1, rx_hd_unit_id)
                # send frame
                self.request.send(tx_head + tx_body)
            self.request.close()

    def __init__(self,
                 host='localhost',
                 port=const.MODBUS_PORT,
                 no_block=False,
                 ipv6=False):
        """Constructor

        Modbus server constructor.

        :param host: hostname or IPv4/IPv6 address server address (optional)
        :type host: str
        :param port: TCP port number (optional)
        :type port: int
        :param no_block: set no block mode, in this mode start() return (optional)
        :type no_block: bool
        :param ipv6: use ipv6 stack
        :type ipv6: bool
        """
        # public
        self.host = host
        self.port = port
        self.no_block = no_block
        self.ipv6 = ipv6
        # private
        self._running = False
        self._service = None
        self._serve_th = None

    def start(self):
        """Start the server.

        Do nothing if server is already running.
        This function will block if no_block is not set to True.
        """
        if not self.is_run:
            # set class attribute
            ThreadingTCPServer.address_family = socket.AF_INET6 if self.ipv6 else socket.AF_INET
            ThreadingTCPServer.daemon_threads = True
            # init server
            self._service = ThreadingTCPServer((self.host, self.port),
                                               self.ModbusService,
                                               bind_and_activate=False)
            # set socket options
            self._service.socket.setsockopt(socket.SOL_SOCKET,
                                            socket.SO_REUSEADDR, 1)
            self._service.socket.setsockopt(socket.SOL_SOCKET,
                                            socket.SO_KEEPALIVE, 1)
            # TODO test no_delay with bench
            self._service.socket.setsockopt(socket.IPPROTO_TCP,
                                            socket.TCP_NODELAY, 1)
            # bind and activate
            self._service.server_bind()
            self._service.server_activate()
            # serve request
            if self.no_block:
                self._serve_th = Thread(target=self._serve)
                self._serve_th.daemon = True
                self._serve_th.start()
            else:
                self._serve()

    def stop(self):
        """Stop the server.

        Do nothing if server is already not running.
        """
        if self.is_run:
            self._service.shutdown()
            self._service.server_close()

    @property
    def is_run(self):
        """Return True if server running.

        """
        return self._running

    def _serve(self):
        try:
            self._running = True
            self._service.serve_forever()
        except:
            self._service.server_close()
            raise
        finally:
            self._running = False
Exemplo n.º 37
0
server_port = 7000
gLock = threading.Lock()


class EchoHandler(BaseRequestHandler):
    def handle(self):
        self.data = None
        while True:
            self.data = self.request.recv(1024)
            if not self.data: break
            gLock.acquire()
            print(
                "Server received {0} bytes on thread {1} from {2}:{3}".format(
                    len(self.data),
                    threading.current_thread().name, *self.client_address))
            print('   {0}'.format(self.data))
            gLock.release()
            self.request.send(self.data)


try:
    s = ThreadingTCPServer((server_addr, server_port), EchoHandler)
    s.allow_reuse_address = True
    print("Server started")
    s.serve_forever()
except (KeyboardInterrupt, SystemExit):
    pass
finally:
    s.shutdown()
    print("Server stopped")