Compare commits

..

5 commits

Author SHA1 Message Date
fa469cda30 Merge branch 'master' of codeberg.org:ET-Kiel/tk102gpx 2023-09-16 23:47:46 +02:00
20453c8570 --follow sleeps 10 seconds 2023-09-16 23:47:28 +02:00
434cec1aa7 crontab with cron.sh 2023-09-16 23:46:49 +02:00
Stephan I. Böttcher
ada56a8ad5 close oldest connection when > 9 connections are open 2023-09-16 23:44:44 +02:00
Stephan I. Böttcher
be10b8b551 s/BAT/SIGNAL/ 2023-09-16 23:43:41 +02:00
3 changed files with 49 additions and 33 deletions

View file

@ -1,2 +1,2 @@
# m h dom mon dow command # m h dom mon dow command
*/5 * * * * make -C /home/ncrs1/stephan/tk102gpx > /home/ncrs1/stephan/tk102gpx/cron.log 2>&1 * * * * * /home/ncrs1/stephan/tk102gpx/cron.sh > /home/ncrs1/stephan/tk102gpx/cron.log 2>&1

View file

@ -8,7 +8,7 @@ files = []
timeout = None timeout = None
def logger(s): def logger(s):
print(s, file=sys.stderr) print("\n"+s, file=sys.stderr)
oo,files = getopt.getopt(sys.argv[1:], "p:", ("port=",)) oo,files = getopt.getopt(sys.argv[1:], "p:", ("port=",))
@ -18,37 +18,53 @@ for o,v in oo:
poll = select.poll() poll = select.poll()
sockets = {}
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("", port)) sock.bind(("", port))
sock.listen(2) sock.listen(2)
poll.register(sock, select.POLLIN) poll.register(sock, select.POLLIN)
logger("listening on port %d, socket fd %d" % (port,sock.fileno())) logger(f"listening on port {port}, socket fd {sock.fileno()}")
class tksocks:
def __init__(self):
self.sockets = {}
self.fdescs = []
def add(self, s):
if len(self.fdescs) > 9:
self.close(self.fdescs[0])
fd = s[0].fileno()
self.sockets[fd] = s
self.fdescs.append(fd)
poll.register(fd, select.POLLIN | select.POLLHUP | select.POLLRDHUP)
def get(self, fd):
return self.sockets[fd]
def close(self, fd):
s = self.get(fd)
logger(f"closing connection from {repr(s[1])}")
del self.sockets[fd]
self.fdescs.remove(fd)
poll.unregister(fd)
s[0].close()
sockets = tksocks()
while True: while True:
c = poll.poll(timeout) try:
for fd, ev in c: c = poll.poll(timeout)
if fd==sock.fileno(): for fd, ev in c:
s = sock.accept() if fd==sock.fileno():
logger("connection from %s" % repr(s[1])) s = sock.accept()
if len(sockets) > 99: logger(f"connection from {repr(s[1])}")
logger("too many connections %s" % repr(sockets)) sockets.add(s)
s[0].send("too many connections, good bye")
s[0].close()
else: else:
sockets[s[0].fileno()] = s if ev & select.POLLIN:
poll.register(s[0], select.POLLIN | select.POLLHUP | select.POLLRDHUP) d = sockets.get(fd)[0].recv(4096, socket.MSG_DONTWAIT)
elif fd in sockets: if d:
so = sockets[fd][0] out.write(d)
if ev & select.POLLIN: out.flush()
d = so.recv(4096, socket.MSG_DONTWAIT) if ev & (select.POLLHUP | select.POLLRDHUP):
if d: sockets.close(fd)
out.write(d) except KeyboardInterrupt:
out.flush() break
if ev & (select.POLLHUP | select.POLLRDHUP): except Exception as e:
logger("closing connection from %s" % repr(sockets[fd][1])) logger(f"Error: {repr(e)}")
del sockets[fd]
poll.unregister(fd)
so.close()

View file

@ -72,7 +72,7 @@ tk_re = re.compile(b"".join((
b"(?P<VAR>[^,]+)?,", b"(?P<VAR>[^,]+)?,",
b"(?P<WHAT>[^,]*,)?", b"(?P<WHAT>[^,]*,)?",
b"A\*(?P<GPCKS>[0-9A-F][0-9A-F]),", b"A\*(?P<GPCKS>[0-9A-F][0-9A-F]),",
b"(?P<BAT>[FL])?,", b"(?P<SIGNAL>[FL])?,",
b"imei:(?P<IMEI>[0-9]+),", b"imei:(?P<IMEI>[0-9]+),",
b"(?P<LEN>[0-9]{3})", b"(?P<LEN>[0-9]{3})",
b"(?P<BCKS>..)" b"(?P<BCKS>..)"
@ -130,7 +130,7 @@ class TKGPX(gpxpy.gpx.GPX):
slept = True slept = True
sys.stderr.write(".") sys.stderr.write(".")
sys.stderr.flush() sys.stderr.flush()
time.sleep(60) time.sleep(10)
except KeyboardInterrupt: except KeyboardInterrupt:
break break
continue continue
@ -151,8 +151,8 @@ class TKGPX(gpxpy.gpx.GPX):
if verbose >= 3: if verbose >= 3:
print(repr(rd), file=sys.stderr) print(repr(rd), file=sys.stderr)
if verbose>0 and rd["BAT"] != b"F": if verbose>0 and rd["SIGNAL"] != b"F":
print(f"Battery is {repr(rd['BAT'])} at {rd['SERIAL']}", file=sys.stderr) print(f"Signal is {repr(rd['SIGNAL'])} at {rd['SERIAL']}", file=sys.stderr)
pd = { pd = {
"latitude": gprmc2deg(rd["LAT"], rd["NS"]), "latitude": gprmc2deg(rd["LAT"], rd["NS"]),
@ -183,7 +183,7 @@ class TKGPX(gpxpy.gpx.GPX):
if raw==2: if raw==2:
cd = {} cd = {}
cd.update(strorbytes(rd, 'BAT')) cd.update(strorbytes(rd, 'SIGNAL'))
cd.update(strorbytes(rd, 'SERIAL')) cd.update(strorbytes(rd, 'SERIAL'))
cd.update(strorbytes(rd, 'PHONE')) cd.update(strorbytes(rd, 'PHONE'))
cd['time'] = pd['time'].isoformat()[:19]+'Z' cd['time'] = pd['time'].isoformat()[:19]+'Z'