From fda030e5399323d5fe1a8b71d05ab1f5c3924921 Mon Sep 17 00:00:00 2001 From: Oleg Kalachev Date: Thu, 5 Sep 2019 20:45:00 +0300 Subject: [PATCH] clever.service: pipe all errors to /tmp/clever.err (#176) * clever.service: pipe all errors to /tmp/clever.err * clever.service: run with Bash * selfcheck: parse node errors and group them --- builder/assets/clever.service | 5 ++-- builder/image-software.sh | 1 - clever/src/selfcheck.py | 45 ++++++++++++++++------------------- 3 files changed, 24 insertions(+), 27 deletions(-) diff --git a/builder/assets/clever.service b/builder/assets/clever.service index 0c1776a7..b40678c8 100644 --- a/builder/assets/clever.service +++ b/builder/assets/clever.service @@ -5,8 +5,9 @@ After=network.target [Service] User=pi -ExecStart=/bin/sh -c ". /home/pi/catkin_ws/devel/setup.sh; \ - ROS_HOSTNAME=`hostname`.local exec roslaunch clever clever.launch --wait --screen --skip-log-check" +ExecStart=/bin/bash -c ". /home/pi/catkin_ws/devel/setup.sh; \ + ROS_HOSTNAME=`hostname`.local exec roslaunch clever clever.launch --wait --screen --skip-log-check \ + 2> >(tee /tmp/clever.err)" [Install] WantedBy=multi-user.target diff --git a/builder/image-software.sh b/builder/image-software.sh index 882cf6e6..9e56b55c 100755 --- a/builder/image-software.sh +++ b/builder/image-software.sh @@ -107,7 +107,6 @@ espeak espeak-data python-espeak \ ntpdate \ python-dev \ python3-dev \ -python-systemd \ mjpg-streamer=2.0 \ && echo_stamp "Everything was installed!" "SUCCESS" \ || (echo_stamp "Some packages wasn't installed!" "ERROR"; exit 1) diff --git a/clever/src/selfcheck.py b/clever/src/selfcheck.py index 8aaebb18..4ab7145b 100755 --- a/clever/src/selfcheck.py +++ b/clever/src/selfcheck.py @@ -12,6 +12,7 @@ import math import subprocess import re +from collections import OrderedDict import traceback from threading import Event import numpy @@ -631,32 +632,28 @@ def check_clever_service(): elif 'failed' in output: failure('service failed to run, check your launch-files') + r = re.compile(r'^(.*)\[(FATAL|ERROR)\] \[\d+.\d+\]: (.*?)(\x1b(.*))?$') + error_count = OrderedDict() try: - from systemd import journal - except ImportError: - failure('no python-systemd package, not the Clever image?') - return + for line in open('/tmp/clever.err', 'r'): + node_error = r.search(line) + if node_error: + msg = node_error.groups()[1] + ': ' + node_error.groups()[2] + if msg in error_count: + error_count[msg] += 1 + else: + error_count.update({msg: 1}) + else: + error_count.update({line.strip(): 1}) - j = journal.Reader() - j.this_boot() - j.add_match(_SYSTEMD_UNIT='clever.service') - j.add_disjunction() - j.add_match(UNIT='clever.service') - node_errors = [] - r = re.compile(r'^(.*)\[(FATAL|ERROR)\] \[\d+.\d+\]: (.*)$') - for event in reversed(list(j)): - msg = event['MESSAGE'] - if 'Started Clever ROS package' in msg: - break # we're done - elif ('[ERROR]' in msg) or ('[FATAL]' in msg): - msg = r.search(msg).groups()[2] - if msg in node_errors: - continue - node_errors.append(msg) - elif ('ERROR: ' in msg) or ('while processing' in msg) or ('Invalid roslaunch XML syntax' in msg): - node_errors.append(msg) - for error in reversed(node_errors): - failure(error) + for error in error_count: + if error_count[error] == 1: + failure(error) + else: + failure('%s (%d)', error, error_count[error]) + + except IOError as e: + failure('%s', e) @check('Image')