ceph/src/ceph-post-file.in
Alan Somers 3aae5ca6fd scripts: fix bash path in shebangs
/bin/bash is a Linuxism.  Other operating systems install bash to
different paths.  Use /usr/bin/env in shebangs to find bash.

Signed-off-by: Alan Somers <asomers@gmail.com>
2017-07-27 13:24:26 -06:00

178 lines
4.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -e
# If these files exist, assume we are a source install.
if [[ -f ../share/known_hosts_drop.ceph.com && -f ../share/id_rsa_drop.ceph.com ]]
then # running from source install
known_hosts=../share/known_hosts_drop.ceph.com
ssh_key=../share/id_rsa_drop.ceph.com
else # running from a pkg install
known_hosts=@datadir@/known_hosts_drop.ceph.com
ssh_key=@datadir@/id_rsa_drop.ceph.com
fi
function usage() {
echo "Usage: $0 [options] file1 [dir2 ...]
Easily upload files or directories to ceph.com for analysis by Ceph
developers.
Each invocation uploads files or directories to a separate directory
with a unique tag. That tag can be passed to a developer or
referenced in a bug report (http://tracker.ceph.com/). Once the
upload completes, the directory is marked non-readable and
non-writeable to prevent access or modification by other users.
WARNING:
Basic measures are taken to make posted data be visible only to
developers with access to ceph.com infrastructure. However, users
should think twice and/or take appropriate precautions before
posting potentially sensitive data (for example, logs or data
directories that contain Ceph secrets).
Options:
-d|--description <desc> Description for this post
[Default: none]
-u|--user <user> User identifier
[Default: \`whoami\`@\`hostname -f\`]
-r|--remote <user@host> Remote to upload to
[Default: postfile@drop.ceph.com]
-k|--known_hosts <path> known_hosts file
[Default: /usr/share/ceph/known_hosts_drop.ceph.com]
-i <path> Ssh identity file
[Default: /usr/share/ceph/id_rsa_drop.ceph.com]
-h|--help Show this usage information
"
}
if [ -z "$*" ]; then
usage
exit 1
fi
description=""
user="`whoami`@`hostname -f`"
remote="postfile@drop.ceph.com"
if [ `uname` = FreeBSD ]; then
GETOPT=/usr/local/bin/getopt
else
GETOPT=getopt
fi
ARGS=$(${GETOPT} -n "ceph-post-file" -o 'd:u:hk:i:r:' -l "description:,user:,help,known-hosts:,remote:" -- "$@")
eval set -- $ARGS
while true; do
echo "args: $@"
case $1 in
-d | --description)
description="$2"
shift
shift
;;
-u | --user)
user="$2"
shift
shift
;;
-h | --help)
usage
exit 0
;;
-k | --known-hosts)
known_hosts="$2"
shift
shift
;;
-i)
ssh_key="$2"
shift
shift
;;
-r | --remote)
remote="$2"
shift
shift
;;
--)
shift
break
;;
esac
done
# this id should be shared
id=`uuidgen`
echo "$0: upload tag $id"
# this is secret goop we add to the directory so that $id is not
# enough to find the data using the shared user; only ceph developers
# who have access to the server and can read the post directory can
# find the uploaded data.
nonce=`uuidgen`
# stick the user info in the dir too
dir="${id}_${user}_${nonce}"
t1=$(mktemp) || exit
t2=$(mktemp) || exit
t3=$(mktemp) || exit
t4=$(mktemp) || exit
trap "rm -f -- '$t1' '$t2' '$t3' '$t4'" EXIT
cat > $t1 <<EOF
mkdir post/$dir
cd post/$dir
EOF
echo "$0: user: $user"
cat > $t3 <<EOF
$user
EOF
echo put $t3 user >> $t1
if [ -n "$description" ]; then
echo "$0: description: $description"
cat > $t2 <<EOF
$description
EOF
echo put $t2 description >> $t1
fi
while [ -n "$*" ]; do
if [ -d "$1" ]; then
echo $0: will upload directory $1
bn=`basename "$1"`
cat >> $t1 <<EOF
mkdir $bn
put -r $1
EOF
else
echo $0: will upload file $1
cat >> $t1 <<EOF
put $1
EOF
fi
shift
done
# no UserKnownHostsFile so that we don't try to record the IP hash key
# GlobalKnownHostsFile so that we are verifying that this is the real drop.ceph.com
# IdentitiesOnly=yes forces sftp to ignore any keys offered by ssh-agent
cp "$ssh_key" "$t4"
cp "${ssh_key}.pub" "$t4.pub"
sftp -o "IdentityFile=$t4" \
-C \
-oCheckHostIP=no \
-oGlobalKnownHostsFile=$known_hosts \
-oBatchMode=no \
-oIdentitiesOnly=yes \
-b $t1 -- $remote
echo "$0: copy the upload id below to share with a dev:
ceph-post-file: $id
"