--- a/utils/aa-decode +++ b/utils/aa-decode @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # # Copyright (C) 2009-2010, 2012 Canonical Ltd. # Copyright (C) 2012 Christian Boltz @@ -16,8 +16,6 @@ # along with this program; if not, contact Canonical, Ltd. # -set -e - help() { cat < @@ -36,13 +34,15 @@ $ cat /var/log/kern.log | aa-decode EOM } -decode() { - if echo "$1" | egrep -q "^[0-9A-Fa-f]+$" ; then - python3 -c "import binascii; print(bytes.decode(binascii.unhexlify('$1'), errors='strict'));" - else - echo "" - fi +match_re() { + local result=$(echo "$1" | grep -E "$2" ) + [ -z "$result" ] && return 1 || return 0 +} + +decode() { + $(echo "$1" | egrep -q "^[0-9A-Fa-f]+$"); [ "$?" -eq 0 ] && + python3 -c "import binascii; print(bytes.decode(binascii.unhexlify('$1'), errors='strict'));" || echo "" } if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then @@ -51,47 +51,61 @@ if [ "$1" = "-h" ] || [ "$1" = "--help" fi # if have an argument, then use it, otherwise process stdin -if [ -n "$1" ]; then - e="$1" - if ! echo "$e" | egrep -q "^[0-9A-Fa-f]+$" ; then - echo "String should only contain hex characters (0-9, a-f, A-F)" - exit 1 - fi - - d=`decode $e` - if [ -z "$d" ]; then - echo "Could not decode string" - exit 1 - fi +[ -n "$1" ] && { - echo "Decoded: $d" - exit 0 -fi + e="$1" -# For now just look at 'name=...' and 'profile=...', -# so validate input against this and output based on it. -# TODO: better handle other cases too -while read line ; do + $(echo "$e" | egrep -q "^[0-9A-Fa-f]+$"); [ "$?" -ne 0 ] && { + echo "String should only contain hex characters (0-9, a-f, A-F)" + exit 1 + } - # check if line contains encoded name= or profile= - if [[ "$line" =~ \ (name|profile|proctitle)=[0-9a-fA-F] ]]; then + d=$(decode $e) - # cut the encoded filename/profile name out of the line and decode it - ne=`echo "$line" | sed 's/.* name=\([^ ]*\).*$/\\1/g'` - nd="$(decode ${ne/\'/\\\'})" + [ -z "$d" ] && { + echo "Could not decode string" + exit 1 + } - pe=`echo "$line" | sed 's/.* profile=\([^ ]*\).*$/\\1/g'` - pd="$(decode ${pe/\'/\\\'})" + echo "Decoded: $d" + exit 0 +} - pce=`echo "$line" | sed 's/.* proctitle=\([^ ]*\).*$/\\1/g'` - pcd="$(decode ${pce/\'/\\\'})" +[ -t 0 ] && { + help + exit +} + +while read line ; do - # replace encoded name and profile with its decoded counterparts (only if it was encoded) - test -n "$nd" && line="${line/name=$ne/name=\"$nd\"}" - test -n "$pd" && line="${line/profile=$pe/profile=\"$pd\"}" - test -n "$pcd" && line="${line/proctitle=$pce/proctitle=\"$pcd\"}" + # check if line contains encoded name= or profile= - fi + matches=0 + match_re "$line" "^[[:blank:]](name|profile|proctitle)=[0-9a-fA-F]+"; [ "$?" -eq 0 ] && matches=1 || { + match_re "$line" "^(name|profile|proctitle)=[0-9a-fA-F]+"; [ "$?" -eq 0 ] && matches=1 + } + + [ "$matches" -eq 0 ] || { + + # cut the encoded filename/profile name out of the line and decode it + ne=$(echo "$line" | sed 's/.* name=\([^ ]*\).*$/\\1/g') + [ "$line" = "$ne" ] && ne=$(echo "$line" | sed 's/.*name=\([^ ]*\).*$/\\1/g') + echo var: $ne + nd="$(decode ${ne/\'/\\\'})" + + pe=$(echo "$line" | sed 's/.* profile=\([^ ]*\).*$/\\1/g') + [ "$line" = "$pe" ] && pe=$(echo "$line" | sed 's/.*profile=\([^ ]*\).*$/\\1/g') + pd="$(decode ${pe/\'/\\\'})" + + pce=$(echo "$line" | sed 's/.* proctitle=\([^ ]*\).*$/\\1/g') + [ "$line" = "$pce" ] && pce=$(echo "$line" | sed 's/.*proctitle=\([^ ]*\).*$/\\1/g') + pcd="$(decode ${pce/\'/\\\'})" + + # replace encoded name and profile with its decoded counterparts (only if it was encoded) + test -n "$nd" && line="${line/name=$ne/name=\"$nd\"}" + test -n "$pd" && line="${line/profile=$pe/profile=\"$pd\"}" + test -n "$pcd" && line="${line/proctitle=$pce/proctitle=\"$pcd\"}" + } echo "$line"