diff --git a/s3-sync-backup.sh b/s3-sync-backup.sh index 98d1476..3ab05ea 100755 --- a/s3-sync-backup.sh +++ b/s3-sync-backup.sh @@ -7,59 +7,84 @@ remote_path="" email_from="" email_name="" email_to="" -send_email_script_path="/etc/sg-send-email.sh" +send_email_script_path="/etc/send-email.sh" +email_provider="" print_usage () { - echo "Usage: "$0" -l LOCAL_PATH -r REMOTE_PATH -f EMAIL_FROM -n EMAIL_NAME -t EMAIL_TO -s SEND_EMAIL_SCRIPT_PATH" - echo "LOCAL_PATH - local path to sync" - echo "REMOTE_PATH - remote path in format remote:bucket/path" - echo "EMAIL_FROM - sender's email address" - echo "EMAIL_NAME - sender's name" - echo "EMAIL_TO - recipient's email adress" - echo "SEND_EMAIL_SCRIPT_PATH - a path to the send email script (default: /etc/sg-send-email.sh)" + echo "Usage: $0 -l LOCAL_PATH -r REMOTE_PATH -f EMAIL_FROM -n EMAIL_NAME -t EMAIL_TO -s SEND_EMAIL_SCRIPT_PATH -p EMAIL_PROVIDER" + echo "" + echo "Required:" + echo " -l LOCAL_PATH Local path to sync" + echo " -r REMOTE_PATH Remote path in format remote:bucket/path" + echo " -f EMAIL_FROM Sender's email address" + echo " -n EMAIL_NAME Sender's name" + echo " -t EMAIL_TO Recipient's email address" + echo " -p EMAIL_PROVIDER Email provider: resend or sendgrid" + echo "" + echo "Optional:" + echo " -s SEND_EMAIL_SCRIPT_PATH Path to the send email script (default: /etc/send-email.sh)" } -while getopts "l:r:f:n:t:s:h" opt +while getopts "l:r:f:n:t:s:p:h" opt do case $opt in - l) - local_path="${OPTARG}";; - r) - remote_path="${OPTARG}";; - f) - email_from="${OPTARG}";; - n) - email_name="${OPTARG}";; - t) - email_to="${OPTARG}";; - s) - send_email_script_path="${OPTARG}";; + l) local_path="${OPTARG}" ;; + r) remote_path="${OPTARG}" ;; + f) email_from="${OPTARG}" ;; + n) email_name="${OPTARG}" ;; + t) email_to="${OPTARG}" ;; + s) send_email_script_path="${OPTARG}" ;; + p) email_provider="${OPTARG}" ;; h) print_usage - exit 3 + exit 0 + ;; + *) + print_usage + exit 1 ;; esac done -# Check if script for sending emails is in place -if [[ ! -f $send_email_script_path ]]; then +# Validate required parameters +if [[ -z "$local_path" || -z "$remote_path" || -z "$email_from" || -z "$email_name" || -z "$email_to" || -z "$email_provider" ]]; then + echo "Error: Missing required parameter(s)" + print_usage + exit 1 +fi + +# Validate email provider +if [[ "$email_provider" != "resend" && "$email_provider" != "sendgrid" ]]; then + echo "Error: Invalid email provider '$email_provider'. Use 'resend' or 'sendgrid'" + exit 1 +fi + +# Check if send-email script exists +if [[ ! -f "$send_email_script_path" ]]; then echo "Script \"$send_email_script_path\" does not exist" exit 1 fi -# Run script and capture time and exit code +# Run sync and capture start/end time and status start_time=$(date +'%Y-%m-%d %H:%M:%S') -rclone sync ${local_path} ${remote_path} --log-file=/var/log/rclone-backup.log --log-level INFO +rclone sync "${local_path}" "${remote_path}" --log-file=/var/log/rclone-backup.log --log-level INFO exit_code="$?" end_time=$(date +'%Y-%m-%d %H:%M:%S') -# Send email notification with sync status -email_message="Start time: ${start_time}\nEnd time: ${end_time}" +# Prepare email status="SUCCESSFUL" - if [[ $exit_code -ne 0 ]]; then status="FAILED" fi -${send_email_script_path} -f ${email_from} -n ${email_name} -t ${email_to} -s "Backup sync to S3 status: ${status}" -m "${email_message}" +email_message="Start time: ${start_time}\nEnd time: ${end_time}" + +# Send email +"$send_email_script_path" \ + -f "$email_from" \ + -n "$email_name" \ + -t "$email_to" \ + -s "Backup sync to S3 status: $status" \ + -m "$email_message" \ + -p "$email_provider" diff --git a/send-email.sh b/send-email.sh new file mode 100755 index 0000000..5ac0f3e --- /dev/null +++ b/send-email.sh @@ -0,0 +1,129 @@ +#!/usr/bin/bash + +script_dir="$(dirname "$0")" +default_resend_key_file="$script_dir/rs_key" +default_sendgrid_key_file="$script_dir/sg_key" + +# Default values +email_from="" +email_name="" +email_to="" +subject="" +message="" +provider="" +key_file="" + +print_usage () { + echo "Usage: $0 -f EMAIL_FROM -n EMAIL_NAME -t EMAIL_TO -s SUBJECT -m MESSAGE -p PROVIDER [-k KEY_FILE]" + echo "" + echo "Required:" + echo " -f EMAIL_FROM Sender's email address" + echo " -n EMAIL_NAME Sender's name" + echo " -t EMAIL_TO Recipient's email address" + echo " -s SUBJECT Email subject" + echo " -m MESSAGE Email message" + echo " -p PROVIDER Email provider: 'resend' or 'sendgrid'" + echo "" + echo "Optional:" + echo " -k KEY_FILE Path to API key file (defaults: ./rs_key for resend, ./sg_key for sendgrid)" + echo "" +} + +send_email_resend () { + full_from="${email_name} <${email_from}>" + + maildata='{ + "to": ["'"${email_to}"'"], + "from": "'"${full_from}"'", + "subject": "'"${subject}"'", + "text": "'"${message}"'" + }' + + curl -X POST "https://api.resend.com/emails" \ + -H "Authorization: Bearer $api_key" \ + -H "Content-Type: application/json" \ + -d "$maildata" +} + +send_email_sendgrid () { + maildata='{ + "personalizations": [{"to": [{"email": "'"${email_to}"'"}]}], + "from": {"email": "'"${email_from}"'", "name": "'"${email_name}"'"}, + "subject": "'"${subject}"'", + "content": [{"type": "text/plain", "value": "'"${message}"'"}] + }' + + curl -X POST "https://api.sendgrid.com/v3/mail/send" \ + -H "Authorization: Bearer $api_key" \ + -H "Content-Type: application/json" \ + -d "$maildata" +} + +while getopts "f:n:t:s:m:p:k:h" opt +do + case $opt in + f) email_from="${OPTARG}" ;; + n) email_name="${OPTARG}" ;; + t) email_to="${OPTARG}" ;; + s) subject="${OPTARG}" ;; + m) message="${OPTARG}" ;; + p) provider="${OPTARG}" ;; + k) key_file="${OPTARG}" ;; + h) + print_usage + exit 0 + ;; + *) + print_usage + exit 1 + ;; + esac +done + +# Validate required parameters +if [[ -z "$email_from" || -z "$email_name" || -z "$email_to" || -z "$subject" || -z "$message" || -z "$provider" ]]; then + echo "Error: Missing required parameter(s)" + print_usage + exit 1 +fi + +# Validate provider +if [[ "$provider" != "resend" && "$provider" != "sendgrid" ]]; then + echo "Error: Invalid provider '$provider'. Use 'resend' or 'sendgrid'" + exit 1 +fi + +# Default key file per provider if not specified +if [[ -z "$key_file" ]]; then + if [[ "$provider" == "resend" ]]; then + key_file="$default_resend_key_file" + else + key_file="$default_sendgrid_key_file" + fi +fi + +# Check key file validity +if [[ ! -f "$key_file" ]]; then + echo "API key file \"$key_file\" does not exist" + exit 1 +fi + +if [[ "$(stat -c "%a" "$key_file")" != "400" ]]; then + echo "Unsafe API key file permissions (should be 400)" + exit 1 +fi + +if [[ "$(wc -l < "$key_file")" != "1" ]]; then + echo "Wrong API key format (file must contain exactly one line)" + exit 1 +fi + +api_key="$(cat "$key_file")" + +# Dispatch to appropriate send function +if [[ "$provider" == "resend" ]]; then + send_email_resend +else + send_email_sendgrid +fi + diff --git a/sg-send-email.sh b/sg-send-email.sh deleted file mode 100755 index 675f0a7..0000000 --- a/sg-send-email.sh +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/bash -# Simple script to send email notifications via the Sendgrid API. - -# Default values -email_from="" -email_name="" -email_to="" -subject="" -message="" -sg_key_file="./sg_key" - -print_usage () { - echo "Usage: "$0" -f EMAIL_FROM -n EMAIL_NAME -t EMAIL_TO -s SUBJECT -m MESSAGE [-k SG_KEY_FILE]" - echo "EMAIL_FROM - sender's email address" - echo "EMAIL_NAME - sender's name" - echo "EMAIL_TO - recipient's email adress" - echo "SUBJECT - email subject" - echo "MESSAGE - email message" - echo "SG_KEY_FILE - a path to the file with Sendgrid API key (default: ./sg_key)" -} - -send_email () { - maildata='{"personalizations": [{"to": [{"email": "'${email_to}'"}]}],"from": {"email": "'${email_from}'", - "name": "'${email_name}'"},"subject": "'${subject}'","content": [{"type": "text/plain", "value": "'${message}'"}]}' - - curl -X "POST" "https://api.sendgrid.com/v3/mail/send" \ - -H "Authorization: Bearer $sg_key" \ - -H "Content-Type: application/json" \ - -d "$maildata" -} - -while getopts "f:n:t:s:m:k:h" opt -do - case $opt in - f) - email_from="${OPTARG}";; - n) - email_name="${OPTARG}";; - t) - email_to="${OPTARG}";; - s) - subject="${OPTARG}";; - m) - message="${OPTARG}";; - k) - sg_key_file="${OPTARG}";; - h) - print_usage - exit 3 - ;; - esac -done - -if [[ ! -f $sg_key_file ]]; then - echo "API key file \"$sg_key_file\" does not exist" - exit 1 -fi - -if [[ "$(stat -c "%a" $sg_key_file)" != "400" ]]; then - echo "Unsafe API key file permissions" - exit 1 -fi - -if [[ "$(wc -l $sg_key_file | cut -d" " -f1)" != "1" ]]; then - echo "Wrong API key format" - exit 1 -fi - -sg_key="$(cat $sg_key_file)" -send_email