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)