#!/bin/bash #install sshpass if not installed if [ $(dpkg-query -W -f='${Status}' sshpass 2>/dev/null | grep -c "ok installed") -eq 0 ]; then apt update && apt-get install sshpass; fi set -a # export source config.txt set +a # stop exporting DATE="$(date +%Y-%m-%d_%H-%M-%S)" echo $DATE #1. We are on the source (e.g. main) #systemctl is-active --quiet platform5.service && systemctl stop platform5 #systemctl is-active --quiet platform6.service && systemctl stop platform6 if [[ "$PLATFORM_STATUS" == 1 ]]; then echo "PLATFORM_STATUS=$PLATFORM_STATUS" echo "Stopping $PLATFORM_SERVICE_NAME" systemctl stop $PLATFORM_SERVICE_NAME fi download_platform(){ # sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "sed -i \"s|\(jdbc:postgresql://localhost:5432/\)[^?]*|\1${DESTINATION_DB_NAME}|g\" $DESTINATION_PLATFORM_PATH/conf/db.conf" sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "systemctl is-active --quiet platform5.service && systemctl stop platform5 " sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "mv /home/platform5-server /home/platform5-server-${DATE} && \ mkdir -p /home/platform5-server/bin/storage/1" PLATFORM_DIRS="conf,lib,opencv,webapp,scripts,monitoring,SERVER_config.txt" IFS=',' read -r -a array <<< "$PLATFORM_DIRS" for folder in "${array[@]}"; do yes | sshpass -p "$DESTINATION_PASSWORD" rsync -e "ssh -p $DESTINATION_PORT -o StrictHostKeyChecking=no" -avz --ignore-existing $SOURCE_PLATFORM_PATH/$folder $DESTINATION_USER@$DESTINATION_IP:$DESTINATION_PLATFORM_PATH/ done yes | sshpass -p "$DESTINATION_PASSWORD" rsync -e "ssh -p $DESTINATION_PORT -o StrictHostKeyChecking=no" -avz --ignore-existing $SOURCE_PLATFORM_PATH/bin/server $DESTINATION_USER@$DESTINATION_IP:$DESTINATION_PLATFORM_PATH/bin/ } DB_BACKUP=$SOURCE_DB_NAME.migration.$DATE.sql echo "backup name:" $DB_BACKUP db_backup() { echo EVENT_STORE=$EVENT_STORE if [[ "$EVENT_STORE" == 0 ]]; then echo Making backup without event_store PGPASSWORD="$SOURCE_DB_PASSWORD" pg_dump -Fc -T event_store -U postgres $SOURCE_DB_NAME > /var/backups/$DB_BACKUP elif [[ "$EVENT_STORE" == 1 ]]; then echo Making backup with event_store PGPASSWORD="$SOURCE_DB_PASSWORD" pg_dump -Fc -U postgres $SOURCE_DB_NAME > /var/backups/$DB_BACKUP elif [[ "$EVENT_STORE" == 2 ]]; then echo "don't make db backup" else echo "EVENT_STORE value must be 0 or 1 or 2" && exit fi } send_backup() { if [[ "$EVENT_STORE" == 0 ]] || [[ "$EVENT_STORE" == 1 ]]; then echo "Sending db backup to destination server" cd /var/backups/ && yes | sshpass -p "$DESTINATION_DATABASE_PASSWORD" scp -P $DESTINATION_DATABASE_PORT -o StrictHostKeyChecking=no $DB_BACKUP $DESTINATION_DATABASE_USER@$DESTINATION_DATABASE_IP:/var/backups cd - else echo "no backup, nothing to send" fi } create_and_restore_db() { if [[ "$EVENT_STORE" == 0 ]] || [[ "$EVENT_STORE" == 1 ]]; then sed -e "s/DESTINATION_DB_NAME/${DESTINATION_DB_NAME}/" \ -e "s/DESTINATION_POSTGRES_PASSWORD/${DESTINATION_POSTGRES_PASSWORD}/"\ -e "s/DB_BACKUP/${DB_BACKUP}/"\ -e "s/J_RESTORE/${J_RESTORE}/"\ create_db.sh.template > create_db.sh sshpass -p "$DESTINATION_DATABASE_PASSWORD" ssh -p $DESTINATION_DATABASE_PORT $DESTINATION_DATABASE_USER@$DESTINATION_DATABASE_IP 'bash -s' < create_db.sh fi } change_config(){ # sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "sed -i \"s|\(jdbc:postgresql://localhost:5432/\)[^?]*|\1${DESTINATION_DB_NAME}|g\" $DESTINATION_PLATFORM_PATH/conf/db.conf" #db wo host sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "sed -i \"s|\(jdbc:postgresql://[^:/]*:[0-9]*/\)[^?]*|\1${DESTINATION_DB_NAME}|g\" $DESTINATION_PLATFORM_PATH/conf/db.conf" #sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "sed -i \"s|\(jdbc:postgresql://[^:/]*:[0-9]*/\)[^?]*|\1${INTERNAL_DATABASE_IP}:5432/${DESTINATION_DB_NAME}|g\" $DESTINATION_PLATFORM_PATH/conf/db.conf" #change host sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "sed -i \"s|\\(jdbc:postgresql://\\)[^:/]*|\\1${INTERNAL_DATABASE_IP}|g\" $DESTINATION_PLATFORM_PATH/conf/db.conf" #change database name sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "sed -i \"s|\\(jdbc:postgresql://[^:/]*:[0-9]*/\\)[^?]*|\\1${DESTINATION_DB_NAME}|g\" $DESTINATION_PLATFORM_PATH/conf/db.conf" #change database password sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT "sed -i '0,/password = \".*\"/s//password = \"${DESTINATION_POSTGRES_PASSWORD}\"/' $DESTINATION_PLATFORM_PATH/conf/db.conf" } evt_full_rsync(){ echo "send $SOURCE_EVT to the destination" yes | sshpass -p "$DESTINATION_PASSWORD" rsync -e "ssh -p $DESTINATION_PORT -o StrictHostKeyChecking=no" -avz --ignore-existing $SOURCE_PLATFORM_PATH/bin/storage/1/$SOURCE_EVT/ $DESTINATION_USER@$DESTINATION_IP:$DESTINATION_PLATFORM_PATH/bin/storage/1/$SOURCE_EVT/ } evt_common_files_rsync(){ echo "send files from $SOURCE_EVT/common to the destination" yes | sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT -o StrictHostKeyChecking=no "mkdir -p $DESTINATION_PLATFORM_PATH/bin/storage/1/$SOURCE_EVT/common/" sshpass -p "$DESTINATION_PASSWORD" rsync -e "ssh -p $DESTINATION_PORT -o StrictHostKeyChecking=no" -avz --ignore-existing -f"- */" -f"+ *" $SOURCE_PLATFORM_PATH/bin/storage/1/$SOURCE_EVT/common/ $DESTINATION_USER@$DESTINATION_IP:$DESTINATION_PLATFORM_PATH/bin/storage/1/$SOURCE_EVT/common/ } evt_specific_dirs_rsync(){ IFS=',' read -r -a array <<< "$FOLDERS" for folder in "${array[@]}"; do yes | sshpass -p "$DESTINATION_PASSWORD" rsync -e "ssh -p $DESTINATION_PORT -o StrictHostKeyChecking=no" -avz --ignore-existing $SOURCE_PLATFORM_PATH/bin/storage/1/$SOURCE_EVT/$folder $DESTINATION_USER@$DESTINATION_IP:$DESTINATION_PLATFORM_PATH/bin/storage/1/$SOURCE_EVT/ done } fonts_rsync(){ echo "Send fonts to the destination" yes | sshpass -p "$DESTINATION_PASSWORD" ssh $DESTINATION_USER@$DESTINATION_IP -p $DESTINATION_PORT -o StrictHostKeyChecking=no "mkdir -p $DESTINATION_PLATFORM_PATH/bin/storage/1/fonts/" sshpass -p "$DESTINATION_PASSWORD" rsync -e "ssh -p $DESTINATION_PORT" -avz --ignore-existing $SOURCE_PLATFORM_PATH/bin/storage/1/fonts/ $DESTINATION_USER@$DESTINATION_IP:$DESTINATION_PLATFORM_PATH/bin/storage/1/fonts/ } if [[ "$DOWNLOAD_PLATFORM" == 1 ]]; then echo "Download platform from source" download_platform elif [[ "$EVT_COMMON" == 0 ]]; then echo "No download platform" fi db_backup send_backup create_and_restore_db change_config fonts_rsync if [[ "$EVT_COMMON" == 0 ]]; then echo "Download only files from evt/common" evt_common_files_rsync elif [[ "$EVT_COMMON" == 1 ]]; then echo "Download full evt" evt_full_rsync elif [[ "$EVT_COMMON" == 2 ]]; then echo "Nothing to download from storage" elif [[ "$EVT_COMMON" == 3 ]]; then echo "Download specified folders" evt_specific_dirs_rsync else echo "EVENT_COMMON value must be 0 or 1 or 2" && exit fi mv config.txt config.txt.$DATE cp config.txt.template config.txt if [[ "$PLATFORM_STATUS" == 1 ]]; then echo "start $PLATFORM_SERVICE_NAME" systemctl start $PLATFORM_SERVICE_NAME fi