a69202e4a9c6eaac64ba2a39cd7562e0cc335b0e
[leap_pycommon.git] / src / leap / common / events / server.py
1 # -*- coding: utf-8 -*-
2 # server.py
3 # Copyright (C) 2013 LEAP
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18
19 """
20 The server for the events mechanism.
21 """
22
23
24 import logging
25 import txzmq
26
27 from leap.common.zmq_utils import zmq_has_curve
28
29 from leap.common.events.zmq_components import TxZmqServerComponent
30
31
32 if zmq_has_curve():
33     EMIT_ADDR = "tcp://127.0.0.1:9000"
34     REG_ADDR = "tcp://127.0.0.1:9001"
35 else:
36     EMIT_ADDR = "ipc:///tmp/leap.common.events.socket.0"
37     REG_ADDR = "ipc:///tmp/leap.common.events.socket.1"
38
39
40 logger = logging.getLogger(__name__)
41
42
43 def ensure_server(emit_addr=EMIT_ADDR, reg_addr=REG_ADDR):
44     """
45     Make sure the server is running in the given addresses.
46
47     :param emit_addr: The address in which to receive events from clients.
48     :type emit_addr: str
49     :param reg_addr: The address to which publish events to clients.
50     :type reg_addr: str
51
52     :return: an events server instance
53     :rtype: EventsServer
54     """
55     _server = EventsServer(emit_addr, reg_addr)
56     return _server
57
58
59 class EventsServer(TxZmqServerComponent):
60     """
61     An events server that listens for events in one address and publishes those
62     events in another address.
63     """
64
65     def __init__(self, emit_addr, reg_addr):
66         """
67         Initialize the events server.
68
69         :param emit_addr: The address in which to receive events from clients.
70         :type emit_addr: str
71         :param reg_addr: The address to which publish events to clients.
72         :type reg_addr: str
73         """
74         TxZmqServerComponent.__init__(self)
75         # bind PULL and PUB sockets
76         self._pull, self.pull_port = self._zmq_bind(
77             txzmq.ZmqPullConnection, emit_addr)
78         self._pub, self.pub_port = self._zmq_bind(
79             txzmq.ZmqPubConnection, reg_addr)
80         # set a handler for arriving messages
81         self._pull.onPull = self._onPull
82
83     def _onPull(self, message):
84         """
85         Callback executed when a message is pulled from a client.
86
87         :param message: The message sent by the client.
88         :type message: str
89         """
90         event, content = message[0].split(b"\0", 1)
91         logger.debug("Publishing event: %s" % event)
92         self._pub.publish(content, tag=event)