mirror of
https://github.com/pivpn/pivpn.git
synced 2024-12-18 10:50:16 +00:00
129 lines
3.5 KiB
Bash
Executable file
129 lines
3.5 KiB
Bash
Executable file
#!/bin/bash
|
|
# PiVPN: Backup Script
|
|
|
|
### Constants
|
|
# Find the rows and columns. Will default to 80x24 if it can not be detected.
|
|
screen_size="$(stty size 2> /dev/null || echo 24 80)"
|
|
rows="$(echo "${screen_size}" | awk '{print $1}')"
|
|
columns="$(echo "${screen_size}" | awk '{print $2}')"
|
|
|
|
# Divide by two so the dialogs take up half of the screen, which looks nice.
|
|
r=$((rows / 2))
|
|
c=$((columns / 2))
|
|
# Unless the screen is tiny
|
|
r=$((r < 20 ? 20 : r))
|
|
c=$((c < 70 ? 70 : c))
|
|
|
|
backupdir=pivpnbackup
|
|
date="$(date +%Y%m%d-%H%M%S)"
|
|
setupVarsFile="setupVars.conf"
|
|
setupConfigDir="/etc/pivpn"
|
|
|
|
CHECK_PKG_INSTALLED='dpkg-query -s'
|
|
|
|
### Functions
|
|
err() {
|
|
echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $*" >&2
|
|
}
|
|
|
|
checkbackupdir() {
|
|
# Disabling shellcheck error $install_home sourced from $setupVars
|
|
# shellcheck disable=SC2154
|
|
mkdir -p "${install_home}/${backupdir}"
|
|
}
|
|
|
|
backup_openvpn() {
|
|
openvpndir=/etc/openvpn
|
|
ovpnsdir="${install_home}/ovpns"
|
|
backupzip="${date}-pivpnovpnbackup.tgz"
|
|
|
|
checkbackupdir
|
|
# shellcheck disable=SC2210
|
|
tar czpf "${install_home}/${backupdir}/${backupzip}" "${openvpndir}" \
|
|
"${ovpnsdir}" > /dev/null 2>&1
|
|
|
|
echo -e "Backup created in ${install_home}/${backupdir}/${backupzip} "
|
|
echo -e "To restore the backup, follow instructions at:"
|
|
echo -ne "https://docs.pivpn.io/openvpn/"
|
|
echo -e "#migrating-pivpn-openvpn"
|
|
}
|
|
|
|
backup_wireguard() {
|
|
wireguarddir=/etc/wireguard
|
|
configsdir="${install_home}/configs"
|
|
backupzip="${date}-pivpnwgbackup.tgz"
|
|
|
|
checkbackupdir
|
|
tar czpf "${install_home}/${backupdir}/${backupzip}" "${wireguarddir}" \
|
|
"${configsdir}" > /dev/null 2>&1
|
|
|
|
echo -e "Backup created in ${install_home}/${backupdir}/${backupzip} "
|
|
echo -e "To restore the backup, follow instructions at:"
|
|
echo -ne "https://docs.pivpn.io/wireguard/"
|
|
echo -e "#migrating-pivpn-wireguard"
|
|
}
|
|
|
|
### Script
|
|
if [[ -r "${setupConfigDir}/wireguard/${setupVarsFile}" ]] \
|
|
&& [[ -r "${setupConfigDir}/openvpn/${setupVarsFile}" ]]; then
|
|
# Two protocols have been installed, check if the script has passed
|
|
# an argument, otherwise ask the user which one he wants to remove
|
|
if [[ "$#" -ge 1 ]]; then
|
|
VPN="${1}"
|
|
echo "::: Backing up VPN: ${VPN}"
|
|
else
|
|
chooseVPNCmd=(whiptail
|
|
--backtitle "Setup PiVPN"
|
|
--title "Backup"
|
|
--separate-output
|
|
--radiolist "Both OpenVPN and WireGuard are installed, choose a VPN to \
|
|
backup (press space to select):"
|
|
"${r}" "${c}" 2)
|
|
VPNChooseOptions=(WireGuard "" on
|
|
OpenVPN "" off)
|
|
|
|
if VPN="$("${chooseVPNCmd[@]}" "${VPNChooseOptions[@]}" 2>&1 \
|
|
> /dev/tty)"; then
|
|
echo "::: Backing up VPN: ${VPN}"
|
|
VPN="${VPN,,}"
|
|
else
|
|
err "::: Cancel selected, exiting...."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
setupVars="${setupConfigDir}/${VPN}/${setupVarsFile}"
|
|
else
|
|
if [[ -r "${setupConfigDir}/wireguard/${setupVarsFile}" ]]; then
|
|
setupVars="${setupConfigDir}/wireguard/${setupVarsFile}"
|
|
elif [[ -r "${setupConfigDir}/openvpn/${setupVarsFile}" ]]; then
|
|
setupVars="${setupConfigDir}/openvpn/${setupVarsFile}"
|
|
fi
|
|
fi
|
|
|
|
if [[ ! -f "${setupVars}" ]]; then
|
|
err "::: Missing setup vars file!"
|
|
exit 1
|
|
fi
|
|
|
|
# shellcheck disable=SC1090
|
|
source "${setupVars}"
|
|
|
|
if [[ "${PLAT}" == 'Alpine' ]]; then
|
|
CHECK_PKG_INSTALLED='apk --no-cache info -e'
|
|
fi
|
|
|
|
if [[ "${EUID}" -ne 0 ]]; then
|
|
if ${CHECK_PKG_INSTALLED} sudo &> /dev/null; then
|
|
export SUDO="sudo"
|
|
else
|
|
err "::: Please install sudo or run this as root."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [[ "${VPN}" == "wireguard" ]]; then
|
|
backup_wireguard
|
|
else
|
|
backup_openvpn
|
|
fi
|