From 751ab339ba5a38cbcd3a17620ab78e973fd5664f Mon Sep 17 00:00:00 2001 From: Simeon Simeonov Date: Tue, 4 Jun 2013 20:27:11 +0200 Subject: Beinc structure and design developed --- beinc_server.py | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100755 beinc_server.py (limited to 'beinc_server.py') diff --git a/beinc_server.py b/beinc_server.py new file mode 100755 index 0000000..a39dd05 --- /dev/null +++ b/beinc_server.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import argparse +import getpass +import json +import os +import sys + +import cherrypy + + +__author__ = 'Simeon Simeonov' +__version__ = '1.0-beta' +__license__ = "GPL3" + + + +class WebNotifyServer(object): + + def __init__(self, config): + """ + """ + self.__config = config + self.__instances = dict() + self.__queues = dict() + + try: + for instance in self.__config['server']['instances']: + self.__queues[instance['name']] = list() + self.__instances[instance['name']] = instance + + except Exception as e: + sys.stderr.write('Unable to initialize queues: {0}'.format(e)) + sys.exit(1) + + + @cherrypy.expose + def index(self): + """ + default dispatcher + """ + return 'index' + + + @cherrypy.expose + def default(self, *args): + """ + default dispatcher + """ + return 'default' + + + @cherrypy.expose + def push(self, *args, **kwargs): + + if not args: + raise cherrypy.HTTPError(400) + + print('args: {0}'.format(args)) + print('kwargs: {0}'.format(kwargs)) + + instance = self.__get_instance(args[0]) + + if not kwargs.get('password') == instance['password']: + raise cherrypy.HTTPError('403 Forbidden', + 'Wrong instance or password') + + return 'OK' + + + def __get_instance(self, name): + """ + returns a matching 'instance' dictionary + + cherrypy.HTTPError - "403 Forbidden" is raised if no + instance matches 'name' + """ + + try: + for instance in self.__config['server']['instances']: + if name == instance['name']: + return instance + + except Exception as e: + raise cherrypy.HTTPError('403 Forbidden', + 'Wrong instance or password: {0}'.format(e)) + + raise cherrypy.HTTPError("403 Forbidden", "Wrong instance or password") + + + # mappings = [ + # (r'^/push/', push), + # (r'^.*$', default), + # ] + + +def main(): + + parser = argparse.ArgumentParser(description='The following options are available') + + + parser.add_argument('-d', + action='store_true', + dest='daemonize', + default=False, + help='daemonize the server process') + + parser.add_argument('-H', '--hostname', + metavar='HOSTNAME', + type=str, + dest='hostname', + default='127.0.0.1', + help="Server IP / hostname") + + parser.add_argument('-p', '--port', + metavar='PORT', + type=int, + dest='port', + default=9998, + help="Server port") + + parser.add_argument('-c', '--config-file', + metavar='FILE', + type=str, + default=os.path.expanduser('~/.beinc_server.json'), + dest='config_file', + help="config file") + + parser.add_argument('-v', '--version', + action='version', + version='%(prog)s {0}'.format(__version__), + help='display program-version and exit') + + args = parser.parse_args() + + + try: + with open(args.config_file, 'r') as fp: + config_dict = json.load(fp) + + except Exception as e: + sys.stderr.write('Unable to parse {0}: {1}'.format(args.config_file, e)) + + + cherrypy.config.update({ + 'server.socket_host': args.hostname, + 'server.socket_port': args.port, + 'server.ssl_module': config_dict['server']['general']['ssl_module'].encode('utf-8'), + 'server.ssl_certificate': config_dict['server']['general']['ssl_certificate'], + 'server.ssl_private_key': config_dict['server']['general']['ssl_private_key'], + }) + + try: + cherrypy.quickstart(WebNotifyServer(config_dict)) + + except Exception as e: + sys.stderr.write("WebServer error: {0}".format(e)) + sys.exit(1) + + + sys.exit(0) + + +if __name__ == "__main__": + main() + -- cgit v1.3