Source code for core.service.udp
# core/dutch/udp.py
#
#
""" relay txt through a udp port listener. """
__copyright__ = "Copyright 2015, B.H.J Thate"
## IMPORTS
from core.errors import error
from core.utils.name import name
from core.extra import rijndael
from core.kernel import kernel
from core.cfg import cfg_udp
from core.thing import Thing
import logging
import socket
import time
crypt = rijndael.rijndael(cfg_udp.seed)
## UDP class
[docs]class UDP(Thing):
def __init__(zelf, *args, **kwargs):
Thing.__init__(zelf, *args, **kwargs)
zelf._status = "start"
zelf._start = time.time()
zelf._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
zelf._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try: zelf._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
except: pass
zelf._sock.setblocking(1)
[docs] def start(zelf):
zelf._sock.bind((cfg_udp.host, cfg_udp.port))
logging.warn("# start %s/%s" % (cfg_udp.host, cfg_udp.port))
zelf.ready()
zelf._status = "running"
while zelf._status:
input, addr = zelf._sock.recvfrom(64000)
if not zelf._status: break
input = str(input.rstrip(), "utf-8")
data = ""
for i in range(int(len(input)/16)):
txt = input[i*16:i*16+16]
try: data += crypt.decrypt(txt)
except Exception as ex: error() ; break
if not data: break
zelf.output(data, addr)
[docs] def exit(zelf, *args, **kwargs):
logging.warn("# exit %s" % name(zelf))
zelf._status = "exit"
zelf._sock.settimeout(1.0)
zelf._sock.sendto(bytes("bla", "utf-8"), (cfg_begrip.host, cfg_begrip.port))
#zelf._sock.shutdown(socket.SHUT_WR)
[docs] def output(zelf, input, addr):
passwd, text = input.split(" ", 1)
text = text.replace("\00", "")
if passwd == cfg_udp.password: kernel.announce(text)
[docs]def init(*args, **kwargs):
udp = UDP()
kernel.put(udp.start)