def socketio_server():
    #server = SocketIOServer(('0.0.0.0', 0), SocketApp(), policy_server=False)
    server = SocketIOServer(('0.0.0.0', 38477), SocketApp(), policy_server=False)
    server.start()
    port = server.socket.getsockname()[1]
    print 'http://localhost:'+str(port)+'/'
    server.serve_forever()
Beispiel #2
0
def start(http_host, http_port, smtp_host, smtp_port, db_path=None):
    global socketio_server
    # Webserver
    log.notice('Starting web server on http://{0}:{1}'.format(
        http_host, http_port))
    socketio_server = SocketIOServer((http_host, http_port),
                                     app,
                                     log='default' if app.debug else None)
    socketio_server.start()
    # SMTP server
    log.notice('Starting smtp server on {0}:{1}'.format(smtp_host, smtp_port))
    SMTPServer((smtp_host, smtp_port), smtp_handler)
    gevent.spawn(asyncore.loop)
    # Database
    connect(db_path)
    create_tables()
    # Wait....
    try:
        stopper.wait()
    except KeyboardInterrupt:
        print()
    else:
        log.debug('Received stop signal')
    # Clean up
    disconnect()
    log.notice('Terminating')
def socketio_server():
    server = SocketIOServer(
        ('0.0.0.0', port),
        SocketApp(),
        policy_server=False)
    server.start()
    server.serve_forever()
Beispiel #4
0
    def handle(self, addrport="", *args, **options):
        global server
        if not addrport:
            self.addr = ''
            self.port = DEFAULT_PORT
        else:
            m = match(naiveip_re, addrport)
            if m is None:
                raise CommandError('"%s" is not a valid port number '
                                   'or address:port pair.' % addrport)
            self.addr, _, _, _, self.port = m.groups()

        # Make the port available here for the path:
        #   socketio_tags.socketio ->
        #   socketio_scripts.html ->
        #   io.Socket JS constructor
        # allowing the port to be set as the client-side default there.
        environ["DJANGO_SOCKETIO_PORT"] = str(self.port)

        start_new_thread(reload_watcher, ())
        try:
            bind = (self.addr, int(self.port))
            print
            print "SocketIOServer running on %s:%s" % bind
            print
            handler = self.get_handler(*args, **options)
            server = SocketIOServer(bind,
                                    handler,
                                    resource="socket.io",
                                    policy_server=True)
            #server.serve_forever()
            from gevent.event import Event
            stopper = Event()
            server.start()
            stopper.wait()
        except KeyboardInterrupt:
            if RELOAD:
                server.stop()
                print "Reloading..."
                restart_with_reloader()
            else:
                raise
    def handle(self, addrport="", *args, **options):
        global server
        if not addrport:
            self.addr = ''
            self.port = DEFAULT_PORT
        else:
            m = match(naiveip_re, addrport)
            if m is None:
                raise CommandError('"%s" is not a valid port number '
                                   'or address:port pair.' % addrport)
            self.addr, _, _, _, self.port = m.groups()

        # Make the port available here for the path:
        #   socketio_tags.socketio ->
        #   socketio_scripts.html ->
        #   io.Socket JS constructor
        # allowing the port to be set as the client-side default there.
        environ["DJANGO_SOCKETIO_PORT"] = str(self.port)

        start_new_thread(reload_watcher, ())
        try:
            bind = (self.addr, int(self.port))
            print
            print "SocketIOServer running on %s:%s" % bind
            print
            handler = self.get_handler(*args, **options)
            server = SocketIOServer(bind, handler, resource="socket.io", policy_server=True)
            #server.serve_forever()port
            from gevent.event import Event
            stopper = Event()
            server.start()
            stopper.wait()
        except KeyboardInterrupt:
            if RELOAD:
                server.stop()
                print "Reloading..."
                restart_with_reloader()
            else:
                raise
Beispiel #6
0
def start(http_host, http_port, smtp_host, smtp_port, db_path=None):
    global socketio_server
    # Webserver
    log.notice('Starting web server on http://{0}:{1}'.format(http_host, http_port))
    socketio_server = SocketIOServer((http_host, http_port), app,
                                     log='default' if app.debug else None)
    socketio_server.start()
    # SMTP server
    log.notice('Starting smtp server on {0}:{1}'.format(smtp_host, smtp_port))
    SMTPServer((smtp_host, smtp_port), smtp_handler)
    gevent.spawn(asyncore.loop)
    # Database
    connect(db_path)
    create_tables()
    # Wait....
    try:
        stopper.wait()
    except KeyboardInterrupt:
        print
    else:
        log.debug('Received stop signal')
    # Clean up
    disconnect()
    log.notice('Terminating')
Beispiel #7
0
        nargs="?",
        default="/dev/null",
        const=ROOT + "/log",
    )
    args = parser.parse_args()
    if args.debug is False:
        if args.log == "/dev/null":
            sys.stderr = open(os.devnull, "w")
        else:
            sys.stderr = open(args.log, "w")

    options = {"resource": "socket.io", "policy_server": True, "policy_listener": ("0.0.0.0", 10843)}

    # Start server
    sys.stdout.write(color("Argonaut - ", "cyan"))
    sys.stdout.write(color("Starting server...\n", "blue"))
    sys.stdout.write(color("   Ports - ", "cyan"))
    sys.stdout.write(color("App: ", "blue") + color("6058  ", "red"))
    sys.stdout.write(color("Flash: ", "blue") + color("843\n", "red"))
    sys.stdout.flush()
    server = SocketIOServer(("0.0.0.0", 6058), app, **options)
    server.start()

    # Start server-side prompt
    prompt = color("Argonaut", "cyan") + color("$ ", "blue")
    while True:
        cmd = raw_input(prompt)
        if cmd.startswith("exit"):
            server.stop()
            exit(0)
Beispiel #8
0
class FlaskService(ServiceBase):
    TYPE = 'FlaskService'

    def __init__(self, name):
        super(FlaskService, self).__init__(name)
        self.app = None

        self.api_list = {}  # 注册api
        self.db = None
        self.blueprints = {}
        self.logger = Logger(__name__)
        self.isclosed = False
        self.thread = None
        self.server = None

    def init(self, cfgs, **kwargs):
        #from mantis.fundamental.application.app import instance
        if kwargs.has_key('logger'):
            self.logger = kwargs.get('logger')

        self.cfgs = cfgs
        if kwargs.has_key('app'):
            self.app = kwargs.get('app')
        else:
            static_path = os.getcwd() + '/static'
            template_path = os.getcwd() + '/templates'
            self.app = Flask(
                __name__,
                static_folder=static_path,
                template_folder=template_path
            )  # flask会自动将当前代码目录设置为项目根目录 root_path 导致读取templtes , sta它ic 目录失败

        Compress(self.app)  # okay
        # gzip = Gzip(app) # error

        active = self.getConfig().get('cfgs', {})
        for k, v in active.items():
            self.app.config[k] = v

        self.initCors()
        self.initDatabase()

        self.setupRequestHooks()
        self.initBlueprint()

        self.setupTemplates()

    def setupTemplates(self):
        from werkzeug.routing import BaseConverter
        from flask import Flask, send_file

        class RegexConverter(BaseConverter):
            def __init__(self, map, *args):
                self.map = map
                self.regex = args[0]

        self.app.url_map.converters['regex'] = RegexConverter

        @self.app.route('/<regex(".*\.html$"):template_name>')
        def _template_render(template_name):
            name = os.path.join(self.app.template_folder, template_name)
            return send_file(name)

    def initDatabase(self):
        global db
        if db.get() is None:
            self.db = SQLAlchemy(self.app)
            db.set(self.db)

    def getDatabase(self):
        return self.db

    def initCors(self):
        """
            https://flask-cors.readthedocs.io/en/latest/
        :return:
        """
        if self.getConfig().get('cors_enable', True):
            CORS(self.app)

    def getFlaskApp(self):
        return self.app

    def setupRequestHooks(self):
        self.app.before_request(self.onRequestBefore)
        self.app.teardown_request(self.onRequestTeardown)
        # self.app.after_request(self._requestAfter)  # todo. 导致 send_file 失败
        # 当利用send_file发送二进制数据时,after_request对返回数据进行日志处理,导致数据返回失败

    def _traceRequestInfo(self, opts):
        import json
        trace_data = {'url': request.url}
        if opts.get('header'):
            trace_data['headers'] = request.headers
        if opts.get('body'):
            trace_data['body'] = request.data.replace(
                '\n', ' ')[:opts.get('max_size')]
        return json.dumps(trace_data)

    def _traceResponseInfo(self, opts, response):
        import json
        trace_data = {'url': request.url}
        if opts.get('header'):
            trace_data['headers'] = response.headers
        if opts.get('body'):
            trace_data['body'] = response.data.replace(
                '\n', ' ')[:opts.get('max_size')]
        return json.dumps(trace_data)

    def onRequestBefore(self):
        # pass
        import time
        g.start_time = time.time()

        #
        # trace = self.getConfig().get('http_trace',{}).get('request',{})
        # options = trace.get('options',{'header':False,'body':False,'max_size':1024})
        # urls = trace.get('urls',[])
        # #sort urls by 'match' with desceding.
        # urls = sorted(urls,cmp = lambda x,y: cmp(len(x.get('match')) , len(y.get('match')) ) )
        # urls.reverse()
        #
        # text = ''
        # for url in urls:
        #     m = url.get('match')
        #     if m:
        #         opts = options.copy()
        #         opts['header'] = url.get('header',options.get('header'))
        #         opts['body'] = url.get('body',options.get('body'))
        #         opts['max_size'] = url.get('max_size',options.get('max_size'))
        #         if request.url.find(m) !=-1:
        #             text = self._traceRequestInfo(opts)
        #             break
        # level = self.getConfig().get('http_trace',{}).get('level','DEBUG')
        # text = 'HttpRequest: '+text
        # self.getLogger().log(level,text)

    def onRequestTeardown(self, e):
        pass

    def _requestAfter(self, response):

        trace = self.getConfig().get('http_trace', {}).get('response', {})
        options = trace.get('options', {
            'header': False,
            'body': False,
            'max_size': 1024
        })
        urls = trace.get('urls', [])

        urls = sorted(
            urls,
            cmp=lambda x, y: cmp(len(x.get('match')), len(y.get('match'))))
        urls.reverse()

        text = ''
        for url in urls:
            m = url.get('match')
            if m:
                opts = options.copy()
                opts['header'] = url.get('header', options.get('header'))
                opts['body'] = url.get('body', options.get('body'))
                opts['max_size'] = url.get('max_size', options.get('max_size'))
                if request.url.find(m) != -1:
                    text = self._traceResponseInfo(opts, response)
                    break
        level = self.getConfig().get('http_trace', {}).get('level', 'DEBUG')

        remote_addr = ''
        if request.headers.getlist("X-Forwarded-For"):
            remote_addr = request.headers.getlist("X-Forwarded-For")[0]
        else:
            remote_addr = request.remote_addr

        elapsed = int((time.time() - g.start_time) * 1000)
        text = 'HTTP %s %s %s %sms  ' % (remote_addr, request.method,
                                         request.url, elapsed)
        self.getLogger().log(level, text)

        return response

    def initBlueprint(self):

        cfgs = self.getConfig().get('blueprints', [])
        for cfg in cfgs:
            # module = import_module( cfgs.get('module'))
            if not cfg.get('register', True):
                continue
            package_name = cfg.get('name', '')
            package = cfg.get('package')
            package_url = cfg.get('url')
            modules = cfg.get('modules', [])
            for module in modules:
                module_name = module.get('name', )
                module_url = module.get("url", '')
                path = '%s.%s' % (package, module_name)
                load_module = import_module(path)

                app = Blueprint(module_name, path)
                self.blueprints[path] = app

                # api_module = {'name': u'%s.%s'%(package_name,module_name),'api_list':[]}
                module_name = u'%s.%s' % (package_name, module_name)
                self.api_list[module_name] = []

                routes = module.get('routes', [])
                for route in routes:
                    url = route.get('url', '')
                    name = route.get('name', '')
                    methods = filter(
                        lambda x: len(x) > 0,
                        route.get('methods', '').strip().upper().split(','))

                    if hasattr(load_module, name):
                        func = getattr(load_module, name)
                        path = package_url + module_url
                        path = path.replace('//', '/')
                        if methods:
                            app.route(url, methods=methods)(func)
                        else:
                            app.route(url)(func)
                        self.registerBlueprint(app, path)
                        path = path + '/' + url
                        path = path.replace('//', '/')
                        self.logger.debug('registered blueprint route:' + path)

                        api = {'url': path, 'methods': ('GET', )}

                        if methods:
                            api['methods'] = methods
                        self.api_list[module_name].append(api)

    def registerAPIs(self, manager):
        manager.register_http_service(self.api_list)

    # def _initLogger(self):
    #     from camel.biz.logging.logger import FlaskHttpRequestLogger
    #     return FlaskHttpRequestLogger(self.appId)

    # def start(self,block = True):
    #     # Application.run(self)
    #     http = self.getConfig().get('http')
    #     if http:
    #         self.app.run(host=http.get('host','127.0.0.1'),
    #             port = http.get('port',5000),
    #             threaded = http.get('threaded',True),
    #             debug = http.get('debug',True),
    #             process = http.get('process',1))

    def select_address(self):
        """
        修正http侦听地址 , 如果port未定义或者为0 ,则进行动态选定端口
        :return:
        """
        from mantis.fundamental.utils.network import select_address_port
        http = self.cfgs.get('http')

        if not http.get('port'):  # port 未定义或者为0
            start = 18900
            end = 18950
            address = select_address_port(http.get('host'), start, end)
            self.cfgs.get('http')['port'] = address[1]

    def start(self, block=True):
        self.select_address()

        http = self.getConfig().get('http')
        host = http.get('host', '127.0.0.1')
        port = http.get('port', 5000)
        # app = self.app

        # if http.get('debug', False):
        #     app.run(host,port,debug=True)
        # else:
        #     self.server = wsgi.WSGIServer(( host, port), app)
        #
        #     self.server.start()
        #     Application.run(self)
        # self.server = pywsgi.WSGIServer((host,port),app)
        # self.server.start()

        self.initHttpServer()

        if block:
            self.logger.info('Service: %s started, Listen on %s:%s ...' %
                             (self.name, host, port))
            self.server.serve_forever()
        else:
            self.thread = Thread(target=self.runThread)
            self.thread.setDaemon(True)
            self.thread.start()

    def initHttpServer(self):
        http = self.getConfig().get('http')
        host = http.get('host', '127.0.0.1')
        port = http.get('port', 5000)
        app = self.app
        from mantis.fundamental.application.use_gevent import USE_GEVENT

        print '--' * 20
        if USE_GEVENT:
            from gevent import pywsgi
            from socketio.server import SocketIOServer
            if http.get('websocket', False):
                self.server = SocketIOServer((host, port),
                                             app,
                                             resource="socket.io")
            else:
                self.server = pywsgi.WSGIServer((host, port), app)
                self.server.start()
        else:
            from wsgiref.simple_server import make_server
            self.server = make_server(host, port, app)

        self.logger.info('Service: %s started, Listen on %s:%s ...' %
                         (self.name, host, port))

    def runThread(self):
        # print 'xxxx-Service: %s started, Listen on %s:%s ...' % (self.name, host, port)
        self.server.serve_forever()

    def stop(self):
        from mantis.fundamental.application.use_gevent import USE_GEVENT

        if self.server:
            if USE_GEVENT:
                self.server.stop()
            else:
                self.server.shutdown()

    def registerBlueprint(self, bp, url):
        self.app.register_blueprint(bp, url_prefix=url)
def socketio_server(q):
    server = SocketIOServer(('0.0.0.0', 0), SocketApp(), policy_server=False)
    server.start()
    port = server.socket.getsockname()[1]
    q.put(port)
    server.serve_forever()
Beispiel #10
0
def socketio_server():
    server = SocketIOServer(('0.0.0.0', port),
                            SocketApp(),
                            policy_server=False)
    server.start()
    server.serve_forever()
def socketio_server(q):
    server = SocketIOServer(('0.0.0.0', 0), SocketApp(), policy_server=False)
    server.start()
    port = server.socket.getsockname()[1]
    q.put(port)
    server.serve_forever()