command to check errors on log locally

Change-Id: Ib29ab0013179db7e4be915a54ef1bf7f5a0e6d31
diff --git a/tools/test/bin/onos-check-logs-local b/tools/test/bin/onos-check-logs-local
new file mode 100755
index 0000000..7d60676
--- /dev/null
+++ b/tools/test/bin/onos-check-logs-local
@@ -0,0 +1,118 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Checks the logs of the local ONOS instance and makes sure they are clean.
+# -----------------------------------------------------------------------------
+
+function __usage() {
+cat << _EOM_
+usage: $(basename $0) [--old|--ignore-store-exceptions] [node]
+
+options:
+ --ignore-store-exceptions
+        if specified, any store service exceptions are ignored
+ --old
+        if specified, the entire logs are searched for errors and exceptions;
+        otherwise logs are scanned only from the last server start-up
+
+ node   the cluster node whose logs to inspect; default is \$OCI
+
+summary:
+ Checks the logs of the remote ONOS instance and makes sure they are clean.
+
+_EOM_
+}
+
+[ ! -d "$ONOS_ROOT" ] && echo "ONOS_ROOT is not defined" >&2 && exit 1
+. $ONOS_ROOT/tools/build/envDefaults
+
+# Process options
+while [ -z $opts ] ; do
+    case "$1" in
+    --ignore-store-exceptions) export ise=1; shift;;
+    --old) export allLogs=1; shift;;
+    --*) __usage && exit 1;;
+    -h)  __usage && exit 0;;
+    *) export opts=1;;
+    esac
+done
+
+remote=$ONOS_USER@${1:-$OCI}
+
+LOG=/tmp/onos-$ONOS_POM_VERSION/apache-karaf-$KARAF_VERSION/data/log/karaf.log*
+
+aux=/tmp/log.$$
+
+if [ -n "$allLogs" ]; then
+    egrep 'ERROR|Exception|Error' $LOG
+
+else
+        [ "uname" != 'Linux' ] && alias tac='tail -r'
+        tac $LOG | tr -d '\000' | awk -v ignoreStoreExceptions=${ise:-0} '
+            BEGIN { off = 0; fail = 0; exclusion = 0; expected = 0; trace = "";}
+            / org.apache.karaf.main.lock.SimpleFileLock lock/ {
+                exit fail;
+            }
+
+            # note: we are parsing log in reverse from the end
+            / EXPECTING_EXCEPTION_BEGIN/ {
+                print $0;
+                expected = 0;
+            }
+
+            / EXPECTING_EXCEPTION_END/ {
+                print $0;
+                expected = 1;
+            }
+
+            / ERROR / {
+                if (exception && !exclusion) {
+                    print $0;
+                    exception = 0;
+
+                    if (!expected) {
+                        fail = 1;
+                    }
+                }
+                exclusion = 0;
+            }
+            / WARN / {
+                if (exception && !exclusion) {
+                    print $0;
+                    exception = 0;
+                }
+                exclusion = 0;
+            }
+            / INFO / {
+                exception = 0;
+                exclusion = 0;
+            }
+
+            # Sanctioned exclusions for exceptions in the distributed stores; one pattern per exclusion
+            /org\.onosproject\.store\.service\..*Exception/ { exclusion = ignoreStoreExceptions;  }
+
+            /^[a-zA-Z0-9.]*(Exception|Error)/ {
+                if (!exclusion) {
+                    print trace;
+                    print $0;
+                    exception = 1;
+                    if (!expected) {
+                        fail = 1;
+                    }
+                    trace = "";
+                }
+            }
+
+            /(	at|Caused by:) / {
+                trace = trace "\n" $0;
+            }
+
+            # Sanctioned exclusions for exceptions in third-party code; one pattern per exclusion
+            /at org\.apache\.felix\.scr\.impl\.ComponentRegistry\.getComponents\(ComponentRegistry\.java:199\)/ { exclusion = 1; }
+            /at org\.apache\.karaf\.service\.guard\.impl\.GuardProxyCatalog.1.run\(GuardProxyCatalog\.java:253\)/ { exclusion = 1; }
+
+        END { exit fail; }
+        ' > $aux
+        status=$?
+        tac $aux && rm $aux
+        exit $status
+fi