Пример #1
0
def webserver_serve(app, listener_socket, logfile):
    """Serve app on listener_socket provided.

    This sets up process context, including signal handlers, etc,
    and runs until signalled.

    """
    # create a WSGIServer instance using the listener socket created
    server = WSGIServer(listener_socket, app, log=logfile)
    server.set_spawn(Pool())  # Make WSGIServer manage worker greenlets

    def signal_handler():
        # logger.debug('webserver_serve.signal_handler: Worker caught signal. Shutting down.')
        app.stop_serving(timeout=HALT_TIMEOUT)
        server.stop()

    gevent.signal(signal.SIGUSR1, signal_handler)
    gevent.signal(signal.SIGINT, signal_handler)
    gevent.signal(signal.SIGHUP, signal_handler)
    gevent.signal(signal.SIGTERM, signal_handler)

    on_initialise.fire()
    gevent.spawn_later(1, on_start.fire)

    # serve requests
    try:
        server.serve_forever(stop_timeout=5)
    finally:
        server.close()
        logger.debug('webserver_serve: finished serving')
Пример #2
0
 def run(self):
     httpsrv = WSGIServer((self.__listen_ip, int(
         self.__listen_port)), self.app.wsgi_app, log=LogLevelChanger)
     try:
         httpsrv.serve_forever()
     except KeyboardInterrupt:
         httpsrv.close()
         logger.info("Received STOP signal in MITMReceiver")
Пример #3
0
def wsgi_server():
    port = 8886
    app = create_app()
    http = WSGIServer(('', port), app.wsgi_app)

    log.info('Serving on port %s', str(port))
    try:
        http.serve_forever()
    except KeyboardInterrupt:
        print('Keyboard interrupt received: EXITING')
    finally:
        http.close()
    log.info('Server terminated!')
def start_server(port):
    assert type(port) == int
    try:
        pool = Pool(256)
        server = WSGIServer(('', port), app, spawn=pool)
        server.serve_forever()
    except Exception as e:
        print(e)
        server.close()
        del pool
        del server
    finally:
        server.close()
        del pool
        del server
        print("Closed Server")
Пример #5
0
class ServerThread(Thread):
    def __init__(self, *args, port, app, host, **kwargs):
        super().__init__(*args, **kwargs)
        self.port = port
        self.app = app
        self.host = host
        self.server: WSGIServer = None

    def run(self):
        self.server = WSGIServer((self.host, self.port), self.app)
        self.server.serve_forever()

    def close(self):
        self.server.close()

    def url(self):
        return 'http://' + self.host + ':' + str(self.port)
Пример #6
0
class ServerThread(threading.Thread):
    def __init__(self, app, port=5005):
        threading.Thread.__init__(self)
        self.port = port
        self.srv = WSGIServer(("0.0.0.0", self.port), app)
        self.ctx = app.app_context()
        self.ctx.push()

    def run(self):
        logging.info('Starting threaded server.')
        self.srv.serve_forever()

    def shutdown(self):
        logging.info('Stopping threaded server.')
        self.srv.stop()
        self.srv.close()

        del self
Пример #7
0
class HTTPServer:
    def __init__(self):
        self.Handler = HTTPHandler
        self.listener = None

    def start(self, host, port):
        conn = (host, port)
        self.listener = WSGIServer(conn, self.Handler)
        try:
            logger.info('Starting HTTPServer on {}'.format(conn))
            self.listener.serve_forever()
        except:
            logger.debug('Exception Occurred!')
        finally:
            self.stop()

    def stop(self):
        self.listener.close()
Пример #8
0
class EmbargoServer(threading.Thread):
    def __init__(self, host: str = 'localhost', port: int = 7777):
        super().__init__(daemon=True)
        self._host = host
        self._port = port

        self._server = None

    def run(self) -> None:
        self._server = WSGIServer((self._host, self._port), server_app)
        self._server.serve_forever()

    def stop(self) -> None:
        if self._server is None:
            return

        self._server.stop()
        self._server.close()
Пример #9
0
class WebServer(threading.Thread):
    def __init__(self):
        super().__init__()

    def run(self):
        self.server = WSGIServer(('0.0.0.0', 80), saveInfo_app)
        self.gevent_signal = gevent.hub.signal(signal.SIGTERM, self.shutdown)
        self.server.serve_forever()

    # ======================== for development only =====================
    # def run(self):
    #     saveInfo_app.run(host='0.0.0.0', port=7497, debug=False)  # run collecting app
    # ===================================================================

    def shutdown(
        self
    ):  # SIGINT or SIGTERM doesn't really matter since what shutdown server stays here
        print(f'Shutting down server...\n')
        self.server.stop()
        self.server.close()
        self.gevent_signal.cancel()
Пример #10
0
 def run_receiver(self, listen_ip, listen_port, mitm_mapper, args_passed,
                  auths_passed):
     global application_args, auths
     application_args = args_passed
     auths = auths_passed
     self.__listen_ip = listen_ip
     self.__listen_port = listen_port
     self.__mitm_mapper: MitmMapper = mitm_mapper
     self.app = Flask("MITMReceiver")
     self.add_endpoint(endpoint='/',
                       endpoint_name='receive_protos',
                       handler=self.proto_endpoint,
                       methods_passed=['POST'])
     self.add_endpoint(endpoint='/get_latest_mitm/',
                       endpoint_name='get_latest_mitm/',
                       handler=self.get_latest,
                       methods_passed=['GET'])
     self.add_endpoint(endpoint='/get_addresses/',
                       endpoint_name='get_addresses/',
                       handler=self.get_addresses,
                       methods_passed=['GET'])
     self._data_queue: JoinableQueue = JoinableQueue()
     self._db_wrapper = DbFactory.get_wrapper(args_passed)
     self.worker_threads = []
     for i in range(application_args.mitmreceiver_data_workers):
         data_processor: MitmDataProcessor = MitmDataProcessor()
         t = Process(name='MITMReceiver-%s' % str(i),
                     target=data_processor.received_data_worker,
                     args=(data_processor, self._data_queue,
                           application_args, self.__mitm_mapper))
         t.start()
         self.worker_threads.append(t)
     httpsrv = WSGIServer((self.__listen_ip, int(self.__listen_port)),
                          self.app.wsgi_app,
                          log=LogLevelChanger)
     try:
         httpsrv.serve_forever()
     except KeyboardInterrupt as e:
         logger.info("Stopping MITMReceiver")
         httpsrv.close()
Пример #11
0
class BackendServer:
    def __init__(self, host: str, port: int):
        self.host = host
        self.port = port

        # create the flask app and the wsgi server
        self._app = self._create_flask_app()
        self._wsgi_server = None  # has to be set inside the _run_server function
        self._thread = Thread(target=self._run_server)

    @staticmethod
    def _create_flask_app() -> Flask:
        """
        Helper function to create the flask app with the appropriate routes.
        :return: Instance of the Flask route handling object.
        """
        app = Flask(__name__)
        CORS(app)

        @app.route("/")
        def index():
            return "WebApp Index"

        @app.route("/api/add_user", methods=["POST"])
        def add_user():
            store = InMemoryDataStore()
            user_json = request.get_json(force=True)
            store.add_user(firstname=user_json["firstname"],
                           lastname=user_json["lastname"],
                           age=user_json["age"],
                           email=user_json["email"])
            return jsonify("Success")

        @app.route("/api/update_user_portfolio", methods=["POST"])
        def update_user_portfolio():
            store = InMemoryDataStore()
            json_data = request.get_json(force=True)

            cash_json = json_data["cashAssets"]
            cash = CashAssets(
                cash_json["checkingAcs"], cash_json["savingsAcs"],
                cash_json["moneyMarketAccounts"], cash_json["savingsBonds"],
                cash_json["cds"], cash_json["lifeInsurance"],
                Other(cash_json["other"]["title"],
                      cash_json["other"]["amount"]))

            invested_json = json_data["investedAssets"]
            invested = InvestedAssets(
                invested_json["brokerage"],
                Other(invested_json["otherTax"]["title"],
                      invested_json["otherTax"]["amount"]),
                invested_json["ira"], invested_json["rothIra"],
                invested_json["k401"], invested_json["sepIra"],
                invested_json["keogh"], invested_json["pension"],
                invested_json["annuity"], invested_json["realEstate"],
                invested_json["soleProp"], invested_json["partnership"],
                invested_json["cCorp"], invested_json["sCorp"],
                invested_json["limitedLiabilityCompany"],
                Other(invested_json["otherBusiness"]["title"],
                      invested_json["otherBusiness"]["amount"]))

            use_json = json_data["useAssets"]
            use = UseAssets(
                use_json["principalHome"], use_json["vacationHome"],
                use_json["vehicles"], use_json["homeFurnishings"],
                use_json["artsAndAntiques"], use_json["jewelryAndFurs"],
                Other(use_json["other"]["title"], use_json["other"]["amount"]))

            current_json = json_data["currentLiabilities"]
            current = CurrentLiabilities(
                current_json["creditCardBalance"],
                current_json["incomeTaxOwed"],
                Other(current_json["other"]["title"],
                      current_json["other"]["amount"]))

            long_json = json_data["longTermLiabilities"]
            long = LongTermLiabilities(
                long_json["homeMortgage"], long_json["homeEquityLoan"],
                long_json["rentPropertiesMortgage"], long_json["carLoans"],
                long_json["studentLoans"],
                long_json["lifeInsurancePolicyLoans"],
                Other(long_json["other"]["title"],
                      long_json["other"]["amount"]))

            currency = Currencies[json_data["currency"]]
            email = json_data["email"]

            store.update_user_portfolio(email=email,
                                        portfolio=Portfolio(
                                            currency, cash, invested, use,
                                            current, long))

            return jsonify("Success")

        @app.route("/api/get_user")
        def get_user():
            # expecting query arguments "/api/[email protected]"
            email = request.args.get("email")
            store = InMemoryDataStore()
            u = store.get_user(
                email)  # will raise an error if not found resulting in a 500
            return jsonify(u.to_json())

        @app.route("/api/get_net_worth")
        def get_net_worth():
            # expecting query arguments "/api/[email protected]"
            email = request.args.get("email")
            store = InMemoryDataStore()
            u = store.get_user(
                email)  # will raise an error if not found resulting in a 500
            return jsonify(u.net_worth)

        @app.route("/api/get_assets")
        def get_assets():
            # expecting query arguments "/api/[email protected]"
            email = request.args.get("email")
            store = InMemoryDataStore()
            assets = store.get_user_assets(
                email)  # will raise an error if not found resulting in a 500
            return jsonify(assets)

        @app.route("/api/get_liabilities")
        def get_liabilities():
            # expecting query arguments "/api/[email protected]"
            email = request.args.get("email")
            store = InMemoryDataStore()
            liabilities = store.get_user_liabilities(
                email)  # will raise an error if not found resulting in a 500
            return jsonify(liabilities)

        return app

    def _run_server(self):
        """
        Helper function to start the wsgi server in a separate thread, using the
        pointers to the instantiated WSGI server from the constructor.
        """
        self._wsgi_server = WSGIServer((self.host, self.port), self._app)
        self._wsgi_server.serve_forever()

    def start(self):
        if not self._thread.is_alive():
            self._thread.start()
            print(f"Started BackendServer on {self.host}:{self.port}")
        else:
            print("The BackendServer is already running")

    def stop(self, timeout=1):
        if self._thread.is_alive() and self._wsgi_server is not None:
            # kill the WSGI server and then kill the thread
            self._wsgi_server.stop(timeout=timeout)
            self._wsgi_server.close()
            self._thread.join(timeout=timeout + 1)

            # sleep to give the server time to kill requests
            time.sleep(1)
            if self._thread.is_alive():
                raise OSError("Server Thread did not shutdown cleanly")
            else:
                print("BackendServer successfully shutdown")
        else:
            print("The BackendServer is already shutdown")
Пример #12
0
class server:

    wsgiserver = None
    restart= False

    def __init__(self):
        signal.signal(signal.SIGINT, self.killServer)
        signal.signal(signal.SIGTERM, self.killServer)

    def start_gevent(self):
        try:
            ssl_args = dict()
            certfile_path   = web.ub.config.get_config_certfile()
            keyfile_path    = web.ub.config.get_config_keyfile()
            if certfile_path and keyfile_path:
                if os.path.isfile(certfile_path) and os.path.isfile(keyfile_path):
                    ssl_args = {"certfile": certfile_path,
                                "keyfile": keyfile_path}
                else:
                    web.app.logger.info('The specified paths for the ssl certificate file and/or key file seem to be broken. Ignoring ssl. Cert path: %s | Key path: %s' % (certfile_path, keyfile_path))
            if os.name == 'nt':
                self.wsgiserver= WSGIServer(('0.0.0.0', web.ub.config.config_port), web.app, spawn=Pool(), **ssl_args)
            else:
                self.wsgiserver = WSGIServer(('', web.ub.config.config_port), web.app, spawn=Pool(), **ssl_args)
            web.py3_gevent_link = self.wsgiserver
            self.wsgiserver.serve_forever()

        except SocketError:
            try:
                web.app.logger.info('Unable to listen on \'\', trying on IPv4 only...')
                self.wsgiserver = WSGIServer(('0.0.0.0', web.ub.config.config_port), web.app, spawn=Pool(), **ssl_args)
                web.py3_gevent_link = self.wsgiserver
                self.wsgiserver.serve_forever()
            except (OSError, SocketError) as e:
                web.app.logger.info("Error starting server: %s" % e.strerror)
                print("Error starting server: %s" % e.strerror)
                web.helper.global_WorkerThread.stop()
                sys.exit(1)
        except Exception:
            web.app.logger.info("Unknown error while starting gevent")

    def startServer(self):
        if gevent_present:
            web.app.logger.info('Starting Gevent server')
            # leave subprocess out to allow forking for fetchers and processors
            self.start_gevent()
        else:
            try:
                ssl = None
                web.app.logger.info('Starting Tornado server')
                certfile_path   = web.ub.config.get_config_certfile()
                keyfile_path    = web.ub.config.get_config_keyfile()
                if certfile_path and keyfile_path:
                    if os.path.isfile(certfile_path) and os.path.isfile(keyfile_path):
                        ssl = {"certfile": certfile_path,
                               "keyfile": keyfile_path}
                    else:
                        web.app.logger.info('The specified paths for the ssl certificate file and/or key file seem to be broken. Ignoring ssl. Cert path: %s | Key path: %s' % (certfile_path, keyfile_path))

                # Max Buffersize set to 200MB
                http_server = HTTPServer(WSGIContainer(web.app),
                            max_buffer_size = 209700000,
                            ssl_options=ssl)
                http_server.listen(web.ub.config.config_port)
                self.wsgiserver=IOLoop.instance()
                self.wsgiserver.start()
                # wait for stop signal
                self.wsgiserver.close(True)
            except SocketError as e:
                web.app.logger.info("Error starting server: %s" % e.strerror)
                print("Error starting server: %s" % e.strerror)
                web.helper.global_WorkerThread.stop()
                sys.exit(1)

        # ToDo: Somehow caused by circular import under python3 refactor
        if sys.version_info > (3, 0):
            self.restart = web.py3_restart_Typ
        if self.restart == True:
            web.app.logger.info("Performing restart of Calibre-Web")
            web.helper.global_WorkerThread.stop()
            if os.name == 'nt':
                arguments = ["\"" + sys.executable + "\""]
                for e in sys.argv:
                    arguments.append("\"" + e + "\"")
                os.execv(sys.executable, arguments)
            else:
                os.execl(sys.executable, sys.executable, *sys.argv)
        else:
            web.app.logger.info("Performing shutdown of Calibre-Web")
            web.helper.global_WorkerThread.stop()
        sys.exit(0)

    def setRestartTyp(self,starttyp):
        self.restart = starttyp
        # ToDo: Somehow caused by circular import under python3 refactor
        web.py3_restart_Typ = starttyp

    def killServer(self, signum, frame):
        self.stopServer()

    def stopServer(self):
        # ToDo: Somehow caused by circular import under python3 refactor
        if sys.version_info > (3, 0):
            if not self.wsgiserver:
                if gevent_present:
                    self.wsgiserver = web.py3_gevent_link
                else:
                    self.wsgiserver = IOLoop.instance()
        if self.wsgiserver:
            if gevent_present:
                self.wsgiserver.close()
            else:
                self.wsgiserver.add_callback(self.wsgiserver.stop)

    @staticmethod
    def getNameVersion():
        if gevent_present:
            return {'Gevent':'v'+geventVersion}
        else:
            return {'Tornado':'v'+tornadoVersion}
Пример #13
0
    def test_low_level_echo(self):
        data = []
        data.append("")
        data.append("0123456789")
        data.append("0123456789" * 20)
        data.append("0123456789" * 2000)
        data.append("0123456789" * 20000)
        data.append("0123456789" * 200000)

        data.append(b"")
        data.append(b"0123456789")
        data.append(b"0123456789" * 20)
        data.append(b"0123456789" * 2000)
        data.append(b"0123456789" * 20000)
        data.append(b"0123456789" * 200000)

        def test_echo_actual(environ, start_response):
            try:
                websocket = environ.get("wsgi.websocket")

                if websocket is None:
                    return http_handler(environ, start_response)

                while True:
                    message = websocket.receive()
                    if message is None:
                        break
                    websocket.send(message)
                websocket.close()
            except Exception as e:
                self.err.append(e)

        server = WSGIServer(self.s_socket, application=test_echo_actual, handler_class=TestWebSocketHandler)
        server.logger = getLogger(__name__)
        server.start()
        self.server = server
        try:
            self.server_thread = Thread(target=self.start_server)
            self.server_thread.start()

            ws = create_connection("ws://%s:%s/" % (self.server.environ["SERVER_NAME"],
                                                    self.server.environ["SERVER_PORT"]))

            try:
                for i in range(2):
                    if i == 1:
                        ws.set_mask_key(lambda _: b'1234')
                    for d in data:
                        if isinstance(d, bytes):
                            ws.send_binary(d)
                        else:
                            ws.send(d)
                        self.assertEqual(ws.recv(), d)

                    ws.ping("ping")
                    pong = ws.recv_data_frame(10)
                    self.assertEqual(pong[0], pong[1].OPCODE_PONG)
                    self.assertEqual(pong[1].data, b'ping')

                    ping = ws.recv_data_frame(9)
                    self.assertEqual(ping[0], ping[1].OPCODE_PING)
                    self.assertEqual(ping[1].data, b'')
                    ws.pong(ping[1].data)

                    ping = ws.recv_data_frame(9)
                    self.assertEqual(ping[0], ping[1].OPCODE_PING)
                    self.assertEqual(ping[1].data, b'')
                    ws.pong(ping[1].data)

                    ping = ws.recv_data_frame(9)
                    self.assertEqual(ping[0], ping[1].OPCODE_PING)
                    self.assertEqual(ping[1].data, b'ping')
                    ws.pong(ping[1].data)

                    ping = ws.recv_data_frame(9)
                    self.assertEqual(ping[0], ping[1].OPCODE_PING)
                    self.assertEqual(ping[1].data, b'ping')
                    ws.pong(ping[1].data)

                    self.assertFalse(self.err)
            finally:
                ws.close(timeout=10)
        finally:
            server.close()
Пример #14
0
class server:

    wsgiserver = None
    restart = False

    def __init__(self):
        pass

    def start_gevent(self):
        try:
            ssl_args = dict()
            if web.ub.config.get_config_certfile(
            ) and web.ub.config.get_config_keyfile():
                ssl_args = {
                    "certfile": web.ub.config.get_config_certfile(),
                    "keyfile": web.ub.config.get_config_keyfile()
                }
            if os.name == 'nt':
                self.wsgiserver = WSGIServer(
                    ('0.0.0.0', web.ub.config.config_port),
                    web.app,
                    spawn=Pool(),
                    **ssl_args)
            else:
                self.wsgiserver = WSGIServer(('', web.ub.config.config_port),
                                             web.app,
                                             spawn=Pool(),
                                             **ssl_args)
            self.wsgiserver.serve_forever()

        except SocketError:
            web.app.logger.info(
                'Unable to listen on \'\', trying on IPv4 only...')
            self.wsgiserver = WSGIServer(
                ('0.0.0.0', web.ub.config.config_port),
                web.app,
                spawn=Pool(),
                **ssl_args)
            self.wsgiserver.serve_forever()
        except Exception:
            web.app.logger.info("Unknown error while starting gevent")

    def startServer(self):
        if gevent_present:
            web.app.logger.info('Starting Gevent server')
            # leave subprocess out to allow forking for fetchers and processors
            self.start_gevent()
        else:
            web.app.logger.info('Starting Tornado server')
            if web.ub.config.get_config_certfile(
            ) and web.ub.config.get_config_keyfile():
                ssl = {
                    "certfile": web.ub.config.get_config_certfile(),
                    "keyfile": web.ub.config.get_config_keyfile()
                }
            else:
                ssl = None
            # Max Buffersize set to 200MB
            http_server = HTTPServer(WSGIContainer(web.app),
                                     max_buffer_size=209700000,
                                     ssl_options=ssl)
            http_server.listen(web.ub.config.config_port)
            self.wsgiserver = IOLoop.instance()
            self.wsgiserver.start()  # wait for stop signal
            self.wsgiserver.close(True)

        if self.restart == True:
            web.app.logger.info("Performing restart of Calibre-web")
            web.helper.global_WorkerThread.stop()
            if os.name == 'nt':
                arguments = ["\"" + sys.executable + "\""]
                for e in sys.argv:
                    arguments.append("\"" + e + "\"")
                os.execv(sys.executable, arguments)
            else:
                os.execl(sys.executable, sys.executable, *sys.argv)
        else:
            web.app.logger.info("Performing shutdown of Calibre-web")
            web.helper.global_WorkerThread.stop()
        sys.exit(0)

    def setRestartTyp(self, starttyp):
        self.restart = starttyp

    def stopServer(self):
        if gevent_present:
            self.wsgiserver.close()
        else:
            self.wsgiserver.add_callback(self.wsgiserver.stop)

    @staticmethod
    def getNameVersion():
        if gevent_present:
            return {'Gevent': 'v' + geventVersion}
        else:
            return {'Tornado': 'v' + tornadoVersion}
Пример #15
0
class WebServer(object):

    def __init__(self):
        signal.signal(signal.SIGINT, self._killServer)
        signal.signal(signal.SIGTERM, self._killServer)

        self.wsgiserver = None
        self.access_logger = None
        self.restart = False
        self.app = None
        self.listen_address = None
        self.listen_port = None
        self.unix_socket_file = None
        self.ssl_args = None

    def init_app(self, application, config):
        self.app = application
        self.listen_address = config.get_config_ipaddress()
        self.listen_port = config.config_port

        if config.config_access_log:
            log_name = "gevent.access" if _GEVENT else "tornado.access"
            formatter = logger.ACCESS_FORMATTER_GEVENT if _GEVENT else logger.ACCESS_FORMATTER_TORNADO
            self.access_logger, logfile = logger.create_access_log(config.config_access_logfile, log_name, formatter)
            if logfile != config.config_access_logfile:
                log.warning("Accesslog path %s not valid, falling back to default", config.config_access_logfile)
                config.config_access_logfile = logfile
                config.save()
        else:
            if not _GEVENT:
                logger.get('tornado.access').disabled = True

        certfile_path = config.get_config_certfile()
        keyfile_path = config.get_config_keyfile()
        if certfile_path and keyfile_path:
            if os.path.isfile(certfile_path) and os.path.isfile(keyfile_path):
                self.ssl_args = dict(certfile=certfile_path, keyfile=keyfile_path)
            else:
                log.warning('The specified paths for the ssl certificate file and/or key file seem to be broken. '
                            'Ignoring ssl.')
                log.warning('Cert path: %s', certfile_path)
                log.warning('Key path:  %s', keyfile_path)

    def _make_gevent_unix_socket(self, socket_file):
        # the socket file must not exist prior to bind()
        if os.path.exists(socket_file):
            # avoid nuking regular files and symbolic links (could be a mistype or security issue)
            if os.path.isfile(socket_file) or os.path.islink(socket_file):
                raise OSError(errno.EEXIST, os.strerror(errno.EEXIST), socket_file)
            os.remove(socket_file)

        unix_sock = WSGIServer.get_listener(socket_file, family=socket.AF_UNIX)
        self.unix_socket_file = socket_file

        # ensure current user and group have r/w permissions, no permissions for other users
        # this way the socket can be shared in a semi-secure manner
        # between the user running calibre-web and the user running the fronting webserver
        os.chmod(socket_file, 0o660)

        return unix_sock

    def _make_gevent_socket(self):
        if os.name != 'nt':
            unix_socket_file = os.environ.get("CALIBRE_UNIX_SOCKET")
            if unix_socket_file:
                return self._make_gevent_unix_socket(unix_socket_file), "unix:" + unix_socket_file

        if self.listen_address:
            return (self.listen_address, self.listen_port), None

        if os.name == 'nt':
            self.listen_address = '0.0.0.0'
            return (self.listen_address, self.listen_port), None

        try:
            address = ('::', self.listen_port)
            sock = WSGIServer.get_listener(address, family=socket.AF_INET6)
        except socket.error as ex:
            log.error('%s', ex)
            log.warning('Unable to listen on "", trying on IPv4 only...')
            address = ('', self.listen_port)
            sock = WSGIServer.get_listener(address, family=socket.AF_INET)

        return sock, _readable_listen_address(*address)

    @staticmethod
    def _get_args_for_reloading():
        """Determine how the script was executed, and return the args needed
        to execute it again in a new process.
        Code from https://github.com/pyload/pyload. Author GammaC0de, voulter
        """
        rv = [sys.executable]
        py_script = sys.argv[0]
        args = sys.argv[1:]
        # Need to look at main module to determine how it was executed.
        __main__ = sys.modules["__main__"]

        # The value of __package__ indicates how Python was called. It may
        # not exist if a setuptools script is installed as an egg. It may be
        # set incorrectly for entry points created with pip on Windows.
        if getattr(__main__, "__package__", None) is None or (
            os.name == "nt"
            and __main__.__package__ == ""
            and not os.path.exists(py_script)
            and os.path.exists("{}.exe".format(py_script))
        ):
            # Executed a file, like "python app.py".
            py_script = os.path.abspath(py_script)

            if os.name == "nt":
                # Windows entry points have ".exe" extension and should be
                # called directly.
                if not os.path.exists(py_script) and os.path.exists("{}.exe".format(py_script)):
                    py_script += ".exe"

                if (
                        os.path.splitext(sys.executable)[1] == ".exe"
                        and os.path.splitext(py_script)[1] == ".exe"
                ):
                    rv.pop(0)

            rv.append(py_script)
        else:
            # Executed a module, like "python -m module".
            if sys.argv[0] == "-m":
                args = sys.argv
            else:
                if os.path.isfile(py_script):
                    # Rewritten by Python from "-m script" to "/path/to/script.py".
                    py_module = __main__.__package__
                    name = os.path.splitext(os.path.basename(py_script))[0]

                    if name != "__main__":
                        py_module += ".{}".format(name)
                else:
                    # Incorrectly rewritten by pydevd debugger from "-m script" to "script".
                    py_module = py_script

                rv.extend(("-m", py_module.lstrip(".")))

        rv.extend(args)
        return rv

    def _start_gevent(self):
        ssl_args = self.ssl_args or {}

        try:
            sock, output = self._make_gevent_socket()
            if output is None:
                output = _readable_listen_address(self.listen_address, self.listen_port)
            log.info('Starting Gevent server on %s', output)
            self.wsgiserver = WSGIServer(sock, self.app, log=self.access_logger, spawn=Pool(), **ssl_args)
            if ssl_args:
                wrap_socket = self.wsgiserver.wrap_socket
                def my_wrap_socket(*args, **kwargs):
                    try:
                        return wrap_socket(*args, **kwargs)
                    except (ssl.SSLError, OSError) as ex:
                        log.warning('Gevent SSL Error: %s', ex)
                        raise GreenletExit

                self.wsgiserver.wrap_socket = my_wrap_socket
            self.wsgiserver.serve_forever()
        finally:
            if self.unix_socket_file:
                os.remove(self.unix_socket_file)
                self.unix_socket_file = None

    def _start_tornado(self):
        if os.name == 'nt' and sys.version_info > (3, 7):
            import asyncio
            asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
        log.info('Starting Tornado server on %s', _readable_listen_address(self.listen_address, self.listen_port))

        # Max Buffersize set to 200MB            )
        http_server = HTTPServer(WSGIContainer(self.app),
                                 max_buffer_size=209700000,
                                 ssl_options=self.ssl_args)
        http_server.listen(self.listen_port, self.listen_address)
        self.wsgiserver = IOLoop.current()
        self.wsgiserver.start()
        # wait for stop signal
        self.wsgiserver.close(True)

    def start(self):
        try:
            if _GEVENT:
                # leave subprocess out to allow forking for fetchers and processors
                self._start_gevent()
            else:
                self._start_tornado()
        except Exception as ex:
            log.error("Error starting server: %s", ex)
            print("Error starting server: %s" % ex)
            self.stop()
            return False
        finally:
            self.wsgiserver = None

        if not self.restart:
            log.info("Performing shutdown of Calibre-Web")
            # prevent irritiating log of pending tasks message from asyncio
            logger.get('asyncio').setLevel(logger.logging.CRITICAL)
            return True

        log.info("Performing restart of Calibre-Web")
        args = self._get_args_for_reloading()
        subprocess.call(args, close_fds=True)
        return True

    def _killServer(self, __, ___):
        self.stop()

    def stop(self, restart=False):
        from . import updater_thread
        updater_thread.stop()

        log.info("webserver stop (restart=%s)", restart)
        self.restart = restart
        if self.wsgiserver:
            if _GEVENT:
                self.wsgiserver.close()
            else:
                self.wsgiserver.add_callback_from_signal(self.wsgiserver.stop)
Пример #16
0
class WebService(Bottle):
    def __init__(self, config, car):
        super(WebService, self).__init__()
        self.log = logging.getLogger("EVNotiPi/WebService")
        self.log.info("Initializing WebService")

        self.car = car
        self.data = {}
        self.data_lock = Condition()
        self.running = False
        self.server = None
        self.thread = None

        self.route('/data/live/ws', callback=self.handle_websocket)
        self.route('/data', callback=self.handle_data)
        self.route('/', callback=self.handle_index)
        self.route('/static/<filename>', callback=self.handle_static)

    def handle_websocket(self):
        wsock = request.environ.get('wsgi.websocket')
        if not wsock:
            abort(400, 'Expected WebSocket request.')

        while True:
            try:
                with self.data_lock:
                    self.data_lock.wait()
                    data = self.data
                data = json.dumps(data)
                wsock.send(data)
            except WebSocketError:
                break

    def handle_index(self):
        return static_file('index.html', root="./web")

    def handle_static(self, filename):
        return static_file(filename, root="./web")

    def handle_data(self):
        return json.dumps(self.data)

    def start(self):
        self.running = True
        self.server = WSGIServer(('::', 8080),
                                 self,
                                 handler_class=WebSocketHandler)
        self.thread = Thread(target=self.server.serve_forever)
        self.thread.start()
        self.car.register_data(self.data_callback)

    def stop(self):
        self.car.unregister_data(self.data_callback)
        self.running = False
        self.server.stop()
        self.server.close()
        self.thread.join()

    def data_callback(self, data):
        with self.data_lock:
            self.data = data
            self.data_lock.notify_all()

    def check_thread(self):
        return self.thread.is_alive()
Пример #17
0
class server:

    wsgiserver = None
    restart = False

    def __init__(self):
        signal.signal(signal.SIGINT, self.killServer)
        signal.signal(signal.SIGTERM, self.killServer)

    def start_gevent(self):
        try:
            ssl_args = dict()
            certfile_path = web.ub.config.get_config_certfile()
            keyfile_path = web.ub.config.get_config_keyfile()
            if certfile_path and keyfile_path:
                if os.path.isfile(certfile_path) and os.path.isfile(
                        keyfile_path):
                    ssl_args = {
                        "certfile": certfile_path,
                        "keyfile": keyfile_path
                    }
                else:
                    web.app.logger.info(
                        'The specified paths for the ssl certificate file and/or key file seem to be broken. Ignoring ssl. Cert path: %s | Key path: %s'
                        % (certfile_path, keyfile_path))
            if os.name == 'nt':
                self.wsgiserver = WSGIServer(
                    ('0.0.0.0', web.ub.config.config_port),
                    web.app,
                    spawn=Pool(),
                    **ssl_args)
            else:
                self.wsgiserver = WSGIServer(('', web.ub.config.config_port),
                                             web.app,
                                             spawn=Pool(),
                                             **ssl_args)
            web.py3_gevent_link = self.wsgiserver
            self.wsgiserver.serve_forever()

        except SocketError:
            try:
                web.app.logger.info(
                    'Unable to listen on \'\', trying on IPv4 only...')
                self.wsgiserver = WSGIServer(
                    ('0.0.0.0', web.ub.config.config_port),
                    web.app,
                    spawn=Pool(),
                    **ssl_args)
                web.py3_gevent_link = self.wsgiserver
                self.wsgiserver.serve_forever()
            except (OSError, SocketError) as e:
                web.app.logger.info("Error starting server: %s" % e.strerror)
                print("Error starting server: %s" % e.strerror)
                web.helper.global_WorkerThread.stop()
                sys.exit(1)
        except Exception:
            web.app.logger.info("Unknown error while starting gevent")

    def startServer(self):
        if gevent_present:
            web.app.logger.info('Starting Gevent server')
            # leave subprocess out to allow forking for fetchers and processors
            self.start_gevent()
        else:
            try:
                ssl = None
                web.app.logger.info('Starting Tornado server')
                certfile_path = web.ub.config.get_config_certfile()
                keyfile_path = web.ub.config.get_config_keyfile()
                if certfile_path and keyfile_path:
                    if os.path.isfile(certfile_path) and os.path.isfile(
                            keyfile_path):
                        ssl = {
                            "certfile": certfile_path,
                            "keyfile": keyfile_path
                        }
                    else:
                        web.app.logger.info(
                            'The specified paths for the ssl certificate file and/or key file seem to be broken. Ignoring ssl. Cert path: %s | Key path: %s'
                            % (certfile_path, keyfile_path))

                # Max Buffersize set to 200MB
                http_server = HTTPServer(WSGIContainer(web.app),
                                         max_buffer_size=209700000,
                                         ssl_options=ssl)
                http_server.listen(web.ub.config.config_port)
                self.wsgiserver = IOLoop.instance()
                web.py3_gevent_link = self.wsgiserver
                self.wsgiserver.start()
                # wait for stop signal
                self.wsgiserver.close(True)
            except SocketError as e:
                web.app.logger.info("Error starting server: %s" % e.strerror)
                print("Error starting server: %s" % e.strerror)
                web.helper.global_WorkerThread.stop()
                sys.exit(1)

        # ToDo: Somehow caused by circular import under python3 refactor
        if sys.version_info > (3, 0):
            self.restart = web.py3_restart_Typ
        if self.restart == True:
            web.app.logger.info("Performing restart of Calibre-Web")
            web.helper.global_WorkerThread.stop()
            if os.name == 'nt':
                arguments = ["\"" + sys.executable + "\""]
                for e in sys.argv:
                    arguments.append("\"" + e + "\"")
                os.execv(sys.executable, arguments)
            else:
                os.execl(sys.executable, sys.executable, *sys.argv)
        else:
            web.app.logger.info("Performing shutdown of Calibre-Web")
            web.helper.global_WorkerThread.stop()
        sys.exit(0)

    def setRestartTyp(self, starttyp):
        self.restart = starttyp
        # ToDo: Somehow caused by circular import under python3 refactor
        web.py3_restart_Typ = starttyp

    def killServer(self, signum, frame):
        self.stopServer()

    def stopServer(self):
        # ToDo: Somehow caused by circular import under python3 refactor
        if sys.version_info > (3, 0):
            if not self.wsgiserver:
                # if gevent_present:
                self.wsgiserver = web.py3_gevent_link
                #else:
                #    self.wsgiserver = IOLoop.instance()
        if self.wsgiserver:
            if gevent_present:
                self.wsgiserver.close()
            else:
                self.wsgiserver.add_callback(self.wsgiserver.stop)

    @staticmethod
    def getNameVersion():
        if gevent_present:
            return {'Gevent': 'v' + geventVersion}
        else:
            return {'Tornado': 'v' + tornadoVersion}
Пример #18
0
from gevent.pywsgi import WSGIServer
from geventwebsocket.handler import WebSocketHandler
from Twidder import app

print(">>Starting server<<")
app.debug = True
http_server = WSGIServer(('', 5000), app, handler_class=WebSocketHandler)
try:
    http_server.serve_forever()
except KeyboardInterrupt:
    print ">>Shutting down server<<"
    http_server.close()
Пример #19
0
 def close(self):
     if self.closed:
         sys.exit('Multiple exit signals received - aborting.')
     else:
         log('Closing listener socket')
         WSGIServer.close(self)
Пример #20
0
class Server:
    """
    REST API server
    """
    def __init__(self):
        self.process = None
        self.app = Flask(__name__)
        self.app.config['MAX_CONTENT_LENGTH'] = 2 * 1024
        self.app.url_map.strict_slashes = False
        self.api = Api(self.app)

        # initialize SSL context
        self.context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
        self.context.verify_mode = ssl.CERT_REQUIRED
        self.context.set_ciphers(':'.join(TLS_CIPHERS))

        # allow TLS 1.2 and later
        self.context.options |= ssl.OP_NO_SSLv2
        self.context.options |= ssl.OP_NO_SSLv3
        self.context.options |= ssl.OP_NO_TLSv1
        self.context.options |= ssl.OP_NO_TLSv1_1

        # Apps and Pools API
        self.api.add_resource(Apps, '/apps')
        self.api.add_resource(App, '/apps/<int:app_id>')
        self.api.add_resource(Pools, '/pools')
        self.api.add_resource(Pool, '/pools/<int:pool_id>')

        # SST-CP API
        if caps.sstcp_enabled():
            self.api.add_resource(Powers, '/power_profiles')
            self.api.add_resource(Power, '/power_profiles/<int:profile_id>')

        # Stats and Capabilities API
        self.api.add_resource(Stats, '/stats')
        self.api.add_resource(Caps, '/caps')

        # SST-BF API
        if caps.sstbf_enabled():
            self.api.add_resource(Sstbf, '/caps/sstbf')

        # RDT interface API
        self.api.add_resource(CapsRdtIface, '/caps/rdt_iface')

        # MBA API
        if caps.mba_supported():
            self.api.add_resource(CapsMba, '/caps/mba')
            self.api.add_resource(CapsMbaCtrl, '/caps/mba_ctrl')

        # L3 CAT API
        if caps.cat_l3_supported():
            self.api.add_resource(CapsL3ca, '/caps/' + common.CAT_L3_CAP)

        # L2 CAT API
        if caps.cat_l2_supported():
            self.api.add_resource(CapsL2ca, '/caps/' + common.CAT_L2_CAP)

        # Reset API
        self.api.add_resource(Reset, '/reset')

        self.app.register_error_handler(HTTPException, Server.error_handler)

    def start(self, host, port, debug=False):
        """
        Start REST server

        Parameters:
            host: address to bind to
            port: port to bind to
            debug(bool): Debug flag

        Returns:
            0 on success
        """

        try:
            # check for file existence and type
            with open(TLS_CERT_FILE, opener=common.check_link):
                pass
            with open(TLS_KEY_FILE, opener=common.check_link):
                pass
            self.context.load_cert_chain(TLS_CERT_FILE, TLS_KEY_FILE)
        except (FileNotFoundError, PermissionError) as ex:
            log.error("SSL cert or key file, {}".format(str(ex)))
            return -1

        # loading CA crt file - it is needed for mTLS verification of client certificates
        try:
            with open(TLS_CA_CERT_FILE, opener=common.check_link):
                pass
            self.context.load_verify_locations(cafile=TLS_CA_CERT_FILE)

        except (FileNotFoundError, PermissionError) as ex:
            log.error("CA certificate file, {}".format(str(ex)))
            return -1

        self.http_server = WSGIServer((host, port),
                                      self.app,
                                      ssl_context=self.context,
                                      spawn=1)

        def handle_gevent_stop(signum, frame):
            log.info("Stopping gevent server loop")
            self.http_server.stop()
            self.http_server.close()

        # dedicated handler for gevent server is needed to stop it gracefully
        # before process will be terminated
        signal.signal(signal.SIGINT, handle_gevent_stop)

        self.process = multiprocessing.Process(
            target=self.http_server.serve_forever)
        self.process.start()
        return 0

    def terminate(self):
        """
        Terminates server
        """
        os.kill(self.process.pid, signal.SIGINT)
        sleep(1)
        if self.process.is_alive():
            self.process.terminate()
        self.process.join()

    @staticmethod
    def error_handler(error):
        """
        Error handler

        Parameters:
            error: error
        """
        common.STATS_STORE.general_stats_inc_num_err()
        response = {'message': error.description}
        return json.dumps(response), error.code
Пример #21
0
    except:
        return jsonify({"message": "server error"}), 500


@app.route('/login', methods=['POST'])
def login():
    try:
        auth = request.authorization
        if not auth or not auth.username or not auth.password:
            return jsonify({'message': 'invalid token'}), 401
        token = authHandler.login(auth)
        return jsonify({'token': token.decode('UTF-8')})
    except TokenVerificationException:
        return jsonify({'message': 'token verification failed'}), 401
    except:
        return jsonify({"message": "login failed"}), 401

    ################# Init Server #################


if __name__ == '__main__':
    # set up and run server
    # handleArgumentInputs(sys.argv[1:])
    server = WSGIServer(('0.0.0.0', int(8080)), app)
    try:
        print("Server is ready...")
        server.serve_forever()
    except KeyboardInterrupt:
        print("Server Stopped")
    server.close()
Пример #22
0
class WebServer(object):
    def __init__(self):
        signal.signal(signal.SIGINT, self._killServer)
        signal.signal(signal.SIGTERM, self._killServer)

        self.wsgiserver = None
        self.access_logger = None
        self.restart = False
        self.app = None
        self.listen_address = None
        self.listen_port = None
        self.unix_socket_file = None
        self.ssl_args = None

    def init_app(self, application, config):
        self.app = application
        self.listen_address = config.get_config_ipaddress()
        self.listen_port = config.config_port

        if config.config_access_log:
            log_name = "gevent.access" if _GEVENT else "tornado.access"
            formatter = logger.ACCESS_FORMATTER_GEVENT if _GEVENT else logger.ACCESS_FORMATTER_TORNADO
            self.access_logger, logfile = logger.create_access_log(
                config.config_access_logfile, log_name, formatter)
            if logfile != config.config_access_logfile:
                log.warning(
                    "Accesslog path %s not valid, falling back to default",
                    config.config_access_logfile)
                config.config_access_logfile = logfile
                config.save()
        else:
            if not _GEVENT:
                logger.get('tornado.access').disabled = True

        certfile_path = config.get_config_certfile()
        keyfile_path = config.get_config_keyfile()
        if certfile_path and keyfile_path:
            if os.path.isfile(certfile_path) and os.path.isfile(keyfile_path):
                self.ssl_args = dict(certfile=certfile_path,
                                     keyfile=keyfile_path)
            else:
                log.warning(
                    'The specified paths for the ssl certificate file and/or key file seem to be broken. '
                    'Ignoring ssl.')
                log.warning('Cert path: %s', certfile_path)
                log.warning('Key path:  %s', keyfile_path)

    def _make_gevent_unix_socket(self, socket_file):
        # the socket file must not exist prior to bind()
        if os.path.exists(socket_file):
            # avoid nuking regular files and symbolic links (could be a mistype or security issue)
            if os.path.isfile(socket_file) or os.path.islink(socket_file):
                raise OSError(errno.EEXIST, os.strerror(errno.EEXIST),
                              socket_file)
            os.remove(socket_file)

        unix_sock = WSGIServer.get_listener(socket_file, family=socket.AF_UNIX)
        self.unix_socket_file = socket_file

        # ensure current user and group have r/w permissions, no permissions for other users
        # this way the socket can be shared in a semi-secure manner
        # between the user running calibre-web and the user running the fronting webserver
        os.chmod(socket_file, 0o660)

        return unix_sock

    def _make_gevent_socket(self):
        if os.name != 'nt':
            unix_socket_file = os.environ.get("CALIBRE_UNIX_SOCKET")
            if unix_socket_file:
                return self._make_gevent_unix_socket(
                    unix_socket_file), "unix:" + unix_socket_file

        if self.listen_address:
            return (self.listen_address, self.listen_port), None

        if os.name == 'nt':
            self.listen_address = '0.0.0.0'
            return (self.listen_address, self.listen_port), None

        try:
            address = ('::', self.listen_port)
            sock = WSGIServer.get_listener(address, family=socket.AF_INET6)
        except socket.error as ex:
            log.error('%s', ex)
            log.warning('Unable to listen on "", trying on IPv4 only...')
            address = ('', self.listen_port)
            sock = WSGIServer.get_listener(address, family=socket.AF_INET)

        return sock, _readable_listen_address(*address)

    def _start_gevent(self):
        ssl_args = self.ssl_args or {}

        try:
            sock, output = self._make_gevent_socket()
            if output is None:
                output = _readable_listen_address(self.listen_address,
                                                  self.listen_port)
            log.info('Starting Gevent server on %s', output)
            self.wsgiserver = WSGIServer(sock,
                                         self.app,
                                         log=self.access_logger,
                                         spawn=Pool(),
                                         **ssl_args)
            if ssl_args:
                wrap_socket = self.wsgiserver.wrap_socket

                def my_wrap_socket(*args, **kwargs):
                    try:
                        return wrap_socket(*args, **kwargs)
                    except (ssl.SSLError) as ex:
                        log.warning('Gevent SSL Error: %s', ex)
                        raise GreenletExit

                self.wsgiserver.wrap_socket = my_wrap_socket
            self.wsgiserver.serve_forever()
        finally:
            if self.unix_socket_file:
                os.remove(self.unix_socket_file)
                self.unix_socket_file = None

    def _start_tornado(self):
        if os.name == 'nt' and sys.version_info > (3, 7):
            import asyncio
            asyncio.set_event_loop_policy(
                asyncio.WindowsSelectorEventLoopPolicy())
        log.info(
            'Starting Tornado server on %s',
            _readable_listen_address(self.listen_address, self.listen_port))

        # Max Buffersize set to 200MB            )
        http_server = HTTPServer(WSGIContainer(self.app),
                                 max_buffer_size=209700000,
                                 ssl_options=self.ssl_args)
        http_server.listen(self.listen_port, self.listen_address)
        self.wsgiserver = IOLoop.current()
        self.wsgiserver.start()
        # wait for stop signal
        self.wsgiserver.close(True)

    def start(self):
        try:
            if _GEVENT:
                # leave subprocess out to allow forking for fetchers and processors
                self._start_gevent()
            else:
                self._start_tornado()
        except Exception as ex:
            log.error("Error starting server: %s", ex)
            print("Error starting server: %s" % ex)
            self.stop()
            return False
        finally:
            self.wsgiserver = None

        if not self.restart:
            log.info("Performing shutdown of Calibre-Web")
            # prevent irritiating log of pending tasks message from asyncio
            logger.get('asyncio').setLevel(logger.logging.CRITICAL)
            return True

        log.info("Performing restart of Calibre-Web")
        arguments = list(sys.argv)
        arguments.insert(0, sys.executable)
        if os.name == 'nt':
            arguments = ["\"%s\"" % a for a in arguments]
        os.execv(sys.executable, arguments)
        return True

    def _killServer(self, __, ___):
        self.stop()

    def stop(self, restart=False):
        from . import updater_thread
        updater_thread.stop()
        from . import calibre_db
        calibre_db.stop()

        log.info("webserver stop (restart=%s)", restart)
        self.restart = restart
        if self.wsgiserver:
            if _GEVENT:
                self.wsgiserver.close()
            else:
                self.wsgiserver.add_callback_from_signal(self.wsgiserver.stop)
Пример #23
0
def main(*test_args):                              # runs as standalone on gevent server, main launch script
    from gevent.pywsgi import WSGIServer
    from galera_node_health import GaleraNodeHealth, examples
    import argparse
    import configparser
    import sys
    import traceback

    arg_parser = argparse.ArgumentParser(description='Launch galera-node-health using gevent server')
    arg_parser.add_argument('-v', dest='print_config', action='store_true', default=False,
                            help="Print config read during startup")
    arg_parser.add_argument('--print-example-config', dest='example_config', action='store_true', default=False,
                            help="Print example config and exit")
    arg_parser.add_argument('-f', dest='config_file', help="Path to file containing config")
    arg_parser.add_argument('--docker-logs-fix', dest="docker_logs_fix", action="store_true", default=False,
                            help=argparse.SUPPRESS)
    if not test_args:
        args_parsed = arg_parser.parse_args()
    else:
        args_parsed = arg_parser.parse_args(test_args)

    # Fix for `docker logs` command - turn line buffering and redirect to stdout and stderr
    if args_parsed.docker_logs_fix:
        sys.stdout = open('/dev/stdout', 'w', 1)
        sys.stderr = open('/dev/stderr', 'w', 1)

    if args_parsed.example_config:
        examples.print_config()
        if not test_args:
            sys.exit(0)
        else:
            return 'Printed'

    if args_parsed.config_file:
        config = configparser.ConfigParser(inline_comment_prefixes="#")
        try:
            with open(args_parsed.config_file, 'r') as f:
                config.read_file(f)
                checker_port = int(config.get('checker', 'port', fallback=8080))
                checker_address = config.get('checker', 'address', fallback='0.0.0.0')
            galera_health = GaleraNodeHealth(config_file=args_parsed.config_file, print_config=args_parsed.print_config)
        except Exception:
            traceback.print_exc()
            print("Cannot find or access config file: " + str(args_parsed.config_file))
            print("Please make sure it exists and has proper permissions")
            sys.exit(1)
    else:
        checker_port = 8080
        checker_address = '0.0.0.0'
        galera_health = GaleraNodeHealth(print_config=args_parsed.print_config)

    http_server = WSGIServer((checker_address, checker_port), galera_health.flask_app)
    try:
        http_server.serve_forever()
    except OSError as e:
        if e.errno == 98:
            print("Cannot start server - address already in use: " + checker_address + ":" + str(checker_port))
            print("Make sure nothing is running on that address/port or change address/port in config")
            sys.exit(1)
        else:
            raise
    except KeyboardInterrupt:
        print("Shutting down server because of keyboard interrupt")
    finally:
        if not http_server.closed:
            http_server.close()