#!/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) # 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 cache, 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' } # The output format of this is: # - The first line is "Usage:" # - The second line is a brief description # - The last line is the command name (prefixed with "blacklist-") # - The in-between lines are the extended description. usage-inside() { sed 's/\r/\n/g'<<<"$1"|sed -e '/^$/d' -e 's/^# //' } usage() { . $(librelib messages) if [[ $# -eq 0 ]]; then print "Usage: %s [-h] COMMAND [ARGUMENTS]" "${0##*/}" print "Tool for working with the nonfree software blacklist" echo print "Commands:" usage-outside | while read -r sec; do sec="$(usage-inside "$sec")" cmd=$(<<<"$sec" sed -n '$s/^blacklist-//p') desc="$(_ "$(sed -n 2p <<<"$sec")")" flag "$cmd" "${desc//blacklist-/${0##*/} }" done 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 '$d' | while read -r line; do print "$line"; done | sed "s/blacklist-/${0##*/} /g" | fmt -us return 0 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