#!/usr/bin/env python
# vim: sts=4 sw=4 et

"""
Simple unicast proxy for collectd (>= 4.0).
Binds to 'local' address and forwards all traffic to 'remote'.

[Note]
For collectd 3.* there is no 'host' field in packet so it must be added.
See collectd3-proxy.py for details.
"""

import socket
import struct

""" Local multicast group/port"""
local  = ("239.192.74.66", 25826)
""" Address to send packets """
remote = ("grid.pp.ru", 35826)

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
mreq = struct.pack("4sl", socket.inet_aton(local[0]), socket.INADDR_ANY)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
sock.bind(local)

out = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

if __name__ == "__main__":
    while True:
        (buf, addr) = sock.recvfrom(2048)
        sock.sendto(buf, remote)
