summaryrefslogtreecommitdiff
path: root/weechat_notify_server.py
blob: 35d4f427f26690a9b6e0f9fb1359da031edbe960 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import SocketServer
import os
import sys

from multiprocessing import Process, Queue

import cherrypy

import settings


class CustomSocketServer(SocketServer.TCPServer):

    def __init__(self, server_address, RequestHandlerClass, queue):
        SocketServer.TCPServer.__init__(self,
                                        server_address,
                                        RequestHandlerClass)
        self.queue = queue


class MyTCPHandler(SocketServer.StreamRequestHandler):
    """
    The RequestHandler class for our server.

    It is instantiated once per connection to the server, and must
    override the handle() method to implement communication to the
    client.
    """

    def handle(self):

        data = self.rfile.readline().strip()

        if self.server.queue.qsize() > 3:
            self.server.queue.get()

        self.server.queue.put(data)
        #print(self.data)


class WebNotifyServer(object):

    def __init__(self, queue):
        self.queue = queue

    @cherrypy.expose
    def notifications(self):

        entry_list = list()
        
        while not self.queue.empty():
            entry_list.append(self.queue.get(False))

        #print (json.dumps(entry_list, sort_keys=True, indent=4))
        return json.dumps(entry_list)


def socket_server(queue):
    
    try:
        server = CustomSocketServer((settings.SOCKET_SERVER_HOST,
                                     settings.SOCKET_SERVER_PORT), 
                                    MyTCPHandler, 
                                    queue)
        server.serve_forever()

    except Exception as e:
        sys.stderr.write("SocketServer error: {0}".format(e))
        sys.exit(1)

    sys.exit(0)



def web_server(queue):

    cherrypy.config.update({
            'server.socket_host': settings.WEB_SERVER_HOST,
            'server.socket_port': settings.WEB_SERVER_PORT,
            'server.ssl_module': 'pyopenssl',
            'server.ssl_certificate': settings.WEB_SERVER_CERT,
            'server.ssl_private_key': settings.WEB_SERVER_KEY,            
            })

    try:

        cherrypy.quickstart(WebNotifyServer(queue))

    except Exception as e:
        sys.stderr.write("WebServer error: {0}".format(e))
        sys.exit(1)

    sys.exit(0)


def main():

    q = Queue()

    socket_server_process = Process(target=socket_server, args=(q,))
    web_server_process = Process(target=web_server, args=(q,))
    
    web_server_process.start()
    socket_server_process.start()

    socket_server_process.join()
    web_server_process.join()
    
    sys.exit(0)

if __name__ == "__main__":
    main()