diff options
author | bill-auger <mr.j.spam.me@gmail.com> | 2020-11-24 23:50:52 -0500 |
---|---|---|
committer | bill-auger <mr.j.spam.me@gmail.com> | 2021-01-05 22:24:56 -0500 |
commit | aed39fd252467d78d869ffcbc3c20073c9dac572 (patch) | |
tree | c783f5cd5fad2e8f3f6758001a78567a287d3c5a | |
parent | b3d871e4e82d372bbf8ad861248a5fd4f67c8ba4 (diff) |
[packages-by]: wip - improvements
-rwxr-xr-x[-rw-r--r--] | src/maintenance-tools/packages-by | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/src/maintenance-tools/packages-by b/src/maintenance-tools/packages-by index ea9071b..0837f99 100644..100755 --- a/src/maintenance-tools/packages-by +++ b/src/maintenance-tools/packages-by @@ -1,30 +1,46 @@ #!/bin/bash -readonly PACKAGESBY_USAGE="USAGE: packages-by [-d] [-s] <ARG>\n\tpass <ARG> to match against output lines of the form:\n\t\tPKGNAME ARCH/REPO YYYY-MM-DD-HH-MM NAME <EMAIL>\n\tpass arg: '-d' to sort by date\n\tpass arg: '-s' to show [SIGNATURE_NAME] in place of <EMAIL>" -readonly SHOULD_SORT=$( [[ "$1" == '-d' ]] && echo 1 || echo 0 ) ; [[ "$1" == '-d' ]] && shift ; -readonly SHOW_SIG_NAME=$( [[ "$1" == '-s' ]] && echo 1 || echo 0 ) ; [[ "$1" == '-s' ]] && shift ; -readonly SHOULD_SORT=$( [[ "$1" == '-d' ]] && echo 1 || echo $SHOULD_SORT ) ; [[ "$1" == '-d' ]] && shift ; -readonly SORT_CMD=$( (( $SHOULD_SORT )) && echo 'sort --key=3' || echo 'cat' ) -readonly TERM="$*" ; [[ -z "$TERM" ]] && echo -e ${PACKAGESBY_USAGE} && return 1 ; +readonly DEBUG=0 +readonly PACMAN_CONF_FILE=/etc/pacman-all.conf +readonly USAGE="USAGE:\n\tpackages-by [-d] [-n] <TERM>\n\nDESCRIPTION:\n\t<TERM> will be matched against expac output lines of the form:\n\t\tPKGNAME ARCH/REPO YYYY-MM-DD-HH:MM PACKAGER_NAME <PACKAGER_EMAIL> BASE64_SIG\n\nOPTIONS:\n\t-d -> sort by date\n\t-n -> show usage help" +readonly EXPAC_TIME_FMT='%Y-%m-%d-%R' +readonly EXPAC_FMT='%n %a/%r %b %p %g' +readonly KEYID_SED_CMD='s|.*([0-9A-F]{40})\)$|\1|p ; d' +# convenience lookup dict (login->email) # TODO: incomplete +declare -r -A HACKERS_EMAILS=( [bill-auger]='bill-auger@peers.community' \ + [oaken-source]='andreas@grapentin.org' ) -expac -S --config /etc/pacman.conf.all \ - --timefmt="%Y-%m-%d-%R" "%n %a/%r %b %p %g" | \ -grep $TERM | column -t | $SORT_CMD | \ +# collect CLI options +SHOULD_SORT=0 +while getopts 'dh' opt +do case ${opt} in + d) SHOULD_SORT=1 ;; + h) echo -e "${USAGE}" ;; + *) echo -e "Invalid argument\n${USAGE}" ; exit 1 ;; + esac +done +shift $(( OPTIND - 1 )) +readonly SHOULD_SORT +readonly SORT_CMD=$( (( SHOULD_SORT )) && echo 'sort --key=3' || echo 'cat' ) +readonly TERM="$*" ; [[ -z "${TERM}" ]] && echo -e "${USAGE}" && exit 1 ; + +(( DEBUG )) && echo -e "SHOULD_SORT=$SHOULD_SORT\nTERM=$TERM" >&2 + + +# collect results +expac -S --config ${PACMAN_CONF_FILE} --timefmt="${EXPAC_TIME_FMT}" "${EXPAC_FMT}" | \ +grep -E "${TERM}|${HACKERS_EMAILS[${TERM}]}" | column -t | ${SORT_CMD} | \ while read pkg_data_raw -do pkg_data=$( sed -E 's|(.+) <.*|\1| ' <<<$pkg_data_raw ) - email=$( sed -E 's|.+ <([^>]*)>.*|\1| ' <<<$pkg_data_raw ) - sig=$( sed -E 's|.+ ([^ ]+)|\1| ' <<<$pkg_data_raw ) +do pkg_data=$( sed -E 's|(.+) <.*|\1|' <<<${pkg_data_raw} ) + email=$( sed -E 's|.+ <([^>]*)>.*|\1|' <<<${pkg_data_raw} ) + sig=$( sed -E 's|.+ ([^ ]+)|\1|' <<<${pkg_data_raw} ) + key_id=$( base64 --decode <<<${sig} | gpg --list-packets | sed -E "${KEYID_SED_CMD}" ) - if (( $SHOW_SIG_NAME )) - then keyid=$( base64 --decode <<<$sig | gpg --list-packets | grep keyid | cut -d ' ' -f 6 ) - sig_name=$( pacman-key --list-keys $keyid 2> /dev/null | \ - grep -E '^uid .*] [^<]* <' | head -n 1 | \ - sed -E 's|^uid .*] ([^<]*) <.*|\1|' ) +(( DEBUG )) && echo -e "pkg_data=$pkg_data\nemail=$email\nsig=$sig\nkey_id=$key_id" >&2 - echo "$pkg_data [$sig_name]" - else echo "$pkg_data <$email>" - fi + echo "${pkg_data} <${email}> [${key_id}]" -# echo -en "\npkg=$pkg_data\nsig=$sig\nkeyid=$keyid\n$( (( $SHOW_SIG_NAME )) && echo "sig_name=$sig_name" || echo "email=$email" )" -done +(( DEBUG )) && break + +done | tee >(echo "($(wc -l)) packages") |