RemotesRun/run_all.sh
2024-09-30 00:03:47 +02:00

89 lines
3.4 KiB
Bash
Executable file

#!/bin/bash -i
# ____ _ ____
# | _ \ ___ _ __ ___ ___ | |_ ___ ___| _ \ _ _ _ __
# | |_) / _ \ '_ ` _ \ / _ \| __/ _ \/ __| |_) | | | | '_ \
# | _ < __/ | | | | | (_) | || __/\__ \ _ <| |_| | | | |
# |_| \_\___|_| |_| |_|\___/ \__\___||___/_| \_\\__,_|_| |_|
#
# Run several scripts on remote servers automatically.
# Copyright (C) 2022 Ad5001
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
echo ""
set +o history
# Cd into the directory of the library
script="$(readlink $0)"
if [ -z "$script" ]; then script="$0"; fi
cd "$(dirname "$script")"
# Importing common functions.
. ./libraries/common.sh
# Set remotes to remote folder to "remotes folder if not set.
if [ -z "$REMOTES" ]; then
REMOTES="remotes"
fi
for folder in "$REMOTES"/*; do
host=$(basename "$folder")
# Check for powerline.
if [ -z "$(which powerline)" ]; then
prompt="${L_GREEN_BG}${BLACK_FG} Password for ${RESET_INVERT}${ORANGE_BG}$host ${RESET} 🔑 > "
else
prompt="${L_GREEN_BG}${BLACK_FG} Password for ${ORANGE_FG}${INVERT}${RESET_INVERT}${ORANGE_BG}${YELLOW_FG}$host ${GRAY_FG}${INVERT}${RESET_INVERT}${GRAY_BG}${BLACK_FG} 🔑 ${INVERT}${RESET}"
fi
echo -e -n "$prompt"
read -s pswd
echo -e "\n"
dependencies="libraries/common.sh"
full_script=""
port="$(cat $folder/port)"
# Executing all necessary scripts
if [[ $pswd != "skip" ]]; then
for script in $folder/*.sh; do
scriptname=$(basename $script)
scriptname=${scriptname//_/ }
scriptname=${scriptname::-3}
# Get dependencies from file.
dependencies="$dependencies $(sed -n '2p' $script | grep "# Requires: " | cut -d" " -f3-)"
# Create the full script string using the box command to signal the new script
full_script="${full_script}box 'Executing script $scriptname...'
$(cat "$script" | awk '$1 != "#" && $1 != ""')
"
done
# Removing duplicate dependencies
dependencies="$(echo $dependencies | awk '!a[$0]++')"
# Finish the script
full_script="$(cat $dependencies | awk '$1 != "#" && $1 != ""')
$full_script"
# Save temporary askpass for the password.
echo -e '#!/bin/bash\necho "'$pswd'"' > tmp.sh
chmod +x tmp.sh
export SSH_ASKPASS="$(pwd)/tmp.sh"
export SSH_ASKPASS_REQUIRE="force"
# Transmit the script
echo "$full_script" | ssh -q $host -p $port "tee run.sh" 1>/dev/null
info "Transmitted script"
# Run and remove it.
ssh $host -p $port PASSWORD="$pswd" "bash run.sh && rm run.sh"
## Interactive shell does not work.
#ssh -t $host PASSWORD="$pswd" "bash -i run.sh && rm run.sh"
rm tmp.sh
else
box "Skipping ${host}..."
fi
done