Added hidemmsi option for outpeers
[ais.git] / bin / inputs / outpeer.py
index 089b20c330bdefd095aee3e4265de37817121cdf..0a479c559d8d83ba2352bd51bb000a93afd1007e 100644 (file)
@@ -10,6 +10,7 @@ import socket
 from threading import Thread, Lock
 
 from ais.ntools import formataddr
+from ais.common import strmmsi_to_mmsi
 
 __all__ = [ 'OutPeers', 'outpeers_from_config', 'TcpInOutPeer', 'TcpInServiceOut', 'tcpin_outpeers' ]
 
@@ -17,7 +18,7 @@ class UdpOutPeer:
     '''
     UDP output feed.
     '''
-    def __init__(self, str_addrport):
+    def __init__(self, str_addrport, options):
         colpos = str_addrport.rfind(':')
         if colpos == 1:
             assert colpos != 1, \
@@ -33,6 +34,14 @@ class UdpOutPeer:
         self.timestamp_getaddrinfo = 0
         self._reinit_socket()
 
+        self.hidemmsi = []
+        logging.warning('%s', options)
+        for option in options:
+            if option.startswith('hidemmsi:'):
+                self.hidemmsi += option[len('hidemmsi:'):].split(',')
+        self.hidemmsi = [ strmmsi_to_mmsi(mmsi) for mmsi in self.hidemmsi ]
+        logging.warning('hidemmsi:%s', self.hidemmsi)
+
     def __repr__(self):
         return '%s:%s' % (self.host, self.port)
 
@@ -84,7 +93,7 @@ class UdpOutPeer:
             except socket.error, msg:
                 logging.error("Can't open socket to %s: %s", self.addr, msg)
         
-    def send_line(self, line):
+    def send_line(self, line, decoded_info):
         '''
         Sends a AIVDM line to that peer.
         CRLF will be added automatically.
@@ -108,7 +117,7 @@ class TcpInOutPeer:
         #self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER,
         #                      struct.pack('ii', 1, SERVER_LINGER_TIME))
 
-    def send_line(self, line):
+    def send_line(self, line, decoded_info):
         try:
             self.sock.send(line+'\r\n')
         except socket.error, err:
@@ -204,13 +213,21 @@ class OutPeers:
         for peer in tmp_peers:
             yield peer
 
-    def send_line(self, line):
+    def send_line(self, line, decoded_info):
         '''
         Send a line to all the output peers registered.
         '''
         for outpeer in self.safe_iter():
+            if decoded_info and decoded_info != True:
+                try:
+                    hidemmsi = outpeer.hidemmsi
+                except AttributeError:
+                    hidemmsi = []
+                if decoded_info.mmsi in hidemmsi:
+                    logging.info('Hiding line for mmsi=%s', decoded_info.mmsi)
+                    continue
             logging.debug('OUT %s %s', outpeer, repr(line))
-            outpeer.send_line(line)
+            outpeer.send_line(line, decoded_info)
 
 def outpeers_from_config(list_from_config):
     '''
@@ -218,10 +235,15 @@ def outpeers_from_config(list_from_config):
     Returns an OutPeers object.
     '''
     outpeers = OutPeers()
-    for str_config in list_from_config:
+    for config_with_options in list_from_config:
+        str_config = config_with_options[0]
+        if len(config_with_options):
+            options = config_with_options[1:]
+        else:
+            options = []
         assert str_config.startswith('udp:'), \
                'Unsupported output peer protocol %s' % str_config
-        peer = UdpOutPeer(str_config[4:])
+        peer = UdpOutPeer(str_config[4:], options)
         outpeers.add_peer(peer)
     return outpeers