You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

134 lines
3.9 KiB

--- 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"