Source code for zot.services.udp
# zot/services/udp.py
#
#
""" relay txt through a udp port listener. """
__copyright__ = "Copyright 2015, B.H.J Thate"
## IMPORTS
from zot.utils import error, get_name
from zot.defaults import cfg_udp
from zot.contrib import rijndael
from zot.errors import StopIter
from zot.object import Object
from zot.runtime import kernel
import logging
import socket
import queue
import zot
import time
import re
crypt = rijndael.rijndael(cfg_udp.seed)
## UDP class
[docs]class UDP(Object):
def __init__(zelf, *args, **kwargs):
Object.__init__(zelf, *args, **kwargs)
zelf._status = "idle"
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()
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" % get_name(zelf))
zelf._status = ""
zelf._sock.settimeout(1.0)
zelf._sock.sendto(bytes("bla", "utf-8"), (cfg_udp.host, cfg_udp.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):
server = UDP()
kernel.put(server.start)