#!/bin/bash -e

# if we start up as ./$0, assume we are running from a source
# checkout.
if [ `dirname $0` = "." ] && [ $PWD != "/usr/bin" ]; then
    known_hosts=../share/known_hosts_drop.ceph.com
    ssh_key=../share/id_dsa_drop.ceph.com
else
    known_hosts=/usr/share/ceph/known_hosts_drop.ceph.com
    ssh_key=/usr/share/ceph/id_dsa_drop.ceph.com
fi

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>  Description for this post
                      [Default: none]
  -u <user>         User identifier
                      [Default: \`whoami\`@\`hostname -f\`]
  -r <user@host>    Remote to upload to
                      [Default: postfile@drop.ceph.com]
  -k <path>         known_hosts file
                      [Default: /usr/share/ceph/known_hosts_drop.ceph.com]
  -i <path>         Ssh identity file
                      [Default: /usr/share/ceph/id_dsa_drop.ceph.com]
  -h                Show this usage information
"
}

if [ -z "$*" ]; then
    usage
    exit 1
fi

description=""
user="`whoami`@`hostname -f`"
remote="postfile@drop.ceph.com"
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="$1"
	shift
	shift
	;;
    -i)
	ssh_key="$1"
	shift
	shift
	;;
    -r | --remote)
	remote="$1"
	shift
	shift
	;;
esac

# 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

cp "$ssh_key" "$t4"
cp "${ssh_key}.pub" "$t4.pub"

sftp -i $t4 \
    -C \
    -oCheckHostIP=no \
    -oGlobalKnownHostsFile=$known_hosts \
    -oBatchMode=no \
    -b $t1 -- $remote

echo "$0: copy the upload id below to share with a dev:

ceph-post-file: $id
"
