#!/bin/bash # pkgbuild-check-nonfree # Copyright 2010 Joshua Ismael Haase Hernández, Joseph Graham # Copyright 2012 Luke Shumaker # ---------- GNU General Public License 3 ---------- # This file is part of Parabola. # Parabola 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. # Parabola 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 Parabola. If not, see . . /etc/libretools.conf cmd=${0##*/} ev=0 # log_end() { # kill "$teepid" # rm "$logpipe" # } # log() { # local LOG="pkgbuild-check-nonfree-$(date -u +%Y%m%d).log" # # ensure overridden package variables survive tee with split packages # logpipe="$(mktemp)" # mkfifo "$logpipe" # tee "$LOG" < "$logpipe" & # teepid=$! # trap log_end ERR EXIT # } unset_pkgbuild() { unset 'pkgbase' 'pkgname' 'pkgver' 'pkgrel' 'epoch' 'pkgdesc' \ 'arch' 'url' 'license' 'groups' 'optdepends' 'provides' \ 'conflicts' 'replaces' 'backup' 'options' 'install' \ 'changelog' 'source' 'noextract' 'md5sums' 'build' \ 'check' 'package' 'depends' 'makedepends' 'checkdepends' } assert_pkgbuild() { if [ -e "$1" ]; then source "$1" if [ -n "${pkgname[0]}" ]; then return 0 # valid PKGBUILD fi fi error "$1 is not a valid PKGBUILD" return 1 } check_replacement() { [ $2 ] || return 0 # Free (not found) local needle=$1; shift local item local rep for line in $@; do local item="$(echo "$line" | cut -d':' -f1)" local rep="$(echo "$line" | cut -s -d':' -f2)" if [ "$item" == "$needle" ]; then if [ -z "$rep" ]; then return 15 # Nonfree (found) else echo "$rep" return 0 # Free (has replacement) fi fi done return 0 # Free (not found) } ## # Download the blacklist. ## get_blacklist() { mkdir -p "$XDG_CONFIG_HOME/libretools" pushd "$XDG_CONFIG_HOME/libretools" >/dev/null msg "Downloading the blacklist of proprietary software packages." if ! wget -N -q -O blacklist.txt "${BLACKLIST}" 2>/dev/null; then if [ -e "$XDG_CONFIG_HOME/libretools/blacklist.txt" ]; then warning "Using local copy of blacklist" else error "Download failed, exiting" fi fi popd > /dev/null } ## # Check wheter a package depends on non-free ## check_deps() { unset_pkgbuild if ! assert_pkgbuild "$1"; then exit 1 # not PKGBUILD fi msg2 "${pkgbase:-${pkgname[0]}} $pkgver $pkgrel ${epoch:-""}" # > "$logpipe" for pkg in "${pkgname[@]}" "${depends[@]}" "${makedepends[@]}" "${checkdepends[@]}"; do local lines=($(grep "$pkg" "$XDG_CONFIG_HOME/libretools/blacklist.txt" | tr " " "_")) local rep="$(check_replacement $pkg ${lines[@]})" local freedom=$? if [[ $freedom = 15 ]]; then warning "found $pkg" # > "$logpipe" ev=15 elif [ -n "$rep" ]; then if [ "$rep" = "$pkg" ]; then plain "$pkg is repackaged with the same name." # > "$logpipe" else plain "$pkg -> $rep" # > "$logpipe" fi fi done } usage() { # TODO: implement PKGBUILD arguments echo "Usage: $cmd [OPTIONS] [PKGBUILD1 PKGBUILD2 ...]" echo "" echo "If no PKGBUILD is specified, \`./PKGBUILD' is implied" echo "" echo "Options:" echo " -f Allow running as root user" echo " -h Show this message" } main() { local asroot=false while getopts 'fh' arg; do case "$arg" in f) asroot=true;; h) usage; exit 0;; *) usage; exit 1;; esac done shift $(($OPTIND - 1)) pkgbuilds=("$@") if [[ $# < 1 ]]; then pkgbuilds=("`pwd`/PKGBUILD") fi if [[ -w / ]] && ! $asroot; then error "Run as normal user" exit 1 fi get_blacklist # log msg "Looking for unfree dependencies" for p in "${pkgbuilds[@]}"; do if [[ -n "$p" ]]; then check_deps "$p" fi done return $ev } main "$@"