diff --git a/tcp_lineserver.py b/tcp_lineserver.py deleted file mode 100644 index 9453b14..0000000 --- a/tcp_lineserver.py +++ /dev/null @@ -1,133 +0,0 @@ -import asyncore -import socket -import errno -import re -import circularlog -import logging - - -class LineHandler(asyncore.dispatcher_with_send): - - def __init__(self, sock): - self.buffer = b"" - asyncore.dispatcher_with_send.__init__(self, sock) - self.crlf = 0 - - def handle_read(self): - data = self.recv(8192) - if data: - parts = data.split(b"\n") - if len(parts) == 1: - self.buffer += data - else: - self.handle_line((self.buffer + parts[0]).decode('ascii')) - for part in parts[1:-1]: - if part[-1] == b"\r": - self.crlf = True - part = part[:-1] - else: - self.crlf = False - self.handle_line(part.decode('ascii')) - self.buffer = parts[-1] - - def send_line(self, line): - self.send(line.encode('ascii') + (b"\r\n" if self.crlf else b"\n")) - - def handle_line(self, line): - ''' - test: simple echo handler - ''' - self.send_line("> " + line) - - -class LineServer(asyncore.dispatcher): - - def __init__(self, host, port, lineHandlerClass): - asyncore.dispatcher.__init__(self) - self.create_socket(socket.AF_INET, socket.SOCK_STREAM) - self.set_reuse_addr() - self.bind((host, port)) - self.listen(5) - self.lineHandlerClass = lineHandlerClass - - def handle_accept(self): - pair = self.accept() - if pair is not None: - sock, addr = pair - print("Incoming connection from %s" % repr(addr)) - handler = self.lineHandlerClass(sock) - - def loop(self): - asyncore.loop() - - -class Disconnected(Exception): - pass - - -class LineClient(object): - - def __init__(self, host_port, announcement=None, filter_ascii=False, ridername="r"): - self.host_port = host_port - self.filter_ascii = filter_ascii - self.announcement = announcement - self.circular = circularlog.Rider(ridername) - self.connected = False - - def connect(self): - logging.info("connect to %s %s", "%s:%d" % self.host_port, getattr(self, 'name', '?')) - self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.socket.connect(self.host_port) - self.connected = True - self.buffer = [b""] - if self.announcement: - self.send_line('\n'.join(self.announcement)) - - def get_line(self): - if not self.connected: - logging.info("connect for get_line") - self.connect() - while len(self.buffer) <= 1: - self.socket.setblocking(0) - try: - data = self.socket.recv(1024) - except socket.error as e: - err = e.args[0] - if err == errno.EAGAIN or err == errno.EWOULDBLOCK: - return None - raise e - if data == "": - print(self.buffer, '<') - self.close() - raise Disconnected("disconnected") - self.socket.setblocking(1) - data = data.split(b'\n') - self.buffer[0] += data[0] - for p in data[1:]: - self.buffer.append(p) - line = self.buffer.pop(0).decode('ascii') - if len(line) > 0 and line[-1] == '\r': - line = line[0:-1] - self.circular.put("<", line) - # print '<', line - if self.filter_ascii: - # replace non ascii characters - line = re.sub(r'[^\x00-\x7E]+','?', line) - return line - - def send_line(self, line): - if not self.connected: - logging.info("connect for cmd: %s", line) - self.connect() - # print '>', line - self.circular.put(">", line) - self.socket.sendall(line.encode('ascii') + b'\n') - - def close(self): - self.socket.close() - self.connected = False - - -if __name__ == "__main__": - server = LineServer("localhost", 9999, LineHandler) - server.loop() diff --git a/webserver.py b/webserver.py index 9dc3f5f..10ed293 100755 --- a/webserver.py +++ b/webserver.py @@ -2,23 +2,15 @@ from gevent import monkey monkey.patch_all() import sys import time -import os import signal import socket import traceback import logging import json -from collections import deque -from datetime import date, datetime -import tcp_lineserver import gevent import gevent.pywsgi import gevent.queue -from gevent.lock import RLock import flask -import pprint -import random -import uuid import circularlog @@ -91,7 +83,7 @@ def get_update(path=None): lastmsg = time.time() else: gevent.sleep(pollinterval) - except (GeneratorExit, tcp_lineserver.Disconnected) as e: + except GeneratorExit as e: logging.info("except clause %r", repr(e)) logging.info('CLOSED %s', client.id) print('CLOSE client') @@ -132,6 +124,7 @@ def export(): logging.info('GET %s %s', path, repr(kwargs)) try: id = kwargs.pop('id') + print('export') client = instrument.clients[id] bytes = client.w_export(**kwargs) return flask.send_file( @@ -234,15 +227,10 @@ def hostport_split(hostport): return (h[0], int(h[1])) -def handle_pdb(sig, frame): - import pdb - print('PDB') - pdb.Pdb().set_trace(frame) - - -def handle_term(sig, _): - server.stop() - server.close() +# def handle_pdb(sig, frame): +# import pdb +# print('PDB') +# pdb.Pdb().set_trace(frame) def main(cls, **config): @@ -255,7 +243,12 @@ def main(cls, **config): inst_name = config['instrument'] instrument = cls(inst_name, config) - signal.signal(signal.SIGUSR1, handle_pdb) + # signal.signal(signal.SIGUSR1, handle_pdb) + + def handle_term(sig, _): + server.stop() + server.close() + signal.signal(signal.SIGTERM, handle_term) app.debug = True