server.bash
#!/usr/bin/env bash
##
# Work with remote servers
function server(){
run help server
}
##
# Setup current directory to host config & setup files for connection to remove server
#
function server_setup(){
# Confirm directory to write config files
# Write default excludes file
# Ask for SSH user, SSH Domain, Remote folder
# Write file with ssh settings
# Suggest editing excludes file
dir="$(get_server_dir)"
read -p "Setup in dir '${dir}'? " yn
if [[ "${yn}" != "y" ]]; then
echo "Answered no...";
return;
fi
excludes="${dir}/excludes"
echo -e ".git" >> "${excludes}"
echo "Default excludes appended to '${excludes}'..."
read -e -p "SSH User: " sshUser;
read -e -p "SSH Domain: " sshDomain;
read -e -p "Remote Directory: " remoteDirectory;
read -e -p "Relative Local Directory: " localDirectory;
settings="${dir}/settings"
echo "#!/bin/bash" >> "$settings"
echo "sshUser=\"${sshUser}\"" >> "$settings"
echo "sshDomain=\"${sshDomain}\"" >> "$settings"
echo "remoteDirectory=\"${remoteDirectory}\"" >> "$settings"
echo "localDirectory=\"${localDirectory}\"" >> "$settings"
echo "settings" >> ".gitignore"
echo "SSH Settings written to '$settings'";
echo "You may want to edit the excludes file.";
}
##
# Download files from remote server
#
function server_pull(){
dir="$(get_server_dir)"
dl=$(dirname "$dir")
file="${1}"
msg "\nsettings dir:$dir";
msg "\nproject dir:$dl";
msg "\nrelative download dir:$file";
if [[ -z "$file" || ! -e "${dl}/${file}" ]]; then
read -e -p "Path, relative to '${dl}/':" file
fi
#if [[ -z "$file" || ! -e "${dir}/../${file}" ]]; then
# echo "${dir}/../${file} does not exist";
# return;
#fi
source "${dir}/settings"
ssh="${sshUser}@${sshDomain}:${remoteDirectory}"
echo ""
echo "doing dry rsync"
rsync -avn --exclude-from "${dir}/excludes" "${ssh}/${file}" "${dl}/${file}"
read -p "Continue with download into '${dl}/${file}'? " yn
if [[ "${yn}" != "y" ]]; then
return;
fi
rsync -av --exclude-from "${dir}/excludes" "${ssh}/${file}" "${dl}/${file}"
}
##
# Upload local files to a remote server
# add `remoteTestDirectory="~/pub/test.example.com"` to `.server/settings`
#
function server_test(){
dir="$(get_server_dir)"
read -p "Push from dir '${dir}'? " yn
if [[ "${yn}" != "y" ]]; then
echo "Answered no...";
return;
fi
source "${dir}/settings"
remoteDirectory="$remoteTestDirectory"
read -p "Push to '${remoteDirectory}'? " yn
if [[ "${yn}" != "y" ]]; then
echo "Answered no...";
return;
fi
ssh="${sshUser}@${sshDomain}:${remoteDirectory}"
rsync --copy-dirlinks -av --exclude-from "${dir}/excludes" --delete "${dir}/${localDirectory}/" "${ssh}"
ssh "${sshUser}@${sshDomain}" \
"if [[ -f ${remoteDirectory}/release/post-upload.php ]];then
echo ""
echo "Running ${remoteDirectory}/release/post-upload.php"
echo ""
source ~/.bashrc
php ${remoteDirectory}/release/post-upload.php
fi"
}
##
# Upload local files to a remote server
function server_push(){
dir="$(get_server_dir)"
read -p "Push from dir '${dir}'? " yn
if [[ "${yn}" != "y" ]]; then
echo "Answered no...";
return;
fi
source "${dir}/settings"
ssh="${sshUser}@${sshDomain}:${remoteDirectory}"
rsync --copy-dirlinks -av --exclude-from "${dir}/excludes" --delete "${dir}/${localDirectory}/" "${ssh}"
ssh "${sshUser}@${sshDomain}" \
"if [[ -f ${remoteDirectory}/release/post-upload.php ]];then
echo ""
echo "Running ${remoteDirectory}/release/post-upload.php"
echo ""
source ~/.bashrc
php ${remoteDirectory}/release/post-upload.php
fi"
}
##
# Connect to remote server and copy site files to backup dir on the server
function server_backup(){
dir="$(get_server_dir)"
read -p "Run remote backup from '${dir}'? " yn
if [[ "${yn}" != "y" ]]; then
echo "Answered no...";
return;
fi
source "${dir}/settings"
ssh="${sshUser}@${sshDomain}:${remoteDirectory}"
ssh "${sshUser}@${sshDomain}" \
"
echo '${remoteDirectory}/../backup/'
if [[ -d ${remoteDirectory}/../backup/ ]];then
source ~/.bashrc
backupDir=\"\$(realpath ${remoteDirectory}/../backup/)/$(basename ${remoteDirectory})-$(date +%m-%d-%Y)\"
echo \"backup up to \$backupDir\"
cp -r \"\$(realpath ${remoteDirectory})\" \"\${backupDir}\"
fi"
}
##
# Connect to remote server and interface over ssh terminal
function server_ssh(){
dir="$(get_server_dir)"
read -p "Connect from dir '${dir}'? " yn
if [[ "${yn}" != "y" ]]; then
echo "Answered no...";
return;
fi
source "${dir}/settings"
ssh "${sshUser}@${sshDomain}"
# ssh "${sshUser}@${sshDomain}"
# i need a -t
#"cd ${remoteDirectory}; bash --login;"
}
##
# Create an ssh key & upload the public copy to your server"
function server_ssh_key(){
dir="$(get_server_dir)"
read -p "Upload SSH key for '${dir}'? " yn
if [[ "${yn}" != "y" ]]; then
echo "Answered no...";
return;
fi
source "${dir}/settings"
read -e -p "SSH Keys Directory (leave blank for ~/.ssh): " keysDir
read -e -p "Key Name: " keyName
if [[ -z "$keysDir" ]]; then
keysDir="$HOME/.ssh"
fi
keysDir="$(expand_tilde_path "${keysDir}")"
prompt_yes_or_no "Generate New Key?" yesno
if [[ $yesno ]];then
echo "Generating SSH Key"
ssh-keygen -t ed25519 -f "${keysDir}/${keyName}"
fi
echo "Uploading SSH Key"
ssh-copy-id -i "${keysDir}/${keyName}.pub" "${sshUser}@${sshDomain}"
echo "Adding Key"
ssh-add "${keysDir}/${keyName}"
}