├── README.md ├── take ├── givemessage ├── giveusers ├── give └── givegroup /README.md: -------------------------------------------------------------------------------- 1 | giveandtake 2 | =========== 3 | 4 | Give and Take Command at NERSC 5 | 6 | 7 | Versions 8 | -------- 9 | 10 | give/take: Standard give & take. (Give to one user, take based on username). 11 | 12 | givemessage: give + quiet and message modes. 13 | Includes options to not send an notification email (-q) 14 | or add a message to the notification email (-m ""). 15 | 16 | giveusers: givemessage + can give to multiple users 17 | 18 | e.g. give -u userA -u userB -u userC -u userD .... 19 | 20 | Sends files to all users up to a specified limit. Checks for and 21 | ignores invalid users and duplicated usernames. Sends same 22 | notification email (or no email) to all users. 23 | 24 | givegroup: givegroup + can give to permissions groups 25 | 26 | e.g. give -u userA -g groupA -u userB -g groupB -g groupC 27 | 28 | Sends to all specified users in users in permissions groups up to 29 | a specified global limit. If combined number of users is 30 | exceeded, give exits. Checks for an ignores invalid users and 31 | duplicated usernames to allow overlapping permissions groups. 32 | -------------------------------------------------------------------------------- /take: -------------------------------------------------------------------------------- 1 | #!/bin/bash -i 2 | 3 | #echo "Give and Take is migrating due to Global Scratch Retirement. We'll be back soon" 4 | #exit 1 5 | 6 | # Sanitize environment. Shouldnt be needed with -i 7 | 8 | destfoler="" 9 | giver="" 10 | temp="" 11 | allflag="" 12 | listflag="" 13 | current_dir="" 14 | user="" 15 | giver_dir="" 16 | var="" 17 | owner="" 18 | PATH="" 19 | LD_LIBRARY_PATH="" 20 | unset IFS 21 | 22 | # Implementation Definitions 23 | #SPOOLAREA=/global/scratch2/gt 24 | SPOOLAREA=/project/projectdirs/gt 25 | 26 | # Get Hostname 27 | myhost=`/usr/common/usg/bin/nersc_host` 28 | # 29 | if [ "$myhost" == "genepool" ]; then 30 | mylogger="/usr/bin/logger" 31 | else 32 | mylogger="/bin/logger" 33 | fi 34 | 35 | # Get user's Name 36 | user=`/usr/bin/whoami` 37 | current_dir=`/bin/pwd` 38 | destfolder="$current_dir" 39 | 40 | allflag="no" 41 | listflag="no" 42 | 43 | while getopts ":u:d:al" opt; do 44 | case $opt in 45 | u) 46 | giver="$OPTARG" 47 | ;; 48 | d) 49 | destfolder="$OPTARG" 50 | if [ ! -d $destfolder ]; then 51 | echo "$destfolder not a directory" 52 | exit 1 53 | fi 54 | ;; 55 | a) 56 | allflag="yes" 57 | ;; 58 | l) 59 | listflag="yes" 60 | ;; 61 | \?) 62 | echo "Usage: " 63 | echo "See available files from user: take -u " 64 | echo "Take one file from user: take -u -d " 65 | echo "Take all files from user: take -u -d -a" 66 | echo "-d is an optional flag" 67 | echo "" 68 | exit 1 69 | ;; 70 | :) 71 | echo "Option -$OPTARG requires an argument." 72 | exit 1 73 | ;; 74 | esac 75 | done 76 | 77 | echo "" 78 | if [ -z "$giver" ] 79 | then 80 | if [ "$listflag" != "yes" ] 81 | then 82 | echo "Usage: " 83 | echo "See available files from user: take -u " 84 | echo "Take one file from user: take -u -d " 85 | echo "Take all files from user: take -u -d -a" 86 | echo "-d is an optional flag" 87 | echo "" 88 | fi 89 | 90 | # This might be slow. So it is optional 91 | if [ "$listflag" == "yes" ] 92 | then 93 | echo "Checking for available files. This may take a minute." 94 | filesavail="none" 95 | for giver_dir in "$SPOOLAREA"/*/"$user" 96 | do 97 | giver=${giver_dir%/*} 98 | giver=${giver##*/} 99 | if [ "$(/bin/ls -A $giver_dir 2> /dev/null)" ]; then 100 | echo "Files available to you from $giver:" 101 | cd "$giver_dir" 102 | /usr/bin/du -sh --time * 103 | cd "$current_dir" 104 | echo "" 105 | filesavail="some" 106 | fi 107 | done 108 | #echo "done check" 109 | if [ "$filesavail" == "none" ] 110 | then 111 | echo "No files available to you." 112 | fi 113 | fi 114 | else 115 | shift $(( OPTIND-1 )) 116 | 117 | # Check For Valid Giver 118 | # This is checked implicitly below that giver directory exists 119 | # temp=`/usr/bin/id "$giver" 2>&1` 120 | # if [ $? -ne 0 ]; then 121 | # echo "$giver does not exist" 122 | # exit 1 123 | # fi 124 | 125 | if [ ! -d "$SPOOLAREA/$giver" ]; then 126 | echo "$giver does not exist" 127 | exit 1 128 | fi 129 | 130 | if [ "$allflag" == "yes" ] 131 | then 132 | if [ "$(/bin/ls -A $SPOOLAREA/$giver/$user/ 2> /dev/null)" ]; then 133 | cd "$destfolder" 134 | for var in "$SPOOLAREA/$giver/$user/"* 135 | do 136 | owner=`/usr/bin/stat -c %U "$var"` 137 | if [ "$owner" != "$giver" -a "$giver" != "ftpup" ] 138 | then 139 | echo "Owner of $var, $owner, does not match $giver. Something nasty could be going on!" 140 | exit 1 141 | fi 142 | # We remove the file once transfer is complete. We could in the future let purger handle this. 143 | if [ -a ${var##*/} ] 144 | then 145 | echo "File ${var##*/} already exists at destination. Overwrite?" 146 | select yn in "Yes" "No"; do 147 | case $yn in 148 | Yes ) /usr/bin/rsync --progress --remove-sent-files --no-p --no-g --chmod=ugo=rwX --log-format="Taking ${var##*/}" "$var" . ; echo "Took ${var##*/}" ; echo ""; break;; 149 | No ) break;; 150 | esac 151 | done 152 | else 153 | /usr/bin/rsync --progress --remove-sent-files --no-p --no-g --chmod=ugo=rwX --log-format="Taking ${var##*/}" "$var" . 154 | echo "Took ${var##*/}" 155 | $mylogger "$user took ${var##*/}" 156 | echo "" 157 | fi 158 | done 159 | cd "$current_dir" 160 | else 161 | echo "No files available from $giver" 162 | echo "" 163 | fi 164 | else 165 | if [ -n "$1" ] 166 | then 167 | cd $destfolder 168 | for var in "$@" 169 | do 170 | if [ -a "$SPOOLAREA/$giver/$user/$var" ] 171 | then 172 | owner=`/usr/bin/stat -c %U "$SPOOLAREA/$giver/$user/$var"` 173 | if [ "$owner" != "$giver" -a "$giver" != "ftpup" ] 174 | then 175 | echo "Owner of $var, $owner, does not match $giver. Something nasty could be going on!" 176 | exit 1 177 | fi 178 | if [ -a "$var" ] 179 | then 180 | echo "File $var already exists at destination. Overwrite?" 181 | select yn in "Yes" "No"; do 182 | case $yn in 183 | Yes ) /usr/bin/rsync --progress --log-format="Taking $var" --no-p --no-g --chmod=ugo=rwX --remove-sent-files "$SPOOLAREA/$giver/$user/$var" . ; echo "Took $var" ; echo ""; break;; 184 | No ) break;; 185 | esac 186 | done 187 | else 188 | /usr/bin/rsync --progress --remove-sent-files --log-format="Taking $var" --no-p --no-g --chmod=ugo=rwX "$SPOOLAREA/$giver/$user/$var" . 189 | echo "Took $var" 190 | $mylogger "$user took $var" 191 | echo "" 192 | fi 193 | else 194 | echo "No file $var available from $giver" 195 | fi 196 | done 197 | cd $current_dir 198 | else 199 | giver_dir="$SPOOLAREA/$giver/$user" 200 | if [ "$(/bin/ls -A $giver_dir 2> /dev/null)" ]; then 201 | echo "Files available from $giver:" 202 | cd "$giver_dir" 203 | /usr/bin/du -sh --time * 204 | cd $current_dir 205 | echo "" 206 | else 207 | echo "No files available from $giver" 208 | echo "" 209 | fi 210 | fi 211 | fi 212 | fi 213 | 214 | exit 0 215 | -------------------------------------------------------------------------------- /givemessage: -------------------------------------------------------------------------------- 1 | #!/bin/bash -i 2 | 3 | # Give is a command to share files with other users. It requires a spool area. 4 | # 5 | 6 | # Clean and unset vars. We now also use -i above. 7 | giver="" 8 | user="" 9 | emailmessage="" 10 | messagebody="" 11 | SUBJECT="" 12 | EMAIL="" 13 | tmpdir="" 14 | parentdir="" 15 | dir2tar="" 16 | current_dir="" 17 | PATH="" 18 | LD_LIBRARY_PATH="" 19 | unset IFS 20 | my_date=`/bin/date +%s` 21 | quietflag="false" 22 | messageflag="false" 23 | batchflag="no" 24 | 25 | # Implementation Definitions 26 | #SPOOLAREA=/global/scratch2/gt 27 | SPOOLAREA=/project/projectdirs/gt 28 | 29 | # Get Giver's Name 30 | giver=`/usr/bin/whoami` 31 | 32 | # Get Hostname 33 | myhost=`/usr/common/usg/bin/nersc_host` 34 | #echo $myhost 35 | 36 | if [ "$myhost" == "genepool" ]; then 37 | myreadlink="/bin/readlink" 38 | mylogger="/usr/bin/logger" 39 | mymail="/usr/bin/mail" 40 | else 41 | myreadlink="/usr/bin/readlink" 42 | mylogger="/bin/logger" 43 | mymail="/bin/mail" 44 | fi 45 | 46 | # Make sure scratch is available and giver has directory 47 | if [ ! -d "$SPOOLAREA/$giver" ]; then 48 | echo "$giver has no mounted give area" 49 | exit 1 50 | fi 51 | 52 | # Catch odd directories 53 | current_dir=`/bin/pwd` 54 | 55 | while getopts ":u:m:bq" opt; do 56 | case $opt in 57 | u) 58 | user="$OPTARG" 59 | ;; 60 | m) 61 | messageflag="true" 62 | emailmessage="$OPTARG" 63 | ;; 64 | b) 65 | batchflag="yes" 66 | ;; 67 | q) 68 | quietflag="true" 69 | ;; 70 | \?) 71 | echo "" 72 | echo "Usage: give {-q -b -m \"\"} -u " 73 | echo " -u is a required option" 74 | echo "" 75 | echo " -q, -m and -b are optional flags" 76 | echo "" 77 | echo " -q: Quiet mode. Will not send an email to the recipient. Cannot be used with -m." 78 | echo " -m: Message. Will add a message to the give email. Use '\n' to start a new line. Cannot be used with -q." 79 | echo " -b: Batch mode. Automatically appends time/date stamp to files with the same name as any previous, unretrieved give." 80 | echo " Without -b: Will query overwrite or abort." 81 | echo "" 82 | exit 1 83 | ;; 84 | :) 85 | echo "Option -$OPTARG requires an argument." 86 | exit 1 87 | ;; 88 | esac 89 | done 90 | 91 | if [ -z "$user" ] 92 | then 93 | echo "" 94 | echo "Usage: give {-q -b -m \"\"} -u " 95 | echo " -u is a required option." 96 | echo "" 97 | echo " -q, -m and -b are optional flags" 98 | echo "" 99 | echo " -q: Quiet mode. Will not send an email to the recipient. Cannot be used with -m." 100 | echo " -m: Message. Will add a message to the give email. Use '\n' to start a new line. Cannot be used with -q." 101 | echo " -b: Batch mode. Automatically appends time/date stamp to files with the same name as any previous, unretrieved give." 102 | echo " Without -b: Will query overwrite or abort." 103 | echo "" 104 | exit 1 105 | fi 106 | 107 | # Check for both message and quiet flag. 108 | # Obviously won't do what the user thinks, so exit. 109 | if [ "$quietflag" == "true" ] && [ "$messageflag" == "true" ]; then 110 | echo "Cannot send a message in quiet mode. Please choose one and try again." 111 | exit 1 112 | fi 113 | 114 | # Check For Valid User 115 | temp=`/usr/bin/id -u "$user" 2>&1` 116 | if [ $? -ne 0 ] || [ "$user" == "$temp" ]; 117 | then 118 | echo "$user" does not exist 119 | exit 1 120 | fi 121 | shift $(( OPTIND-1 )) 122 | 123 | if [ -n "$1" ] 124 | then 125 | 126 | # Make sure the giveandtake directory is created 127 | # and set perms on giver/receiver gt directory here. 128 | 129 | /bin/mkdir -p "$SPOOLAREA/$giver/$user" 130 | /usr/bin/setfacl -R -d -m u:$user:rwx,g::---,m::rwx "$SPOOLAREA/$giver/$user" 131 | /usr/bin/setfacl -R -m u:$user:rwx,g::---,m::rwx "$SPOOLAREA/$giver/$user" 132 | 133 | for var in "$@" 134 | do 135 | 136 | # Check Size and Number Limitation?? 137 | # Not implemented currently. Doing du on a directory 138 | # takes time... 139 | 140 | # Check sanity of $var 141 | if [ -d "$var" ]; then 142 | echo "" 143 | elif [ -a "$var" ]; then 144 | echo "" 145 | else 146 | echo "$var does not exist" 147 | exit 1 148 | fi 149 | 150 | my_var="$var" 151 | if [ "$myhost" == "genepool" ]; then 152 | my_short_var=`/usr/bin/basename "$var"` 153 | else 154 | my_short_var=`/bin/basename "$var"` 155 | fi 156 | 157 | # Copy file over. Create .tar archive if directory. 158 | 159 | # Below ${var%/} deletes a trailing slash from $var 160 | # ${my_var##*/} deletes longest match of "*/" from front $var (i.e. deletes the path) 161 | 162 | # Check, Is this a directory? 163 | if [ -d "$var" ]; then 164 | # Create .tar from directory 165 | my_var=${var%/}.tar 166 | my_var=${my_var##*/} 167 | tmpdir=${var%/} 168 | parentdir=`/usr/bin/dirname "$tmpdir"` 169 | dir2tar=${tmpdir##*/} 170 | echo "Creating tar archive from directory $var" 171 | cd "$parentdir" 172 | if [ -a "$SPOOLAREA/$giver/$user/$my_var" ] 173 | then 174 | if [ "$batchflag" == "no" ] 175 | then 176 | echo "File $my_var already exists at destination. Overwrite?" 177 | select yn in "Yes" "No"; do 178 | case $yn in 179 | Yes ) 180 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 181 | if [ $? -eq 0 ] 182 | then 183 | messagebody="$messagebody \n $my_var" 184 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 185 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 186 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 187 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 188 | echo "Gave $my_var." 189 | else 190 | echo "Failed to give $my_var. Removing any incomplete files." 191 | # Remove incomplete give 192 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 193 | fi 194 | break;; 195 | No ) echo " " ; break;; 196 | esac 197 | done 198 | else 199 | my_var="${my_date}_${my_var}" 200 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 201 | if [ $? -eq 0 ] 202 | then 203 | messagebody="$messagebody \n $my_var" 204 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 205 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 206 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 207 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 208 | echo "Gave $my_var." 209 | else 210 | echo "Failed to give $my_var. Removing any incomplete files." 211 | # Remove incomplete give 212 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 213 | fi 214 | fi 215 | else 216 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 217 | if [ $? -eq 0 ] 218 | then 219 | messagebody="$messagebody \n $my_var" 220 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 221 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 222 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 223 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 224 | echo "Gave $my_var." 225 | else 226 | echo "Failed to give $my_var. Removing any incomplete files." 227 | # Remove incomplete give 228 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 229 | fi 230 | fi 231 | cd "$current_dir" 232 | echo " " 233 | # This is a file not a directory 234 | else 235 | if [ -a "$SPOOLAREA/$giver/$user/$my_short_var" ] 236 | then 237 | if [ "$batchflag" == "no" ] 238 | then 239 | echo "File $var already exists at destination. Overwrite?" 240 | select yn in "Yes" "No"; do 241 | case $yn in 242 | Yes ) 243 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 244 | if [ $? -eq 0 ] 245 | then 246 | messagebody="$messagebody \n $my_short_var" 247 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 248 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 249 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 250 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$var'`" 251 | echo "Gave $var" 252 | else 253 | echo "Failed to give $var. Removing incomplete file." 254 | # Remove incomplete give 255 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 256 | fi 257 | echo " " 258 | break;; 259 | No ) echo " " ; break;; 260 | esac 261 | done 262 | else 263 | my_short_var="${my_date}_${my_short_var}" 264 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user/$my_short_var" 265 | if [ $? -eq 0 ] 266 | then 267 | messagebody="$messagebody \n $my_short_var" 268 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 269 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 270 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 271 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$var'`" 272 | echo "Gave $var" 273 | else 274 | echo "Failed to give $var. Removing incomplete file." 275 | # Remove incomplete give 276 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 277 | fi 278 | echo " " 279 | fi 280 | else 281 | echo "About to give $var" 282 | echo /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 283 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 284 | if [ $? -eq 0 ] 285 | then 286 | messagebody="$messagebody \n $my_short_var" 287 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 288 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 289 | echo "Gave $var" 290 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 291 | $mylogger "`/bin/date` - giveandtake $giver gave $user `/$myreadlink -f '$var'`" 292 | else 293 | echo "Failed to give $var. Removing incomplete file." 294 | # Remove incomplete give 295 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 296 | fi 297 | echo " " 298 | fi 299 | fi 300 | 301 | done 302 | 303 | # Email user if not in quiet mode 304 | if [ "$quietflag" == "false" ]; then 305 | 306 | if [ -z "$messagebody" ] 307 | then 308 | echo "No files given" 309 | else 310 | messagebody="Shared Files: $messagebody" 311 | messagebody="$messagebody \n\n Retrieve individual files using the take command and providing $giver as the username (-u) argument." 312 | if [ "$messageflag" == "true" ]; then 313 | messagebody="$emailmessage \n\n $messagebody" 314 | fi 315 | # For security we no longer suggests users cut and paste from email 316 | #messagebody="$messagebody \n\n % take -u $giver " 317 | #messagebody="$messagebody \n\n Retrieve all files given by $giver using:" 318 | #messagebody="$messagebody \n\n % take -u $giver -a" 319 | 320 | # Email user 321 | 322 | # EMAIL subject 323 | SUBJECT="$giver has given you a file at NERSC." 324 | # Email To ? 325 | EMAIL="$user@nersc.gov" 326 | # Email From ? 327 | FROM="$giver@nersc.gov" 328 | # send an email using /bin/mail 329 | if [ "$myhost" == "datatran" ]; then 330 | echo -e "$messagebody" | $mymail -r "$FROM" -s "$SUBJECT" "$EMAIL" 331 | else 332 | echo -e "$messagebody" | $mymail -s "$SUBJECT" "$EMAIL" -- -f "$FROM" 333 | fi 334 | fi 335 | fi 336 | 337 | else 338 | echo "No file arguments given." 339 | fi 340 | 341 | exit 0 342 | -------------------------------------------------------------------------------- /giveusers: -------------------------------------------------------------------------------- 1 | #!/bin/bash -i 2 | 3 | # Give is a command to share files with other users. It requires a spool area. 4 | # 5 | 6 | # Administrative variables: userlimit per give and permissions group blacklist 7 | userlimit=5 8 | 9 | # Clean and unset vars. We now also use -i above. 10 | giver="" 11 | user="" 12 | userlist=() 13 | tempuserlist=() 14 | emailmessage="" 15 | messagebody="" 16 | SUBJECT="" 17 | EMAIL="" 18 | tmpdir="" 19 | parentdir="" 20 | dir2tar="" 21 | current_dir="" 22 | PATH="" 23 | LD_LIBRARY_PATH="" 24 | unset IFS 25 | my_date=`/bin/date +%s` 26 | quietflag="false" 27 | messageflag="false" 28 | batchflag="no" 29 | 30 | # Implementation Definitions 31 | #SPOOLAREA=/global/scratch2/gt 32 | SPOOLAREA=/project/projectdirs/gt 33 | 34 | # Get Giver's Name 35 | giver=`/usr/bin/whoami` 36 | 37 | # Get Hostname 38 | myhost=`/usr/common/usg/bin/nersc_host` 39 | #echo $myhost 40 | 41 | if [ "$myhost" == "genepool" ]; then 42 | myreadlink="/bin/readlink" 43 | mylogger="/usr/bin/logger" 44 | mymail="/usr/bin/mail" 45 | else 46 | myreadlink="/usr/bin/readlink" 47 | mylogger="/bin/logger" 48 | mymail="/bin/mail" 49 | fi 50 | 51 | # Make sure scratch is available and giver has directory 52 | if [ ! -d "$SPOOLAREA/$giver" ]; then 53 | echo "$giver has no mounted give area" 54 | exit 1 55 | fi 56 | 57 | # Catch odd directories 58 | current_dir=`/bin/pwd` 59 | 60 | while getopts ":u:m:bq" opt; do 61 | case $opt in 62 | u) 63 | userlist+=("$OPTARG") 64 | ;; 65 | m) 66 | messageflag="true" 67 | emailmessage="$OPTARG" 68 | ;; 69 | b) 70 | batchflag="yes" 71 | ;; 72 | q) 73 | quietflag="true" 74 | ;; 75 | \?) 76 | echo "" 77 | echo "Usage, simple: give -u {-u ... } " 78 | echo " -u is a required option" 79 | echo " Can be used multiple times to give the to up to $userlimit users." 80 | echo "" 81 | echo "" 82 | echo "Usage, verbose: give {-q -b -m \"\"} -u {-u ... } " 83 | echo " -q, -m and -b are optional flags" 84 | echo "" 85 | echo " -q: Quiet mode. Will not send an email to the recipient. Cannot be used with -m." 86 | echo " -m: Message. Will add a message to the give email. Use '\n' to start a new line. Cannot be used with -q." 87 | echo " -b: Batch mode. Automatically appends time/date stamp to files with the same name as any previous, unretrieved give." 88 | echo " Without -b: Will query overwrite or abort." 89 | echo "" 90 | exit 1 91 | ;; 92 | :) 93 | echo "Option -$OPTARG requires an argument." 94 | exit 1 95 | ;; 96 | esac 97 | done 98 | 99 | # Check if userlist is empty 100 | if [ ${#userlist[@]} -eq 0 ] 101 | then 102 | echo "" 103 | echo "Usage, simple: give -u {-u ... } " 104 | echo " -u is a required option" 105 | echo " Can be used multiple times to give the to up to $userlimit users." 106 | echo "" 107 | echo "" 108 | echo "Usage, verbose: give {-q -b -m \"\"} -u {-u ... } " 109 | echo " -q, -m and -b are optional flags" 110 | echo "" 111 | echo " -q: Quiet mode. Will not send an email to the recipient. Cannot be used with -m." 112 | echo " -m: Message. Will add a message to the give email. Use '\n' to start a new line. Cannot be used with -q." 113 | echo " -b: Batch mode. Automatically appends time/date stamp to files with the same name as any previous, unretrieved give." 114 | echo " Without -b: Will query overwrite or abort." 115 | echo "" 116 | exit 1 117 | fi 118 | 119 | # Check for both message and quiet flag. 120 | # Obviously won't do what the user thinks, so exit. 121 | if [ "$quietflag" == "true" ] && [ "$messageflag" == "true" ] 122 | then 123 | echo "" 124 | echo " Cannot send a message in quiet mode." 125 | echo " Please choose one of -q and -m and try again." 126 | echo "" 127 | exit 1 128 | fi 129 | 130 | # Check userlist for valid users & unique names 131 | # Storage of results jump to tempuserlist and back 132 | # for speed purposes. 133 | 134 | # Check For Valid Users 135 | for user in "${userlist[@]}" 136 | do 137 | temp=`/usr/bin/id -u "$user" 2>&1` 138 | if [ $? -ne 0 ] || [ "$user" == "$temp" ] 139 | then 140 | echo " username "$user" does not exist. "$user" will be ignored." 141 | else 142 | tempuserlist+=("$user") 143 | fi 144 | done 145 | 146 | # Check if all usernames were invalid. 147 | if [ ${#tempuserlist[@]} -eq 0 ] 148 | then 149 | echo "" 150 | echo " No valid usernames given." 151 | echo "" 152 | exit 1 153 | fi 154 | 155 | # Identify unique list of users 156 | # Save unique list back to userList 157 | userlist=($(echo ${tempuserlist[@]} | /usr/bin/sed "s/\s/\n/g" | /usr/bin/sort | /usr/bin/uniq )) 158 | 159 | # Enact the user limit 160 | if [ ${#userlist[@]} -gt $userlimit ] 161 | then 162 | echo "" 163 | echo " Number of users per give command is limited to $userlimit." 164 | echo "" 165 | exit 1 166 | fi 167 | 168 | # Output check for userlist testing 169 | #echo " -------- " 170 | #for user in "${userlist[@]}" 171 | #do 172 | # echo $user 173 | #done 174 | #echo " -------- " 175 | #exit 1 176 | 177 | shift $(( OPTIND-1 )) 178 | 179 | if [ -n "$1" ] 180 | then 181 | 182 | # Make sure the giveandtake directory is created 183 | # and set perms on giver/receiver gt directory here. 184 | for user in "${userlist[@]}" 185 | do 186 | 187 | /bin/mkdir -p "$SPOOLAREA/$giver/$user" 188 | /usr/bin/setfacl -R -d -m u:$user:rwx,g::---,m::rwx "$SPOOLAREA/$giver/$user" 189 | /usr/bin/setfacl -R -m u:$user:rwx,g::---,m::rwx "$SPOOLAREA/$giver/$user" 190 | 191 | for var in "$@" 192 | do 193 | 194 | # Check Size and Number Limitation?? 195 | # Not implemented currently. Doing du on a directory 196 | # takes time... 197 | 198 | # Check sanity of $var 199 | if [ -d "$var" ]; then 200 | echo "" 201 | elif [ -a "$var" ]; then 202 | echo "" 203 | else 204 | echo "$var does not exist" 205 | exit 1 206 | fi 207 | 208 | my_var="$var" 209 | if [ "$myhost" == "genepool" ]; then 210 | my_short_var=`/usr/bin/basename "$var"` 211 | else 212 | my_short_var=`/bin/basename "$var"` 213 | fi 214 | 215 | # Copy file over. Create .tar archive if directory. 216 | 217 | # Below ${var%/} deletes a trailing slash from $var 218 | # ${my_var##*/} deletes longest match of "*/" from front $var (i.e. deletes the path) 219 | 220 | # Check, Is this a directory? 221 | if [ -d "$var" ]; then 222 | # Create .tar from directory 223 | my_var=${var%/}.tar 224 | my_var=${my_var##*/} 225 | tmpdir=${var%/} 226 | parentdir=`/usr/bin/dirname "$tmpdir"` 227 | dir2tar=${tmpdir##*/} 228 | echo "Creating tar archive from directory $var" 229 | cd "$parentdir" 230 | if [ -a "$SPOOLAREA/$giver/$user/$my_var" ] 231 | then 232 | if [ "$batchflag" == "no" ] 233 | then 234 | echo "File $my_var already exists at destination. Overwrite?" 235 | select yn in "Yes" "No"; do 236 | case $yn in 237 | Yes ) 238 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 239 | if [ $? -eq 0 ] 240 | then 241 | messagebody="$messagebody \n $my_var" 242 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 243 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 244 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 245 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 246 | echo "Gave $my_var." 247 | else 248 | echo "Failed to give $my_var. Removing any incomplete files." 249 | # Remove incomplete give 250 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 251 | fi 252 | break;; 253 | No ) echo " " ; break;; 254 | esac 255 | done 256 | else 257 | my_var="${my_date}_${my_var}" 258 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 259 | if [ $? -eq 0 ] 260 | then 261 | messagebody="$messagebody \n $my_var" 262 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 263 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 264 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 265 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 266 | echo "Gave $my_var." 267 | else 268 | echo "Failed to give $my_var. Removing any incomplete files." 269 | # Remove incomplete give 270 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 271 | fi 272 | fi 273 | else 274 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 275 | if [ $? -eq 0 ] 276 | then 277 | messagebody="$messagebody \n $my_var" 278 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 279 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 280 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 281 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 282 | echo "Gave $my_var." 283 | else 284 | echo "Failed to give $my_var. Removing any incomplete files." 285 | # Remove incomplete give 286 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 287 | fi 288 | fi 289 | cd "$current_dir" 290 | echo " " 291 | # This is a file not a directory 292 | else 293 | if [ -a "$SPOOLAREA/$giver/$user/$my_short_var" ] 294 | then 295 | if [ "$batchflag" == "no" ] 296 | then 297 | echo "File $var already exists at destination. Overwrite?" 298 | select yn in "Yes" "No"; do 299 | case $yn in 300 | Yes ) 301 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 302 | if [ $? -eq 0 ] 303 | then 304 | messagebody="$messagebody \n $my_short_var" 305 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 306 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 307 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 308 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$var'`" 309 | echo "Gave $var" 310 | else 311 | echo "Failed to give $var. Removing incomplete file." 312 | # Remove incomplete give 313 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 314 | fi 315 | echo " " 316 | break;; 317 | No ) echo " " ; break;; 318 | esac 319 | done 320 | else 321 | my_short_var="${my_date}_${my_short_var}" 322 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user/$my_short_var" 323 | if [ $? -eq 0 ] 324 | then 325 | messagebody="$messagebody \n $my_short_var" 326 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 327 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 328 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 329 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$var'`" 330 | echo "Gave $var" 331 | else 332 | echo "Failed to give $var. Removing incomplete file." 333 | # Remove incomplete give 334 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 335 | fi 336 | echo " " 337 | fi 338 | else 339 | echo "About to give $var" 340 | echo /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 341 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 342 | if [ $? -eq 0 ] 343 | then 344 | messagebody="$messagebody \n $my_short_var" 345 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 346 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 347 | echo "Gave $var" 348 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 349 | $mylogger "`/bin/date` - giveandtake $giver gave $user `/$myreadlink -f '$var'`" 350 | else 351 | echo "Failed to give $var. Removing incomplete file." 352 | # Remove incomplete give 353 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 354 | fi 355 | echo " " 356 | fi 357 | fi 358 | done 359 | done 360 | 361 | # Email user if not in quiet mode 362 | if [ "$quietflag" == "false" ]; then 363 | 364 | for user in "${userlist[@]}" 365 | do 366 | 367 | if [ -z "$messagebody" ] 368 | then 369 | echo "No files given" 370 | else 371 | messagebody="Shared Files: $messagebody" 372 | messagebody="$messagebody \n\n Retrieve individual files using the take command and providing $giver as the username (-u) argument." 373 | # If user gave message, attach to end of email after instructions for take command. 374 | if [ "$messageflag" == "true" ]; then 375 | messagebody="$emailmessage \n\n $messagebody" 376 | fi 377 | # For security we no longer suggests users cut and paste from email 378 | #messagebody="$messagebody \n\n % take -u $giver " 379 | #messagebody="$messagebody \n\n Retrieve all files given by $giver using:" 380 | #messagebody="$messagebody \n\n % take -u $giver -a" 381 | 382 | # Email user 383 | 384 | # EMAIL subject 385 | SUBJECT="$giver has given you a file at NERSC." 386 | # Email To ? 387 | EMAIL="$user@nersc.gov" 388 | # Email From ? 389 | FROM="$giver@nersc.gov" 390 | # send an email using /bin/mail 391 | if [ "$myhost" == "datatran" ]; then 392 | echo -e "$messagebody" | $mymail -r "$FROM" -s "$SUBJECT" "$EMAIL" 393 | else 394 | echo -e "$messagebody" | $mymail -s "$SUBJECT" "$EMAIL" -- -f "$FROM" 395 | fi 396 | fi 397 | done 398 | fi 399 | 400 | else 401 | echo "No file arguments given." 402 | fi 403 | 404 | exit 0 405 | -------------------------------------------------------------------------------- /give: -------------------------------------------------------------------------------- 1 | #!/bin/bash -i 2 | 3 | ## Give is a command to share files with other users. It requires a spool area. 4 | ## 5 | 6 | # Administrative variables: userlimit per give and permissions group blacklist 7 | userlimit=5 8 | 9 | # Clean and unset vars. We now also use -i above. 10 | giver="" 11 | user="" 12 | userlist=() 13 | tempuserlist=() 14 | emailmessage="" 15 | messagebody="" 16 | SUBJECT="" 17 | EMAIL="" 18 | tmpdir="" 19 | parentdir="" 20 | dir2tar="" 21 | current_dir="" 22 | PATH="" 23 | LD_LIBRARY_PATH="" 24 | unset IFS 25 | my_date=`/bin/date +%s` 26 | quietflag="false" 27 | messageflag="false" 28 | batchflag="no" 29 | 30 | # Implementation Definitions 31 | #SPOOLAREA=/global/scratch2/gt 32 | SPOOLAREA=/global/cfs/cdirs/gt 33 | 34 | # Get Giver's Name 35 | giver=`/usr/bin/whoami` 36 | 37 | # Get Hostname 38 | if [ -z "$NERSC_HOST" ]; then 39 | myhost=`/usr/common/usg/bin/nersc_host` 40 | else 41 | myhost=$NERSC_HOST 42 | fi 43 | #echo $myhost 44 | 45 | myreadlink="/usr/bin/readlink" 46 | mylogger="/bin/logger" 47 | mymail="/bin/mail" 48 | 49 | # Make sure scratch is available and giver has directory 50 | if [ ! -d "$SPOOLAREA/$giver" ]; then 51 | echo "$giver has no mounted give area" 52 | exit 1 53 | fi 54 | 55 | # Catch odd directories 56 | current_dir=`/bin/pwd` 57 | 58 | while getopts ":u:m:bq" opt; do 59 | case $opt in 60 | u) 61 | userlist+=("$OPTARG") 62 | ;; 63 | m) 64 | messageflag="true" 65 | emailmessage="$OPTARG" 66 | ;; 67 | b) 68 | batchflag="yes" 69 | ;; 70 | q) 71 | quietflag="true" 72 | ;; 73 | \?) 74 | echo "" 75 | echo "Usage, simple: give -u {-u ... } " 76 | echo " -u is a required option" 77 | echo " Can be used multiple times to give the to up to $userlimit users." 78 | echo "" 79 | echo "" 80 | echo "Usage, verbose: give {-q -b -m \"\"} -u {-u ... } " 81 | echo " -q, -m and -b are optional flags" 82 | echo "" 83 | echo " -q: Quiet mode. Will not send an email to the recipient. Cannot be used with -m." 84 | echo " -m: Message. Will add a message to the give email. Use '\n' to start a new line. Cannot be used with -q." 85 | echo " -b: Batch mode. Automatically appends time/date stamp to files with the same name as any previous, unretrieved give." 86 | echo " Without -b: Will query overwrite or abort." 87 | echo "" 88 | exit 1 89 | ;; 90 | :) 91 | echo "Option -$OPTARG requires an argument." 92 | exit 1 93 | ;; 94 | esac 95 | done 96 | 97 | # Check if userlist is empty 98 | if [ ${#userlist[@]} -eq 0 ] 99 | then 100 | echo "" 101 | echo "Usage, simple: give -u {-u ... } " 102 | echo " -u is a required option" 103 | echo " Can be used multiple times to give the to up to $userlimit users." 104 | echo "" 105 | echo "" 106 | echo "Usage, verbose: give {-q -b -m \"\"} -u {-u ... } " 107 | echo " -q, -m and -b are optional flags" 108 | echo "" 109 | echo " -q: Quiet mode. Will not send an email to the recipient. Cannot be used with -m." 110 | echo " -m: Message. Will add a message to the give email. Use '\n' to start a new line. Cannot be used with -q." 111 | echo " -b: Batch mode. Automatically appends time/date stamp to files with the same name as any previous, unretrieved give." 112 | echo " Without -b: Will query overwrite or abort." 113 | echo "" 114 | exit 1 115 | fi 116 | 117 | # Check for both message and quiet flag. 118 | # Obviously won't do what the user thinks, so exit. 119 | if [ "$quietflag" == "true" ] && [ "$messageflag" == "true" ] 120 | then 121 | echo "" 122 | echo " Cannot send a message in quiet mode." 123 | echo " Please choose one of -q and -m and try again." 124 | echo "" 125 | exit 1 126 | fi 127 | 128 | # Check userlist for valid users & unique names 129 | # Storage of results jump to tempuserlist and back 130 | # for speed purposes. 131 | 132 | # Check For Valid Users 133 | for user in "${userlist[@]}" 134 | do 135 | temp=`/usr/bin/id -u "$user" 2>&1` 136 | if [ $? -ne 0 ] || [ "$user" == "$temp" ] 137 | then 138 | echo " username "$user" does not exist. "$user" will be ignored." 139 | else 140 | tempuserlist+=("$user") 141 | fi 142 | done 143 | 144 | # Check if all usernames were invalid. 145 | if [ ${#tempuserlist[@]} -eq 0 ] 146 | then 147 | echo "" 148 | echo " No valid usernames given." 149 | echo "" 150 | exit 1 151 | fi 152 | 153 | # Identify unique list of users 154 | # Save unique list back to userList 155 | userlist=($(echo ${tempuserlist[@]} | /usr/bin/sed "s/\s/\n/g" | /usr/bin/sort | /usr/bin/uniq )) 156 | 157 | # Enact the user limit 158 | if [ ${#userlist[@]} -gt $userlimit ] 159 | then 160 | echo "" 161 | echo " Number of users per give command is limited to $userlimit." 162 | echo "" 163 | exit 1 164 | fi 165 | 166 | # Output check for userlist testing 167 | #echo " -------- " 168 | #for user in "${userlist[@]}" 169 | #do 170 | # echo $user 171 | #done 172 | #echo " -------- " 173 | #exit 1 174 | 175 | shift $(( OPTIND-1 )) 176 | 177 | if [ -n "$1" ] 178 | then 179 | 180 | # Fix possible broken perms 181 | /usr/bin/chmod a+x "$SPOOLAREA/$giver" 182 | 183 | # Make sure the giveandtake directory is created 184 | # and set perms on giver/receiver gt directory here. 185 | for user in "${userlist[@]}" 186 | do 187 | 188 | /bin/mkdir -p "$SPOOLAREA/$giver/$user" 189 | /usr/bin/setfacl -R -d -m u:$user:rwx,g::---,m::rwx "$SPOOLAREA/$giver/$user" 190 | /usr/bin/setfacl -R -m u:$user:rwx,g::---,m::rwx "$SPOOLAREA/$giver/$user" 191 | 192 | for var in "$@" 193 | do 194 | 195 | # Check Size and Number Limitation?? 196 | # Not implemented currently. Doing du on a directory 197 | # takes time... 198 | 199 | # Check sanity of $var 200 | if [ -d "$var" ]; then 201 | echo "" 202 | elif [ -a "$var" ]; then 203 | echo "" 204 | else 205 | echo "$var does not exist" 206 | exit 1 207 | fi 208 | 209 | my_var="$var" 210 | if [ "$myhost" == "genepool" ]; then 211 | my_short_var=`/usr/bin/basename "$var"` 212 | else 213 | my_short_var=`/bin/basename "$var"` 214 | fi 215 | 216 | # Copy file over. Create .tar archive if directory. 217 | 218 | # Below ${var%/} deletes a trailing slash from $var 219 | # ${my_var##*/} deletes longest match of "*/" from front $var (i.e. deletes the path) 220 | 221 | # Check, Is this a directory? 222 | if [ -d "$var" ]; then 223 | # Create .tar from directory 224 | my_var=${var%/}.tar 225 | my_var=${my_var##*/} 226 | tmpdir=${var%/} 227 | parentdir=`/usr/bin/dirname "$tmpdir"` 228 | dir2tar=${tmpdir##*/} 229 | echo "Creating tar archive from directory $var" 230 | cd "$parentdir" 231 | if [ -a "$SPOOLAREA/$giver/$user/$my_var" ] 232 | then 233 | if [ "$batchflag" == "no" ] 234 | then 235 | echo "File $my_var already exists at destination. Overwrite?" 236 | select yn in "Yes" "No"; do 237 | case $yn in 238 | Yes ) 239 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 240 | if [ $? -eq 0 ] 241 | then 242 | messagebody="$messagebody \n $my_var" 243 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 244 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 245 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 246 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 247 | echo "Gave $my_var." 248 | else 249 | echo "Failed to give $my_var. Removing any incomplete files." 250 | # Remove incomplete give 251 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 252 | fi 253 | break;; 254 | No ) echo " " ; break;; 255 | esac 256 | done 257 | else 258 | my_var="${my_date}_${my_var}" 259 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 260 | if [ $? -eq 0 ] 261 | then 262 | messagebody="$messagebody \n $my_var" 263 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 264 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 265 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 266 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 267 | echo "Gave $my_var." 268 | else 269 | echo "Failed to give $my_var. Removing any incomplete files." 270 | # Remove incomplete give 271 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 272 | fi 273 | fi 274 | else 275 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 276 | if [ $? -eq 0 ] 277 | then 278 | messagebody="$messagebody \n $my_var" 279 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 280 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 281 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 282 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 283 | echo "Gave $my_var." 284 | else 285 | echo "Failed to give $my_var. Removing any incomplete files." 286 | # Remove incomplete give 287 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 288 | fi 289 | fi 290 | cd "$current_dir" 291 | echo " " 292 | # This is a file not a directory 293 | else 294 | if [ -a "$SPOOLAREA/$giver/$user/$my_short_var" ] 295 | then 296 | if [ "$batchflag" == "no" ] 297 | then 298 | echo "File $var already exists at destination. Overwrite?" 299 | select yn in "Yes" "No"; do 300 | case $yn in 301 | Yes ) 302 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 303 | if [ $? -eq 0 ] 304 | then 305 | messagebody="$messagebody \n $my_short_var" 306 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 307 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 308 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 309 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$var'`" 310 | echo "Gave $var" 311 | else 312 | echo "Failed to give $var. Removing incomplete file." 313 | # Remove incomplete give 314 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 315 | fi 316 | echo " " 317 | break;; 318 | No ) echo " " ; break;; 319 | esac 320 | done 321 | else 322 | my_short_var="${my_date}_${my_short_var}" 323 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user/$my_short_var" 324 | if [ $? -eq 0 ] 325 | then 326 | messagebody="$messagebody \n $my_short_var" 327 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 328 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 329 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 330 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$var'`" 331 | echo "Gave $var" 332 | else 333 | echo "Failed to give $var. Removing incomplete file." 334 | # Remove incomplete give 335 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 336 | fi 337 | echo " " 338 | fi 339 | else 340 | echo "About to give $var" 341 | echo /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 342 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 343 | if [ $? -eq 0 ] 344 | then 345 | messagebody="$messagebody \n $my_short_var" 346 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 347 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 348 | echo "Gave $var" 349 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 350 | $mylogger "`/bin/date` - giveandtake $giver gave $user `/$myreadlink -f '$var'`" 351 | else 352 | echo "Failed to give $var. Removing incomplete file." 353 | # Remove incomplete give 354 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 355 | fi 356 | echo " " 357 | fi 358 | fi 359 | done 360 | done 361 | 362 | # Email user if not in quiet mode 363 | if [ "$quietflag" == "false" ]; then 364 | 365 | for user in "${userlist[@]}" 366 | do 367 | 368 | if [ -z "$messagebody" ] 369 | then 370 | echo "No files given" 371 | else 372 | messagebody="Shared Files: $messagebody" 373 | messagebody="$messagebody \n\nRetrieve individual files using the take command, eg:" 374 | messagebody="$messagebody \n take -u " 375 | messagebody="$messagebody \n\nRetrieve all files given by a giver like:" 376 | messagebody="$messagebody \n take -u -a" 377 | messagebody="$messagebody \n\nGiven files will expire after 12 weeks" 378 | # If user gave message, attach to end of email after instructions for take command. 379 | if [ "$messageflag" == "true" ]; then 380 | messagebody="$emailmessage \n\n $messagebody" 381 | fi 382 | # For security we no longer suggests users cut and paste from email 383 | #messagebody="$messagebody \n\n % take -u $giver " 384 | #messagebody="$messagebody \n\n Retrieve all files given by $giver using:" 385 | #messagebody="$messagebody \n\n % take -u $giver -a" 386 | 387 | # Email user 388 | 389 | # EMAIL subject 390 | SUBJECT="$giver has given you a file at NERSC." 391 | # Email To ? 392 | EMAIL="$user@nersc.gov" 393 | # Email From ? 394 | FROM="$giver@nersc.gov" 395 | # send an email using /bin/mail 396 | if [ "$myhost" == "datatran" ]; then 397 | echo -e "$messagebody" | $mymail -r "$FROM" -s "$SUBJECT" "$EMAIL" 398 | else 399 | echo -e "$messagebody" | $mymail -s "$SUBJECT" "$EMAIL" -- -f "$FROM" 400 | fi 401 | fi 402 | done 403 | fi 404 | 405 | else 406 | echo "No file arguments given." 407 | fi 408 | 409 | exit 0 410 | -------------------------------------------------------------------------------- /givegroup: -------------------------------------------------------------------------------- 1 | #!/bin/bash -i 2 | 3 | # Give is a command to share files with other users. It requires a spool area. 4 | # 5 | 6 | # Administrative variables: userlimit per give and permissions group blacklist 7 | # Need grouplimit? Will parsing the groups ever be too time consuming compared to the gives themselves? 8 | userlimit=100 9 | blacklist=("staff" "usg") 10 | 11 | # Clean and unset vars. We now also use -i above. 12 | giver="" 13 | user="" 14 | userlist=() 15 | grouplist=() 16 | tempuserlist=() 17 | emailmessage="" 18 | messagebody="" 19 | SUBJECT="" 20 | EMAIL="" 21 | tmpdir="" 22 | parentdir="" 23 | dir2tar="" 24 | current_dir="" 25 | PATH="" 26 | LD_LIBRARY_PATH="" 27 | unset IFS 28 | my_date=`/bin/date +%s` 29 | quietflag="false" 30 | messageflag="false" 31 | batchflag="no" 32 | 33 | # Implementation Definitions 34 | #SPOOLAREA=/global/scratch2/gt 35 | SPOOLAREA=/project/projectdirs/gt 36 | 37 | # Get Giver's Name 38 | giver=`/usr/bin/whoami` 39 | 40 | # Get Hostname 41 | myhost=`/usr/common/usg/bin/nersc_host` 42 | #echo $myhost 43 | 44 | if [ "$myhost" == "genepool" ]; then 45 | myreadlink="/bin/readlink" 46 | mylogger="/usr/bin/logger" 47 | mymail="/usr/bin/mail" 48 | else 49 | myreadlink="/usr/bin/readlink" 50 | mylogger="/bin/logger" 51 | mymail="/bin/mail" 52 | fi 53 | 54 | # Make sure scratch is available and giver has directory 55 | if [ ! -d "$SPOOLAREA/$giver" ]; then 56 | echo "$giver has no mounted give area" 57 | exit 1 58 | fi 59 | 60 | # Catch odd directories 61 | current_dir=`/bin/pwd` 62 | 63 | while getopts ":u:g:m:bq" opt; do 64 | case $opt in 65 | u) 66 | userlist+=("$OPTARG") 67 | ;; 68 | g) 69 | grouplist+=("$OPTARG") 70 | ;; 71 | m) 72 | messageflag="true" 73 | emailmessage="$OPTARG" 74 | ;; 75 | b) 76 | batchflag="yes" 77 | ;; 78 | q) 79 | quietflag="true" 80 | ;; 81 | \?) 82 | echo "" 83 | echo "Usage, simple: give -u -g " 84 | echo " -u or -g is a required option" 85 | echo " -u: Give to a user." 86 | echo " -g: Give to a permission group. Cannot be used on compute nodes." 87 | echo " Both -u and -g can be used multiple times to give the to up to a combined total of $userlimit users." 88 | echo "" 89 | echo "Usage, verbose: give {-q -b -m \"\"} -u -g " 90 | echo " -q, -m and -b are optional flags" 91 | echo "" 92 | echo " -q: Quiet mode. Will not send an email to the recipient. Cannot be used with -m." 93 | echo " -m: Message. Will add a message to the give email. Use '\n' to start a new line. Cannot be used with -q." 94 | echo " -b: Batch mode. Automatically appends time/date stamp to files with the same name as any previous, unretrieved give." 95 | echo " Without -b: Will query overwrite or abort." 96 | echo "" 97 | exit 1 98 | ;; 99 | :) 100 | echo "Option -$OPTARG requires an argument." 101 | exit 1 102 | ;; 103 | esac 104 | done 105 | 106 | # Parse the permission group lists and add them to the userlist. 107 | # Turn off globbing for this. List contains a *. 108 | set -f 109 | for groupid in "${grouplist[@]}" 110 | do 111 | for id in "${blacklist[@]}" 112 | do 113 | if [ "$groupid" == "$id" ] 114 | then 115 | echo " Cannot give to group \"$groupid\"." 116 | exit 1 117 | fi 118 | done 119 | # Remove whitespaces. Do not allow a blank groupid. 120 | groupid=$(echo $groupid | /usr/bin/sed s/\s//g) 121 | getgroup=$(/usr/bin/getent group $groupid) 122 | if [ "$getgroup" == "" ] || [ "$groupid" == "" ] 123 | then 124 | echo " Group $groupid is invalid." 125 | exit 1 126 | fi 127 | parse=($(echo $getgroup | /usr/bin/tr ":" "\n")) 128 | nameparse=($(echo ${parse[${#parse[@]}-1]} | /usr/bin/tr "," "\n")) 129 | 130 | for name in "${nameparse[@]}" 131 | do 132 | userlist+=("$name") 133 | done 134 | done 135 | set +f 136 | 137 | # Check if userlist is empty 138 | if [ ${#userlist[@]} -eq 0 ] 139 | then 140 | echo "" 141 | echo "Usage, simple: give -u -g " 142 | echo " -u or -g is a required option" 143 | echo " -u: Give to a user." 144 | echo " -g: Give to a permission group. Cannot be used on compute nodes." 145 | echo " Both -u and -g can be used multiple times to give the to up to a combined total of $userlimit users." 146 | echo "" 147 | echo "Usage, verbose: give {-q -b -m \"\"} -u -g " 148 | echo " -q, -m and -b are optional flags" 149 | echo "" 150 | echo " -q: Quiet mode. Will not send an email to the recipient. Cannot be used with -m." 151 | echo " -m: Message. Will add a message to the give email. Use '\n' to start a new line. Cannot be used with -q." 152 | echo " -b: Batch mode. Automatically appends time/date stamp to files with the same name as any previous, unretrieved give." 153 | echo " Without -b: Will query overwrite or abort." 154 | echo "" 155 | exit 1 156 | fi 157 | 158 | # Check for both message and quiet flag. 159 | # Obviously won't do what the user thinks, so exit. 160 | if [ "$quietflag" == "true" ] && [ "$messageflag" == "true" ]; then 161 | echo "" 162 | echo " Cannot send a message in quiet mode." 163 | echo " Please choose one of -q and -m and try again." 164 | echo "" 165 | exit 1 166 | fi 167 | 168 | # Check userlist for valid users & unique names 169 | # Check For Valid Users 170 | for user in "${userlist[@]}" 171 | do 172 | temp=`/usr/bin/id -u "$user" 2>&1` 173 | if [ $? -ne 0 ] || [ "$user" == "$temp" ] ; then 174 | echo " username "$user" does not exist. "$user" will be ignored." 175 | # exit 1 176 | else 177 | tempuserlist+=("$user") 178 | fi 179 | done 180 | 181 | # If tempuserlist is empty, all usernames were invalid. 182 | if [ ${#tempuserlist[@]} -eq 0 ] 183 | then 184 | echo "" 185 | echo " No valid usernames given." 186 | echo "" 187 | exit 1 188 | fi 189 | 190 | # Identify unique list of users. (Primarily for group/user overlaps.) 191 | # Save unique list back to userList 192 | userlist=($(echo ${tempuserlist[@]} | /usr/bin/sed "s/\s/\n/g" | /usr/bin/sort | /usr/bin/uniq )) 193 | 194 | # Enact the user limit 195 | if [ ${#userlist[@]} -gt $userlimit ] 196 | then 197 | echo "" 198 | echo " Number of users per give command is limited to $userlimit." 199 | echo " Currently attempting to give to ${#userlist[@]} users." 200 | echo "" 201 | exit 1 202 | fi 203 | 204 | #Output check for userlist testing 205 | #echo " -------- " 206 | #for user in "${userlist[@]}" 207 | #do 208 | # echo $user 209 | #done 210 | #echo " -------- " 211 | #exit 1 212 | 213 | shift $(( OPTIND-1 )) 214 | 215 | if [ -n "$1" ] 216 | then 217 | 218 | # Make sure the giveandtake directory is created 219 | # and set perms on giver/receiver gt directory here. 220 | for user in "${userlist[@]}" 221 | do 222 | 223 | /bin/mkdir -p "$SPOOLAREA/$giver/$user" 224 | /usr/bin/setfacl -R -d -m u:$user:rwx,g::---,m::rwx "$SPOOLAREA/$giver/$user" 225 | /usr/bin/setfacl -R -m u:$user:rwx,g::---,m::rwx "$SPOOLAREA/$giver/$user" 226 | 227 | for var in "$@" 228 | do 229 | 230 | # Check Size and Number Limitation?? 231 | # Not implemented currently. Doing du on a directory 232 | # takes time... 233 | 234 | # Check sanity of $var 235 | if [ -d "$var" ]; then 236 | echo "" 237 | elif [ -a "$var" ]; then 238 | echo "" 239 | else 240 | echo "$var does not exist" 241 | exit 1 242 | fi 243 | 244 | my_var="$var" 245 | if [ "$myhost" == "genepool" ]; then 246 | my_short_var=`/usr/bin/basename "$var"` 247 | else 248 | my_short_var=`/bin/basename "$var"` 249 | fi 250 | 251 | # Copy file over. Create .tar archive if directory. 252 | 253 | # Below ${var%/} deletes a trailing slash from $var 254 | # ${my_var##*/} deletes longest match of "*/" from front $var (i.e. deletes the path) 255 | 256 | # Check, Is this a directory? 257 | if [ -d "$var" ]; then 258 | # Create .tar from directory 259 | my_var=${var%/}.tar 260 | my_var=${my_var##*/} 261 | tmpdir=${var%/} 262 | parentdir=`/usr/bin/dirname "$tmpdir"` 263 | dir2tar=${tmpdir##*/} 264 | echo "Creating tar archive from directory $var" 265 | cd "$parentdir" 266 | if [ -a "$SPOOLAREA/$giver/$user/$my_var" ] 267 | then 268 | if [ "$batchflag" == "no" ] 269 | then 270 | echo "File $my_var already exists at destination. Overwrite?" 271 | select yn in "Yes" "No"; do 272 | case $yn in 273 | Yes ) 274 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 275 | if [ $? -eq 0 ] 276 | then 277 | messagebody="$messagebody \n $my_var" 278 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 279 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 280 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 281 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 282 | echo "Gave $my_var." 283 | else 284 | echo "Failed to give $my_var. Removing any incomplete files." 285 | # Remove incomplete give 286 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 287 | fi 288 | break;; 289 | No ) echo " " ; break;; 290 | esac 291 | done 292 | else 293 | my_var="${my_date}_${my_var}" 294 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 295 | if [ $? -eq 0 ] 296 | then 297 | messagebody="$messagebody \n $my_var" 298 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 299 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 300 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 301 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 302 | echo "Gave $my_var." 303 | else 304 | echo "Failed to give $my_var. Removing any incomplete files." 305 | # Remove incomplete give 306 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 307 | fi 308 | fi 309 | else 310 | /bin/tar -cvf "$SPOOLAREA/$giver/$user/$my_var" "$dir2tar" 311 | if [ $? -eq 0 ] 312 | then 313 | messagebody="$messagebody \n $my_var" 314 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_var" 315 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_var" 316 | echo "`/bin/date` - gave $user `$myreadlink -f '$my_var'`" >> ~/.filesgiven 317 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$my_var'`" 318 | echo "Gave $my_var." 319 | else 320 | echo "Failed to give $my_var. Removing any incomplete files." 321 | # Remove incomplete give 322 | /bin/rm "$SPOOLAREA/$giver/$user/$my_var" 323 | fi 324 | fi 325 | cd "$current_dir" 326 | echo " " 327 | # This is a file not a directory 328 | else 329 | if [ -a "$SPOOLAREA/$giver/$user/$my_short_var" ] 330 | then 331 | if [ "$batchflag" == "no" ] 332 | then 333 | echo "File $var already exists at destination. Overwrite?" 334 | select yn in "Yes" "No"; do 335 | case $yn in 336 | Yes ) 337 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 338 | if [ $? -eq 0 ] 339 | then 340 | messagebody="$messagebody \n $my_short_var" 341 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 342 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 343 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 344 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$var'`" 345 | echo "Gave $var" 346 | else 347 | echo "Failed to give $var. Removing incomplete file." 348 | # Remove incomplete give 349 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 350 | fi 351 | echo " " 352 | break;; 353 | No ) echo " " ; break;; 354 | esac 355 | done 356 | else 357 | my_short_var="${my_date}_${my_short_var}" 358 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user/$my_short_var" 359 | if [ $? -eq 0 ] 360 | then 361 | messagebody="$messagebody \n $my_short_var" 362 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 363 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 364 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 365 | $mylogger "`/bin/date` - giveandtake $giver gave $user `$myreadlink -f '$var'`" 366 | echo "Gave $var" 367 | else 368 | echo "Failed to give $var. Removing incomplete file." 369 | # Remove incomplete give 370 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 371 | fi 372 | echo " " 373 | fi 374 | else 375 | echo "About to give $var" 376 | echo /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 377 | /usr/bin/rsync --progress --log-format="Giving $my_short_var" "$var" "$SPOOLAREA/$giver/$user" 378 | if [ $? -eq 0 ] 379 | then 380 | messagebody="$messagebody \n $my_short_var" 381 | /usr/bin/setfacl -R -d -m u:$user:rwx "$SPOOLAREA/$giver/$user/$my_short_var" 382 | /usr/bin/setfacl -R -m u:$user:rw,g::---,m::rw "$SPOOLAREA/$giver/$user/$my_short_var" 383 | echo "Gave $var" 384 | echo "`/bin/date` - gave $user `$myreadlink -f '$var'`" >> ~/.filesgiven 385 | $mylogger "`/bin/date` - giveandtake $giver gave $user `/$myreadlink -f '$var'`" 386 | else 387 | echo "Failed to give $var. Removing incomplete file." 388 | # Remove incomplete give 389 | rm "$SPOOLAREA/$giver/$user/$my_short_var" 390 | fi 391 | echo " " 392 | fi 393 | fi 394 | done 395 | done 396 | 397 | # Email user if not in quiet mode 398 | if [ "$quietflag" == "false" ]; then 399 | 400 | for user in "${userlist[@]}" 401 | do 402 | 403 | if [ -z "$messagebody" ] 404 | then 405 | echo "No files given" 406 | else 407 | messagebody="Shared Files: $messagebody" 408 | messagebody="$messagebody \n\n Retrieve individual files using the take command and providing $giver as the username (-u) argument." 409 | # If user gave message, attach to end of email after instructions for take command. 410 | if [ "$messageflag" == "true" ]; then 411 | messagebody="$emailmessage \n\n $messagebody" 412 | fi 413 | # For security we no longer suggests users cut and paste from email 414 | #messagebody="$messagebody \n\n % take -u $giver " 415 | #messagebody="$messagebody \n\n Retrieve all files given by $giver using:" 416 | #messagebody="$messagebody \n\n % take -u $giver -a" 417 | 418 | # Email user 419 | 420 | # EMAIL subject 421 | SUBJECT="$giver has given you a file at NERSC." 422 | # Email To ? 423 | EMAIL="$user@nersc.gov" 424 | # Email From ? 425 | FROM="$giver@nersc.gov" 426 | # send an email using /bin/mail 427 | if [ "$myhost" == "datatran" ]; then 428 | echo -e "$messagebody" | $mymail -r "$FROM" -s "$SUBJECT" "$EMAIL" 429 | else 430 | echo -e "$messagebody" | $mymail -s "$SUBJECT" "$EMAIL" -- -f "$FROM" 431 | fi 432 | fi 433 | done 434 | fi 435 | 436 | else 437 | echo "No file arguments given." 438 | fi 439 | 440 | exit 0 441 | --------------------------------------------------------------------------------