Advertisement
Guest User

Untitled

a guest
Jan 24th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.29 KB | None | 0 0
  1. #!/usr/bin/env bash
  2.  
  3. #================================================================
  4. # DESCRIPTION
  5. # Script retrieves files from S3 via SQS at maximum warp.
  6. #================================================================
  7. # AUTHOR Anastas Dancha (@anapsix)
  8. # COPYRIGHT Copyright (c) Anastas Dancha (@anapsix)
  9. # LICENCE GNU General Public License
  10. #================================================================
  11. # HISTORY
  12. # 2017/01/24 : anapsix : initial release
  13. #================================================================
  14.  
  15. help() {
  16. cat <<EOH
  17. Usage: $0 [-h] [-s] -q sqs_queue_name [-m {0..10}] [-t {0..100}]
  18. -h display this help
  19. -s silent
  20. -q sqs queue name
  21. -m max_messages to retrieve from SQS between 1 and 10, defaults to 1
  22. -t number of threads to start, defaults to "auto"
  23. EOH
  24. }
  25.  
  26. OPTS=$(getopt -o shq:m:t: -n 'parse-options' -- "$@")
  27. if [ $? != 0 ]; then echo "Failed parsing options." >&2; help; exit 1; fi
  28.  
  29. eval set -- "$OPTS"
  30. while true; do
  31. case "$1" in
  32. -s ) export SILENT=1; shift ;;
  33. -h ) help; exit 0; shift ;;
  34. -q ) export SQS_QUEUE_NAME="$2"; shift; shift ;;
  35. -m ) MAX_MESSAGES="$2"; shift; shift ;;
  36. -t ) THREADS="$2"; shift; shift ;;
  37. -- ) shift; break ;;
  38. * ) break ;;
  39. esac
  40. done
  41.  
  42. if [ ${#SQS_QUEUE_NAME[0]} -eq 0 ]; then
  43. echo >&2 "-s sqs_queue_name is a required argument.."
  44. help
  45. exit 1
  46. fi
  47.  
  48. ####
  49.  
  50. set -e
  51.  
  52. export MAX_MESSAGES=${MAX_MESSAGES:-1}
  53. export THREADS=${THREADS:-auto}
  54. export MAX_THREADS=50
  55. run_id=$(head -16 /dev/urandom | md5sum | cut -c1-17)
  56.  
  57. export AWS_DEFAULT_REGION=${AWS_REGION:-us-west-2}
  58. export LOG_DIR="/mnt/elb_logs"
  59.  
  60. SCRIPT_BASENAME=$(basename $0)
  61. SCRIPT_LOG_DIR="/tmp/${SCRIPT_BASENAME%%.*}"
  62. RUN_LOG_DIR="${SCRIPT_LOG_DIR}/${run_id}"
  63. mkdir -p ${SCRIPT_LOG_DIR} ${RUN_LOG_DIR}
  64.  
  65. verbose() {
  66. if [ ${SILENT:-0} -eq 0 ]; then
  67. echo "${run_id}${thread_id:+/$thread_id}: $@" | tee -a ${SCRIPT_LOG_DIR}/run_${run_id}.log >&2
  68. fi
  69. }
  70.  
  71. sqs_delete_message() {
  72. verbose "Deleting retrieved message id ${message_id}"
  73. aws sqs delete-message --queue-url ${SQS_QUEUE_URL} --receipt-handle ${1} >${RUN_LOG_DIR}/thread_${thread_id}.log 2>&1
  74. }
  75.  
  76. s3_get_log() {
  77. aws s3 cp s3://$1 $2 >${RUN_LOG_DIR}/thread_${thread_id}.log 2>&1
  78. }
  79.  
  80. main() {
  81. thread_id=$(head -16 /dev/urandom | md5sum | cut -c1-9)
  82. TMP_DIR="${LOG_DIR}_tmp/${thread_id}"
  83. THREAD_LOG="${RUN_LOG_DIR}/thread_${thread_id}.log"
  84. mkdir ${TMP_DIR}
  85.  
  86. messages="$(aws sqs receive-message --max-number-of-messages ${MAX_MESSAGES} --queue-url ${SQS_QUEUE_URL} --output text)"
  87.  
  88. IFS=$'\n'
  89.  
  90. verbose "Downloading ELB logs to temp dir (${TMP_DIR}/).."
  91. for message in $messages; do
  92. message_id=$(echo "$message" | cut -f4)
  93. receipt_handle=$(echo "$message" | cut -f5)
  94. bucket_name=$(echo $message | cut -f2 | jq '.Records[].s3.bucket.name' | sed 's/^"//g;s/"$//g')
  95. logfile=$(echo $message | cut -f2 | jq '.Records[].s3.object.key' | sed 's/^"//g;s/"$//g')
  96.  
  97. sqs_delete_message $receipt_handle >${THREAD_LOG} 2>&1
  98. s3_get_log ${bucket_name}/${logfile} ${TMP_DIR} >${THREAD_LOG} 2>&1
  99. done
  100.  
  101. verbose "Moving ELB logs from temp dir to Splunk input dir (${LOG_DIR}/).."
  102. chown -v splunk:root ${TMP_DIR}/* >${THREAD_LOG} 2>&1
  103. mv -v ${TMP_DIR}/* ${LOG_DIR}/ >${THREAD_LOG} 2>&1
  104. rm -rv ${TMP_DIR} >${THREAD_LOG} 2>&1
  105. }
  106.  
  107. verbose "Run ${run_id} started.."
  108. verbose "Discovering SQS queue url for ${SQS_QUEUE_NAME}"
  109. export SQS_QUEUE_URL="$(aws sqs get-queue-url --queue-name ${SQS_QUEUE_NAME} --output text)"
  110.  
  111. if [ "${THREADS}" == "auto" ]; then
  112. verbose "THREADS autodicovery mode selected.."
  113.  
  114. if [ $MAX_MESSAGES -ne 10 ]; then
  115. verbose "Ignoring passed max_messages, defaulting to maximum of 10"
  116. export MAX_MESSAGES=10
  117. fi
  118.  
  119. export SQS_NUMBER_OF_MESSAGES=$(aws sqs get-queue-attributes --queue-url ${SQS_QUEUE_URL} --attribute-names ApproximateNumberOfMessages --output text | cut -f2)
  120. verbose "$SQS_NUMBER_OF_MESSAGES messages detected.."
  121. export THREADS=$[$[$SQS_NUMBER_OF_MESSAGES/10]+1]
  122. verbose "Need $THREADS threads to be retriever all of $SQS_NUMBER_OF_MESSAGES messages.."
  123. if [ $THREADS -gt ${MAX_THREADS} ]; then
  124. verbose "Cowardly refusing to run more than ${MAX_THREADS} threads, defaulting to ${MAX_THREADS}.."
  125. export THREADS=${MAX_THREADS}
  126. fi
  127.  
  128. fi
  129.  
  130. verbose "Run is proceeding with ${THREADS} threads.."
  131. for ((i=1;i<=${THREADS};i++)); do
  132. main &
  133. done
  134. wait
  135. verbose "Run ${run_id} finished.."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement