#!/bin/sh # Sign files and upload them. scriptversion=2008-11-12.21 # Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation # # 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, 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 . # Originally written by Alexandre Duret-Lutz . set -e GPG='gpg --batch --no-tty' to= delete=false usage="Usage: $0 [OPTIONS]... FILES... Sign all FILES, and upload them to (or delete them from) selected destinations, according to . Options: --help print this help text and exit --to DEST specify one destination for FILES (multiple --to options are allowed) --user NAME sign with key NAME --delete delete FILES from destination instead of uploading --version output version information and exit Recognized destinations are: alpha.gnu.org:DIRECTORY savannah.gnu.org:DIRECTORY savannah.nongnu.org:DIRECTORY ftp.gnu.org:DIRECTORY build directive files and upload files by FTP [user@]host:DIRECTORY upload files with scp Deletion only works for ftp.gnu.org and alpha.gnu.org (using the archive: directive). Otherwise it is a no-op. Deleting a file foo also deletes foo.sig; do not specify the .sig explicitly. Simple single-target single-file examples: gnupload --to alpha.gnu.org:automake automake-1.8.2b.tar.gz gnupload --to ftp.gnu.org:automake automake-1.8.3.tar.gz gnupload --to alpha.gnu.org:automake --delete automake-oops.tar.gz Multiple-target multiple-file example: gnupload --to sources.redhat.com:~ftp/pub/automake \\ --to alpha.gnu.org:automake \\ automake-1.8.2b.tar.gz automake-1.8.2b.tar.bz2 Report bugs to . Send patches to ." while test -n "$1"; do case $1 in --delete) delete=true shift ;; --help) echo "$usage" exit $? ;; --to) if test -z "$2"; then echo "$0: Missing argument for --to" 1>&2 exit 1 else to="$to $2" shift 2 fi ;; --user) if test -z "$2"; then echo "$0: Missing argument for --user" 1>&2 exit 1 else GPG="$GPG --local-user $2" shift 2 fi ;; --version) echo "gnupload $scriptversion" exit $? ;; -*) echo "$0: Unknown option \`$1', try \`$0 --help'" 1>&2 exit 1 ;; *) break ;; esac done if test $# = 0; then echo "$0: No file to upload or delete" 1>&2 exit 1 else : fi if $delete; then :; else # Make sure all files exist. We don't want to ask # for the passphrase if the script will fail. for file do if test ! -f $file; then echo "$0: Cannot find \`$file'" 1>&2 exit 1 else : fi done fi # Make sure passphrase is not exported in the environment. unset passphrase # Reset PATH to be sure that echo is a built-in. We will later use # `echo $passphrase' to output the passphrase, so it is important that # it is a built-in (third-party programs tend to appear in `ps' # listings with their arguments...). # Remember this script runs with `set -e', so if echo is not built-in # it will exit now. PATH=/empty echo -n "Enter GPG passphrase: " stty -echo read -r passphrase stty echo echo # Nothing to sign if deleting. if $delete; then :; else for file do echo "Signing $file..." rm -f $file.sig echo $passphrase | $GPG --passphrase-fd 0 -ba -o $file.sig $file done fi for dest in $to do for file do # Prepare arguments. if $delete; then echo "Removing $file from $dest..." files= # nothing to upload if deleting directive="archive: $file" else echo "Uploading $file to $dest..." files="$file $file.sig" directive="filename: "`basename -- "$file"` fi destdir=`echo $dest | sed 's/[^:]*://'` case $dest in alpha.gnu.org:*) rm -f $file.directive $file.directive.asc cat >$file.directive<$file.directive<