|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +### https://github.com/buildfoundation/mainframer |
| 4 | + |
| 5 | +# Copyright 2017 Juno, Inc. |
| 6 | + |
| 7 | +# Licensed under the Apache License, Version 2.0 (the "License"); |
| 8 | +# you may not use this file except in compliance with the License. |
| 9 | +# You may obtain a copy of the License at |
| 10 | + |
| 11 | +# http://www.apache.org/licenses/LICENSE-2.0 |
| 12 | + |
| 13 | +# Unless required by applicable law or agreed to in writing, software |
| 14 | +# distributed under the License is distributed on an "AS IS" BASIS, |
| 15 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 16 | +# See the License for the specific language governing permissions and |
| 17 | +# limitations under the License. |
| 18 | + |
| 19 | +set -e |
| 20 | + |
| 21 | +echo ":: mainframer v2.1.0" |
| 22 | +echo "" |
| 23 | + |
| 24 | +START_TIME="$(date +%s)" |
| 25 | + |
| 26 | +PROJECT_DIR="$(pwd)" |
| 27 | +PROJECT_DIR_NAME="$( basename "$PROJECT_DIR" )" |
| 28 | +PROJECT_DIR_ON_REMOTE_MACHINE="~/mainframer/$PROJECT_DIR_NAME" |
| 29 | + |
| 30 | +CONFIG_DIR="$PROJECT_DIR/.mainframer" |
| 31 | +CONFIG_FILE="$CONFIG_DIR/config" |
| 32 | +COMMON_IGNORE_FILE="$CONFIG_DIR/ignore" |
| 33 | +LOCAL_IGNORE_FILE="$CONFIG_DIR/localignore" |
| 34 | +REMOTE_IGNORE_FILE="$CONFIG_DIR/remoteignore" |
| 35 | + |
| 36 | +function readConfigProperty { |
| 37 | + grep "^${1}=" "$CONFIG_FILE" | cut -d'=' -f2 |
| 38 | +} |
| 39 | + |
| 40 | +REMOTE_MACHINE_CONFIG_PROPERTY="remote_machine" |
| 41 | +LOCAL_COMPRESS_LEVEL_CONFIG_PROPERTY="local_compression_level" |
| 42 | +REMOTE_COMPRESS_LEVEL_CONFIG_PROPERTY="remote_compression_level" |
| 43 | + |
| 44 | +if [ ! -f "$CONFIG_FILE" ]; then |
| 45 | + echo "Please create and fill $CONFIG_FILE." |
| 46 | + exit 1 |
| 47 | +fi |
| 48 | + |
| 49 | +REMOTE_MACHINE=$(readConfigProperty "$REMOTE_MACHINE_CONFIG_PROPERTY") |
| 50 | +LOCAL_COMPRESS_LEVEL=$(readConfigProperty "$LOCAL_COMPRESS_LEVEL_CONFIG_PROPERTY") |
| 51 | +REMOTE_COMPRESS_LEVEL=$(readConfigProperty "$REMOTE_COMPRESS_LEVEL_CONFIG_PROPERTY") |
| 52 | + |
| 53 | +if [ -z "$REMOTE_MACHINE" ]; then |
| 54 | + echo "Please specify \"$REMOTE_MACHINE_CONFIG_PROPERTY\" in $CONFIG_FILE." |
| 55 | + exit 1 |
| 56 | +fi |
| 57 | + |
| 58 | +if [ -z "$LOCAL_COMPRESS_LEVEL" ]; then |
| 59 | + LOCAL_COMPRESS_LEVEL=1 |
| 60 | +fi |
| 61 | + |
| 62 | +if [ -z "$REMOTE_COMPRESS_LEVEL" ]; then |
| 63 | + REMOTE_COMPRESS_LEVEL=1 |
| 64 | +fi |
| 65 | + |
| 66 | + |
| 67 | +REMOTE_COMMAND="$*" |
| 68 | +REMOTE_COMMAND_SUCCESSFUL="false" |
| 69 | + |
| 70 | +if [ -z "$REMOTE_COMMAND" ]; then |
| 71 | + echo "Please pass remote command." |
| 72 | + exit 1 |
| 73 | +fi |
| 74 | + |
| 75 | +function formatTime { |
| 76 | + local time=$1 |
| 77 | + |
| 78 | + local hours=$((time / 3600)) |
| 79 | + local minutes=$(((time % 3600) / 60)) |
| 80 | + local seconds=$((time % 60)) |
| 81 | + |
| 82 | + if [ "$hours" -eq "1" ]; then HOURS_LABEL="hour"; else HOURS_LABEL="hours"; fi |
| 83 | + if [ "$minutes" -eq "1" ]; then MINUTES_LABEL="minute"; else MINUTES_LABEL="minutes"; fi |
| 84 | + if [ "$seconds" -eq "1" ]; then SECONDS_LABEL="second"; else SECONDS_LABEL="seconds"; fi |
| 85 | + |
| 86 | + (( hours > 0 )) && printf "%d $HOURS_LABEL " ${hours} |
| 87 | + (( minutes > 0 )) && printf "%d $MINUTES_LABEL " ${minutes} |
| 88 | + (( seconds >= 0 )) && printf "%d $SECONDS_LABEL" ${seconds} |
| 89 | +} |
| 90 | + |
| 91 | +function syncBeforeRemoteCommand { |
| 92 | + echo "Sync local → remote machine..." |
| 93 | + startTime="$(date +%s)" |
| 94 | + |
| 95 | + COMMAND="rsync --archive --delete --rsync-path=\"mkdir -p \"$PROJECT_DIR_ON_REMOTE_MACHINE\" && rsync\" --compress-level=$LOCAL_COMPRESS_LEVEL " |
| 96 | + |
| 97 | + if [ -f "$COMMON_IGNORE_FILE" ]; then |
| 98 | + COMMAND+="--exclude-from='$COMMON_IGNORE_FILE' " |
| 99 | + fi |
| 100 | + |
| 101 | + if [ -f "$LOCAL_IGNORE_FILE" ]; then |
| 102 | + COMMAND+="--exclude-from='$LOCAL_IGNORE_FILE' " |
| 103 | + fi |
| 104 | + |
| 105 | + COMMAND+="--rsh ssh ./ $REMOTE_MACHINE:'$PROJECT_DIR_ON_REMOTE_MACHINE'" |
| 106 | + |
| 107 | + eval "$COMMAND" |
| 108 | + |
| 109 | + endTime="$(date +%s)" |
| 110 | + echo "Sync done: took $(formatTime $((endTime-startTime)))." |
| 111 | + echo "" |
| 112 | +} |
| 113 | + |
| 114 | +function executeRemoteCommand { |
| 115 | + echo "Executing command on remote machine…" |
| 116 | + echo "" |
| 117 | + startTime="$(date +%s)" |
| 118 | + |
| 119 | + set +e |
| 120 | + if ssh "$REMOTE_MACHINE" "echo 'set -e && cd '$PROJECT_DIR_ON_REMOTE_MACHINE' && echo \"$REMOTE_COMMAND\" && echo "" && $REMOTE_COMMAND' | bash" ; then |
| 121 | + REMOTE_COMMAND_SUCCESSFUL="true" |
| 122 | + fi |
| 123 | + set -e |
| 124 | + |
| 125 | + endTime="$(date +%s)" |
| 126 | + echo "" |
| 127 | + |
| 128 | + duration="$((endTime-startTime))" |
| 129 | + |
| 130 | + if [ "$REMOTE_COMMAND_SUCCESSFUL" == "true" ]; then |
| 131 | + echo "Execution done: took $(formatTime $duration)." |
| 132 | + else |
| 133 | + echo "Execution failed: took $(formatTime $duration)." |
| 134 | + fi |
| 135 | + |
| 136 | + echo "" |
| 137 | +} |
| 138 | + |
| 139 | +function syncAfterRemoteCommand { |
| 140 | + echo "Sync remote → local machine…" |
| 141 | + startTime="$(date +%s)" |
| 142 | + |
| 143 | + COMMAND="rsync --archive --delete --compress-level=$REMOTE_COMPRESS_LEVEL " |
| 144 | + |
| 145 | + if [ -f "$COMMON_IGNORE_FILE" ]; then |
| 146 | + COMMAND+="--exclude-from='$COMMON_IGNORE_FILE' " |
| 147 | + fi |
| 148 | + |
| 149 | + if [ -f "$REMOTE_IGNORE_FILE" ]; then |
| 150 | + COMMAND+="--exclude-from='$REMOTE_IGNORE_FILE' " |
| 151 | + fi |
| 152 | + |
| 153 | + COMMAND+="--rsh ssh $REMOTE_MACHINE:'$PROJECT_DIR_ON_REMOTE_MACHINE'/ ./" |
| 154 | + eval "$COMMAND" |
| 155 | + |
| 156 | + endTime="$(date +%s)" |
| 157 | + echo "Sync done: took $(formatTime $((endTime-startTime)))." |
| 158 | +} |
| 159 | + |
| 160 | +pushd "$PROJECT_DIR" > /dev/null |
| 161 | + |
| 162 | +syncBeforeRemoteCommand |
| 163 | +executeRemoteCommand |
| 164 | +syncAfterRemoteCommand |
| 165 | + |
| 166 | +popd > /dev/null |
| 167 | + |
| 168 | +FINISH_TIME="$(date +%s)" |
| 169 | +echo "" |
| 170 | + |
| 171 | +DURATION="$((FINISH_TIME-START_TIME))" |
| 172 | + |
| 173 | +if [ "$REMOTE_COMMAND_SUCCESSFUL" == "true" ]; then |
| 174 | + echo "Success: took $(formatTime $DURATION)." |
| 175 | +else |
| 176 | + echo "Failure: took $(formatTime $DURATION)." |
| 177 | + exit 1 |
| 178 | +fi |
0 commit comments