#!/bin/bash ################################################################################# # # # rh-upload # # Version - 0.3 # # Copyright (c) 2007 Red Hat, Inc. All rights reserved. # # # # # # Written by David Mair # # Cleanup and generalized for any kind of file by Olivier Arsac # # Idea stolen from Chris Snook :-) # # # # Purpose - To help in the automatic upload of files. # # Specifically, this script will compress, encrypt, md5sum, # # and upload the file automatically when invoked. # # Items are optional and specified by command line switch. # # ############################################################################### ## Global directives umask 0077 ## Declare some variables Date=`/bin/date -u +%G%m%d%k%M%S | /usr/bin/tr -d ' '` Destination="dropbox.redhat.com" function usage { cat <&2 } # echo unless in verbosity is too low function echov(){ local level="$1" shift if [[ $Verbose -ge "$level" ]]; then echo -e "$@"; fi } # Parse command line options (and perform some checks) function parse(){ if [ $# == 0 ]; then usage exit 0 fi TEMP=`getopt -o heuczqs:f:n --long help,encrypt,quiet,noupload,checksum,compress,split:,file: -n 'rh-upload' -- "$@"` if [ $? != 0 ]; then echo "Options error -- Terminating..." >&2 usage exit 1 fi eval set -- "$TEMP" Upload=1 Split=0 Verbose=1 Compress=0 Encrypt=0 Force=0 while true; do case "$1" in -h|--help) usage; exit 0;; -e|--encrypt) Encrypt=1; shift;; -N|--noupload) Upload=0; shift;; -c|--checksum) Checksum=1; shift;; -q|--quiet) Verbose=0; shift;; -z|--compress) Compress=1; shift;; -s|--split) case $2 in "") echoe "You must specify a hunk size."; exit 1 ;; *) Split=$2; shift 2;; esac ;; -F|--force) Force=1; shift;; -f|--file) case "$2" in "") echoe "You must specify a file name."; exit 1 ;; *) File=$2; shift 2;; esac ;; --) shift; break ;; *) echoe "Wrong options or flag specified"; usage; exit 1;; esac done # Ensure the -f||--file flag was passed or die if [ -z "$File" ]; then echoe "The -f or --file flag is required! Terminating." usage exit 1 fi # Validate the file exists or die if [ ! -f "$File" ]; then echoe "Invalid filename or file not found. Terminating." exit 1 fi File_dirname=${File%/*} File_basename=${File##*/} File_ext=${File_basename##*.} Src_file="$File" Dst_file="$File_basename" } function ticket(){ echov 1 echov 1 "We'll need to use your issue-tracker ticket number for a couple of things." echo -n "Please enter ticket number: " read Ticket_number Dst_file="${Ticket_number}-${Date}-${File_basename}" } # Compress the file function compress(){ if [ "$Compress" != 0 ]; then echov 1 "Starting file compression. This may take some time." # Begin compression of file if [ ! -x /usr/bin/gzip ]; then echoe "Cannot find gzip in /usr/bin/. Terminating." exit 1 else /usr/bin/gzip --fast "$Src_file" fi Src_file="${Src_file}.gz" Dst_file="${Dst_file}.gz" fi } # Encrypt the file function encrypt(){ if [ "$Encrypt" != 0 ]; then echov 1 "Encrypting file. This should only take a few minutes." if [ ! -x /usr/bin/openssl ]; then echoe "Cannot find openssl in /usr/bin. Terminating." exit 1 fi # Use the ticket number as the ssl keyfile name Key_file="${Ticket_number}-${Date}.key" /usr/bin/openssl rand -out "$Key_file" -base64 48 echov 1 "You have chosen to encrypt your file. Your passkey file is: $Key_file" echov 1 "Please attach this key to your ticket." /usr/bin/openssl aes-128-cbc -in $Src_file -out $Src_file.aes -pass file:"$Key_file" Src_file="$Src_file.aes" Dst_file="$Dst_file.aes" fi } function checksum(){ if [ "$Checksum" != 0 ]; then echov 1 "Cheksuming $Src_file... (This should only take a few minutes)" if [ ! -x /usr/bin/md5sum ]; then echoe "Cannot find md5sum in /usr/bin. Terminating." exit 1 fi MD5_file="${Ticket_number}-${Date}-checksum.out" MD5_result=`/usr/bin/md5sum "$Src_file" | awk '{print $1}'` echo "$MD5_result" > "$MD5_file" echov 1 "The MD5 checksum is $MD5_result (in $MD5_file)." fi } function split(){ if [ "$Split" -eq 0 ]; then return fi local hunk_size="$Split" if [[ "$hunk_size" -gt 0 ]] && [[ "$hunk_size" -lt 1001 ]]; then if [ ! -x /usr/bin/split ]; then echoe "Cannot find split in /usr/bin. Terminating." exit 1 fi Split_dir="${Ticket_number}-${Date}" # We need to make a directory to keep things sane echov 1 "Creating directory $Split_dir to house file hunks..." /bin/mkdir "$Split_dir" echov 1 "Splitting $Src_file..." /usr/bin/split -b "$hunk_size"m -d "$Src_file" "${Split_dir}/${Dst_file}" else echoe "Invalid hunk size argument. Please enter a number greater than 0 and less than 1001. Terminating." exit 1 fi } function upload(){ if [ "$Upload" -eq 0 ]; then echov 1 "All file operations are complete. The file(s) is ready to upload at your convenience." return fi echov 1 "The file(s) will now be uploaded." echo -n "Please enter the destination host (default is $Destination): " local destination_input read destination_input if [ "$destination_input" != "" ]; then Destination=$destination_input fi echov 1 echov 1 "Uploading to $Destination... (This could take quite a while)." if [ ! -x /usr/bin/lftp ]; then # No lftp installed echov 1 "lftp could not be found in /usr/bin. The file(s) will need to be uploaded manually." Ftp_res=255 else # Make the lftp script first local script="/tmp/rh-upload-lftp.$$" echo "lftp $Destination < $script echo "cd incoming" >> $script if [ "$Split" != 0 ]; then echo "lcd $Split_dir" >> $script echo "mirror -R" >> $script else echo "put $Src_file -o $Dst_file" >> $script fi echo "exit" >> $script echo "EOF" >> $script /usr/bin/lftp -f $script Ftp_res=$? fi } function closure(){ if [ "$Encrypt" != 0 ]; then echov 1 "## File was encrypted with key $Key_file." echov 1 "Please upload this key file to Issue Tracker or send it to your support representative for decryption after upload." fi if [ "$Checksum" != 0 ]; then echov 1 "## A checksum was performed on your file." echov 1 "The MD5 checksum is $MD5_result (in $MD5_file)." echov 1 "Please include this when updating your ticket so your support representative can verify the copy uploaded." fi if [ "$Split" != 0 ]; then echov 1 "## Your file was split and the hunks are in: $Split_dir/ " fi if [ -n "$Ftp_res" ] && [ "$Ftp_res" -eq 0 ]; then echov 1 "This script has completed successfully the upload." if [ "$Compress" != 0 ] || [ "$Split" != 0 ]; then echov 1 "You performed file encryption and/or file splitting." echov 1 "You may consider removing those temporary files." fi else echoe "Sorry unable to upload the files to $Destination. You may want to retry or do it manually." fi if [ "$Compress" != 0 ]; then echov 1 "It is NOT recommended to remove the gzipped copy of the file." echov 1 "This is the only remaining copy of the file on your system." echov 1 "It is recommended to retain the file until your support representative indicates that the problem has been identified and/or resolved." fi } function main(){ # Run through the functions parse $@ ticket compress encrypt checksum split upload closure } main $@