aboutsummaryrefslogtreecommitdiffstats
path: root/extras/rh-upload
blob: 75a86f43fac3b7106fc0afaab5d7534abb841937 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
#!/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 <<EOF
rh-upload [-cehnNq] [-s size of hunks in MB] -f filename
  rh-upload automates the upload of files to the Red Hat ftp.
  The script helps the user to compress, checksum, encrypt and upload a file.
  -c|--checksum  : perform an md5 checksum on the file
  -e|--encrypt   : encrypt the file
  -f|--file      : file to act on (required)
  -h|--help      : show this usage help
  -z|--compress  : compress the file
  -n|--noupload  : Do NOT upload 
  -q|--quiet     : Do everything I ask and do it quietly
  -s|--split     : split file into small hunks

EOF
}


# echo to stderr
function echoe(){
  echo -e "$@" 1>&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 <<EOF" > $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 $@