--- 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 <<EOM
|
|
USAGE: aa-decode [OPTIONS] <encoded string>
|
|
@@ -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"
|
|
|