#!/bin/bash -euE #!/bin/bash # Copyright (c) 2013 by Luke Shumaker # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # make sure XDG_CACHE_HOME is set . $(librelib conf.sh) # Usage: blacklist-normalize <$file # Normalizes the syntax of the blacklist on stdin blacklist-normalize() { sed -e 's/^[^:]*$/&::/' -e 's/^[^:]*:[^:]*$/&:/' } # Usage: blacklist-cat # Prints the blacklist. # Uses the chache, but downloads it if it doesn't exist. Also normalizes the # blacklist for easier parsing. blacklist-cat() { local file="$XDG_CACHE_HOME/libretools/blacklist.txt" if ! [[ -e $file ]]; then # exit on failure, whether set -e or not blacklist-update || return $? fi blacklist-normalize < "$file" } # Usage: blacklist-update # Updates (or creates) the cached copy of the blacklist blacklist-update() ( . libremessages load_files libretools || return 1 check_vars libretools BLACKLIST || return 1 local remote_blacklist="$BLACKLIST" local local_blacklist="$XDG_CACHE_HOME/libretools/blacklist.txt" stat_busy "Downloading blacklist of proprietary software packages" mkdir -p "${local_blacklist%/*}" if wget -N -q -O "${local_blacklist}.part" "$remote_blacklist" 2>/dev/null; then stat_done mv -f "${local_blacklist}.part" "$local_blacklist" else stat_done rm "${local_blacklist}.part" if [[ -e "$local_blacklist" ]]; then warning "Using local copy of blacklist" else error "Download failed, exiting" return 1 fi fi ) # Usage: blacklist-cat | blacklist-lookup $pkgname # Filters to obtain the line for $pkgname from the blacklist on stdin. # Exits successfully whether a line is found or not. blacklist-lookup() { local pkg=$1 # we accept that $pkg contains no regex-nes blacklist-normalize | grep "^$pkg:" || true } # Usage: blacklist-cat | blacklist-get-pkg # Prints only the package name field of the blacklist line(s) on stdin. blacklist-get-pkg() { blacklist-normalize | cut -d: -f1 } # Usage: blacklist-cat | blacklist-get-rep # Prints only the replacement package field of the blacklist line(s) on stdin. blacklist-get-rep() { blacklist-normalize | cut -d: -f2 } # Usage: blacklist-cat | blacklist-get-reason # Prints only the reason field of the blacklist line(s) on stdin. blacklist-get-reason() { blacklist-normalize | cut -d: -f3- } if [[ "${0##*/}" == libreblacklist ]]; then usage-outside() { sed -n '/^# Usage:/,/()/p' $0 | tr '\n' '\r' | sed 's/\s*()\s*[{(]/\n/g' } usage-inside() { sed 's/\r/\n/g'<<<"$1"|sed '/^$/d' } usage() { if [[ $# -eq 0 ]]; then printf "Usage: %s [-h] COMMAND [ARGUMENTS]\n" "${0##*/}" echo "Tool for working with the nonfree software blacklist" echo echo "Commands:" usage-outside | while read -r sec; do sec="$(usage-inside "$sec")" <<<"$sec" sed -n \ -e 's/blacklist-//g' \ -e 's/^# //' \ -e '2p;$p' | tac|tr '\n' '\t' echo done|column -t -s"$(printf '\t')"|sed 's/^/ /' else usage-outside | while read -r sec; do sec="$(usage-inside "$sec")" cmd=$(<<<"$sec" sed -n 's/.*blacklist[ -]//;$p') if [[ "$cmd" == "$1" ]]; then <<<"$sec" sed -n \ -e "s/blacklist-/${0##*/} /g" \ -e 's/^# //p' fi done fi } if [[ $# -eq 0 ]]; then usage >/dev/stderr exit 1 fi _blacklist_cmd=$1 shift if [[ $_blacklist_cmd == -h ]]; then usage "$@" else "blacklist-$_blacklist_cmd" "$@" fi fi