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.json | 23 ++++++++ beinc_server.py | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ cert.crt | 21 +++++++ key.pem | 28 +++++++++ 4 files changed, 239 insertions(+) create mode 100644 beinc_server.json create mode 100755 beinc_server.py create mode 100644 cert.crt create mode 100755 key.pem diff --git a/beinc_server.json b/beinc_server.json new file mode 100644 index 0000000..0604d36 --- /dev/null +++ b/beinc_server.json @@ -0,0 +1,23 @@ +{ + "server": { + "general": { + "ssl_module": "pyopenssl", + "ssl_private_key": "key.pem", + "ssl_certificate": "cert.crt" + }, + + "instances": [ + { + "name": "test", + "password": "changeme", + "osd_system": "none", + "queue_size": 4 + } + ] + }, + + "client": {}, + + "config_version": 1 + +} 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() + diff --git a/cert.crt b/cert.crt new file mode 100644 index 0000000..a6cd46f --- /dev/null +++ b/cert.crt @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIJAKp5myihOHJnMA0GCSqGSIb3DQEBBQUAMEoxCzAJBgNV +BAYTAk5PMRMwEQYDVQQIDApTb21lLVN0YXRlMRAwDgYDVQQKDAdQaWNob3ZlMRQw +EgYDVQQDDAtwaWNob3ZlLm9yZzAeFw0xMzA1MjUxOTU5MTVaFw0xNDA1MjUxOTU5 +MTVaMEoxCzAJBgNVBAYTAk5PMRMwEQYDVQQIDApTb21lLVN0YXRlMRAwDgYDVQQK +DAdQaWNob3ZlMRQwEgYDVQQDDAtwaWNob3ZlLm9yZzCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBANVajAPF6iiyOLpk4Wp+3PgXcWHIeDNipbZRoCc6Kkk0 +TPpk/6T3GllamLdIAXEbpuAi+Fq1z00aUbZbZnZVVwp+08beLYwc7eeFxZTpp0kE +/QOs6BEexR97Dets0KuRwqN849wX51wLHQ5pvyroN+8XM8l7dNB7zmi49POvRaKo +3qx8vKT3lCJV5sLX+lCtH7osgrKkVUlH2PYPQzEqZ8LlYaEgMFpEcgjKFNAV5+8p +6HEVZV2OJmflqFKhsyTu1mpM9wMlK4zhGS6rcjbIC35ZWKuETXPJ5BcAdQB2LuDc +GhNN6pplGvfFxEt78CCTugL//TsHTLP7ILhOPs9nTS8CAwEAAaNQME4wHQYDVR0O +BBYEFKLuAZYbfEW1ZQ1VI2y8ofm63PRfMB8GA1UdIwQYMBaAFKLuAZYbfEW1ZQ1V +I2y8ofm63PRfMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAF0iuli+ +L7gfxXzkzKLa8U9B0N8VFxdQCUpEe+6Myh89nBrIoFhMewEUR+zQK2jhlR6VJDd7 +cexn4F/rk0hM9VTGK1aKjvonbz9af6Oa5l/0hyp1vmLNLi7k5G397/5r4eZvcugv +h3FzxNl6ASa/7t4VnmwGp1xLwaMRbAl5KbojH32CpZwPmhDlG2svObe40Vy+6L32 +/8B0C5UpHEbIICXKsOlCqDHCmWBj1C7WzlihJlT+ZQrWsbLvhZ8lrNGR48lPL0DC +F88yjBB5bnt7MXbmbvRxFHCwLmuNSn84dgBtOTC95BAupr5DNrcr2V82OUEJ7TXt +xGrl/TwhhdzFRbE= +-----END CERTIFICATE----- diff --git a/key.pem b/key.pem new file mode 100755 index 0000000..84eaab4 --- /dev/null +++ b/key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDVWowDxeoosji6 +ZOFqftz4F3FhyHgzYqW2UaAnOipJNEz6ZP+k9xpZWpi3SAFxG6bgIvhatc9NGlG2 +W2Z2VVcKftPG3i2MHO3nhcWU6adJBP0DrOgRHsUfew3rbNCrkcKjfOPcF+dcCx0O +ab8q6DfvFzPJe3TQe85ouPTzr0WiqN6sfLyk95QiVebC1/pQrR+6LIKypFVJR9j2 +D0MxKmfC5WGhIDBaRHIIyhTQFefvKehxFWVdjiZn5ahSobMk7tZqTPcDJSuM4Rku +q3I2yAt+WVirhE1zyeQXAHUAdi7g3BoTTeqaZRr3xcRLe/Agk7oC//07B0yz+yC4 +Tj7PZ00vAgMBAAECggEBAJNR2557Wc3SClPCdtg3U1NHtLXFXCJ3Ol+jC0gq5Kn5 +oDHB7bg2HA6Y/RyJbt1wL5FS9FSGd+cQhl25zQ1mrhyEKK2IGsFF9IxKlXzWvfkw +pZiVGwU/TvQG3zyxvYDKvDBxe1EtfEbVMbITGLqC8KR6S/sS8T1IT+WF2TYuz5GZ +cCXPZlW54lqQWgzzFOHbqQrerwihFb+/+3qEYMQRKSONf5vZWhQ/SFK2xJQb1Kx+ +VYQGrBDTuyHILu3xIYbqfuzUMSkrqnmXqmSc0Q9w4hq0EVz/V3SXSTseZrBAqPEI +FhHAtl0Q7cxZNO7qaLZgoDJiKbUFvWWjF3rxNJwyA/ECgYEA96IBmsHL0wtvK62k +pVKQWp7mSr+qIsT4gfddyMq4Z+r+2G3wlvoAKSBze24POkfkrQ6ihaZyyfIb9U8c +jEM1b4X5sn/BaGnZusguvkIvIT6jiqjq8nhnXR7sFjM60B4w9PCLprzwV+yvzyBq +Wc9QAVbcVMHZbcSO284gM3U6pbcCgYEA3JAHwtBQirSTwrIPM39UEvwPX6j7ZP2C +QJWYxxc6xhYOlN5YzNFznUhyKhpmQYiL+UeNy6E591qTVhnh2hNDX5kbpyR2/iCf +rKuQiGrGLJ1MzC1IjX6UawVRuPR2ObD5F+v3L7uV4odwk7C6B2jOshlNT4mMWmM8 +1XnGf+ciVEkCgYEA7ZMNDQceYERZDMOT8VQrz/UgpdgKBz+H11CWNlxe3Lv0cXnQ +V1hULSDICkQF8fklZ+5hd+2/tQVFU2zpy5tzOaKEc37j9CORUwRY7AmdI7zvs8jp +V2SybgGLqKTPqPk+KNBaesZLo18dMI892Rnu/MnzqpEr44avNCwmcpfmgzMCgYEA +j/phZpWPjgv0zMppS+eZXU83Re3MNY+bIEfHVGdgkYBCgoFmnEU54HkzNTLIf40A +OniwIjYb3dE9jp4UpcOfXl9XAtO17YwkT5YrIjH5LZR9VmdVDjCL+BSf1UmXh290 +G16InJsqa5aYMYDS3xVWoEIOCpayjSpswrncjw+1hCkCgYEArE8gRlH4u+rptm6Y +TR2PStesol78CAnx6ZTgiHIzOLxbvBkSfjH2aFsLDjLwjQ86snIQKn2irwaPOH/h +eSaYt4/iT22mnEMfpp570m8Vz7T9fYazKGcXsXIuzJ0vYbymHBnd4b9Kqjx9T+k6 ++vWfcsVHZY/VtN4W/6r6CnQ60ic= +-----END PRIVATE KEY----- -- cgit v1.3