Some code-rework on logtailer for being compatible with Python 3.8 and new Column Last TX at in Currently in QSO for better round management
This commit is contained in:
parent
da1211bbb2
commit
9bf065a3a3
3 changed files with 79 additions and 13 deletions
|
@ -156,6 +156,7 @@
|
|||
<tr>
|
||||
<th>Callsign</th>
|
||||
<th>Added at</th>
|
||||
<th>Last TX at</th>
|
||||
</tr>
|
||||
</thead>
|
||||
</table>
|
||||
|
@ -274,7 +275,8 @@
|
|||
|
||||
|
||||
var t_qso = $('#inQSO').DataTable( {
|
||||
"order": [[ 0, "asc" ]]
|
||||
"order": [[ 2, "asc" ]],
|
||||
"autoWidth": false
|
||||
} );
|
||||
|
||||
$('#inQSO tbody').on( 'click', 'tr', function () {
|
||||
|
|
|
@ -185,7 +185,8 @@ function copyToQSO(callsign) {
|
|||
$(document).ready(function() {
|
||||
t_qso.row.add( [
|
||||
callsign,
|
||||
new Date().toUTCString()
|
||||
new Date().toUTCString(),
|
||||
""
|
||||
] ).draw();
|
||||
});
|
||||
alert("" + callsign + " added to in QSO-Tab");
|
||||
|
@ -198,10 +199,22 @@ function getCurrentTXing() {
|
|||
if (ts1TXing != null) {
|
||||
ts1 = ts1TXing.split(";");
|
||||
ts1[4] = Math.round((Date.now() - Date.parse(ts1timestamp.replace(" ","T")+".000Z"))/1000);
|
||||
t_qso.rows( function ( idx, data, node ) {
|
||||
if(data[0] == ts1[1]){
|
||||
data[2] = ts1timestamp;
|
||||
$('#inQSO').dataTable().fnUpdate(data,idx,undefined,false);
|
||||
}
|
||||
}).draw();
|
||||
}
|
||||
if (ts2TXing != null) {
|
||||
ts2 = ts2TXing.split(";");
|
||||
ts2[4] = Math.round((Date.now() - Date.parse(ts2timestamp.replace(" ","T")+".000Z"))/1000);
|
||||
t_qso.rows( function ( idx, data, node ) {
|
||||
if(data[0] == ts2[1]){
|
||||
data[2] = ts2timestamp;
|
||||
$('#inQSO').dataTable().fnUpdate(data,idx,undefined,false);
|
||||
}
|
||||
}).draw();
|
||||
}
|
||||
t_ct.clear().draw();
|
||||
if (ts1 != null) {
|
||||
|
|
73
logtailer.py
73
logtailer.py
|
@ -15,6 +15,14 @@ from urllib.parse import urlparse, parse_qs
|
|||
from ansi2html import Ansi2HTMLConverter
|
||||
from os import popen
|
||||
import psutil
|
||||
import functools
|
||||
from http import HTTPStatus
|
||||
|
||||
MIME_TYPES = {
|
||||
"html": "text/html",
|
||||
"js": "text/javascript",
|
||||
"css": "text/css"
|
||||
}
|
||||
|
||||
current_dir = os.getcwd()
|
||||
config = configparser.ConfigParser()
|
||||
|
@ -26,8 +34,42 @@ dmrids = {}
|
|||
logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO)
|
||||
conv = Ansi2HTMLConverter(inline=True)
|
||||
|
||||
@asyncio.coroutine
|
||||
def view_log(websocket, path):
|
||||
|
||||
async def process_request(sever_root, path, request_headers):
|
||||
"""Serves a file when doing a GET request with a valid path."""
|
||||
logging.info(request_headers)
|
||||
if "Upgrade" in request_headers:
|
||||
return # Probably a WebSocket connection
|
||||
|
||||
if path == '/':
|
||||
path = '/index.html'
|
||||
|
||||
response_headers = [
|
||||
('Server', 'asyncio websocket server'),
|
||||
('Connection', 'close'),
|
||||
]
|
||||
|
||||
# Derive full system path
|
||||
full_path = os.path.realpath(os.path.join(sever_root, "html/" + path[1:]))
|
||||
|
||||
# Validate the path
|
||||
if os.path.commonpath((sever_root, full_path)) != sever_root or \
|
||||
not os.path.exists(full_path) or not os.path.isfile(full_path):
|
||||
logging.info("HTTP GET {} 404 NOT FOUND".format(path))
|
||||
return HTTPStatus.NOT_FOUND, [], b'404 NOT FOUND'
|
||||
|
||||
# Guess file content type
|
||||
extension = full_path.split(".")[-1]
|
||||
mime_type = MIME_TYPES.get(extension, "application/octet-stream")
|
||||
response_headers.append(('Content-Type', mime_type))
|
||||
|
||||
# Read the whole file into memory and send it out
|
||||
body = open(full_path, 'rb').read()
|
||||
response_headers.append('Content-Length', str(len(body)))
|
||||
logging.info("HTTP GET {} 200 OK".format(path))
|
||||
return HTTPStatus.OK, response_headers, body
|
||||
|
||||
async def view_log(websocket, path):
|
||||
global config
|
||||
global dmrids
|
||||
logging.info('Connected, remote={}, path={}'.format(websocket.remote_address, path))
|
||||
|
@ -80,7 +122,7 @@ def view_log(websocket, path):
|
|||
target = target[0:target.index(",")]
|
||||
if target in dmrids:
|
||||
line = line.replace(target, dmrids[target])
|
||||
yield from websocket.send(line)
|
||||
await websocket.send(line)
|
||||
|
||||
while True:
|
||||
content = f.read()
|
||||
|
@ -104,9 +146,9 @@ def view_log(websocket, path):
|
|||
target = target[0:target.index(",")]
|
||||
if target in dmrids:
|
||||
line = line.replace(target, dmrids[target])
|
||||
yield from websocket.send(line)
|
||||
await websocket.send(line)
|
||||
else:
|
||||
yield from asyncio.sleep(0.2)
|
||||
await asyncio.sleep(0.2)
|
||||
elif path == "/SYSINFO":
|
||||
while True:
|
||||
cpu_temp = ""
|
||||
|
@ -137,13 +179,13 @@ def view_log(websocket, path):
|
|||
disk_used = str(disk.used / 2**30)
|
||||
disk_free = str(disk.free / 2**30)
|
||||
disk_percent_used = str(disk.percent)
|
||||
yield from websocket.send("SYSINFO: cputemp:" + cpu_temp + " cpufrg:" + cpufrq + " cpuusage:" + cpu_usage + " cpu_load1:" + cpu_load1 + " cpu_load5:" + cpu_load5 + " cpu_load15:" + cpu_load15 + " ram_total:" + ram_total + " ram_used:" + ram_used + " ram_free:" + ram_free + " ram_percent_used:" + ram_percent_used + " disk_total:" + disk_total + " disk_used:" + disk_used + " disk_free:" + disk_free + " disk_percent_used:" + disk_percent_used)
|
||||
yield from asyncio.sleep(10)
|
||||
await websocket.send("SYSINFO: cputemp:" + cpu_temp + " cpufrg:" + cpufrq + " cpuusage:" + cpu_usage + " cpu_load1:" + cpu_load1 + " cpu_load5:" + cpu_load5 + " cpu_load15:" + cpu_load15 + " ram_total:" + ram_total + " ram_used:" + ram_used + " ram_free:" + ram_free + " ram_percent_used:" + ram_percent_used + " disk_total:" + disk_total + " disk_used:" + disk_used + " disk_free:" + disk_free + " disk_percent_used:" + disk_percent_used)
|
||||
await asyncio.sleep(10)
|
||||
|
||||
except ValueError as e:
|
||||
try:
|
||||
yield from websocket.send('Logtailer-Errormessage: ValueError: {}'.format(e))
|
||||
yield from websocket.close()
|
||||
await websocket.send('Logtailer-Errormessage: ValueError: {}'.format(e))
|
||||
await websocket.close()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
@ -151,8 +193,8 @@ def view_log(websocket, path):
|
|||
|
||||
except Exception as e:
|
||||
try:
|
||||
yield from websocket.send('Logtailer-Errormessage: Error: {}'.format(e))
|
||||
yield from websocket.close()
|
||||
await websocket.send('Logtailer-Errormessage: Error: {}'.format(e))
|
||||
await websocket.close()
|
||||
except Exception:
|
||||
pass
|
||||
log_close(websocket, path, e)
|
||||
|
@ -169,11 +211,20 @@ def log_close(websocket, path, exception=None):
|
|||
|
||||
|
||||
def websocketserver():
|
||||
''' # set first argument for the handler to current working directory
|
||||
handler = functools.partial(process_request, os.getcwd())
|
||||
start_server = websockets.serve(view_log, config['DEFAULT']['Host'], config['DEFAULT']['Port'], process_request=handler)
|
||||
asyncio.get_event_loop().run_until_complete(start_server)
|
||||
message = 'Started Websocketserver at {}:{}'.format(config['DEFAULT']['Host'], config['DEFAULT']['Port'])
|
||||
logging.info(message)
|
||||
asyncio.get_event_loop().run_forever()
|
||||
'''
|
||||
start_server = websockets.serve(view_log, config['DEFAULT']['Host'], config['DEFAULT']['Port'])
|
||||
asyncio.get_event_loop().run_until_complete(start_server)
|
||||
asyncio.get_event_loop().run_forever()
|
||||
|
||||
|
||||
|
||||
def main():
|
||||
dmr_id_lookup = config['MMDVMHost']['DMR_ID_Lookup']
|
||||
dmr_id_lookupfile = config['MMDVMHost']['DMR_ID_LookupFile']
|
||||
|
|
Loading…
Reference in a new issue