2024-06-05 09:16:29 +02:00
#!/bin/bash
2024-08-22 20:38:29 +02:00
echo "------------------------- START ----------------------------"
2024-06-05 20:27:24 +02:00
echo "Starting the WireGuard Dashboard Docker container."
2024-06-05 09:16:29 +02:00
2024-08-22 20:38:29 +02:00
ensure_installation( ) {
# When using a custom directory to store the files, this part moves over and makes sure the installation continues.
echo "Checking if everything is present."
2024-08-23 14:46:41 +02:00
if [ -z " $( ls -A " ${ WGDASH } " ) " ] ; then
2024-08-22 20:38:29 +02:00
echo "Detected empty directory, moving over..."
2024-08-23 14:46:41 +02:00
mv /setup/app/* " ${ WGDASH } "
python3 -m venv " ${ WGDASH } " /src/venv
2024-08-22 20:38:29 +02:00
. " ${ WGDASH } /src/venv/bin/activate "
2024-08-23 14:46:41 +02:00
chmod +x " ${ WGDASH } " /src/wgd.sh
cd " ${ WGDASH } " /src || exit
2024-08-22 20:38:29 +02:00
./wgd.sh install
echo "Looks like the installation succesfully moved over."
else
echo "Looks like everything is present."
fi
# This first step is to ensure the wg0.conf file exists, and if not, then its copied over from the ephemeral container storage.
if [ ! -f "/etc/wireguard/wg0.conf" ] ; then
echo "Standard wg0 Configuration file not found, grabbing template."
cp "/setup/conf/wg0.conf" "/etc/wireguard/wg0.conf"
2024-08-22 23:31:47 +02:00
echo "Setting a secure private key."
2024-08-23 14:46:41 +02:00
local privateKey
privateKey = $( wg genkey)
2024-08-22 23:31:47 +02:00
sed -i " s|^PrivateKey = $|PrivateKey = ${ privateKey } |g " /etc/wireguard/wg0.conf
sed -i " s|^PrivateKey *=.* $|PrivateKey = ${ privateKey } |g " /etc/wireguard/wg0.conf
echo "Done setting template."
2024-08-22 20:38:29 +02:00
else
2024-08-22 23:31:47 +02:00
echo "Existing wg0 configuration file found, using that."
2024-08-22 20:38:29 +02:00
fi
}
2024-08-20 16:58:25 +02:00
# === CLEAN UP ===
2024-06-05 20:27:24 +02:00
clean_up( ) {
2024-08-22 20:38:29 +02:00
printf "\n------------------------ CLEAN UP --------------------------\n"
2024-06-08 13:30:24 +02:00
# Cleaning out previous data such as the .pid file and starting the WireGuard Dashboard. Making sure to use the python venv.
2024-06-05 20:27:24 +02:00
echo "Looking for remains of previous instances..."
2024-08-20 16:58:25 +02:00
local pid_file = " ${ WGDASH } /src/gunicorn.pid "
2024-08-23 14:46:41 +02:00
if [ -f " $pid_file " ] ; then
2024-08-20 19:58:30 +02:00
echo "Found old pid file, removing."
2024-08-20 16:58:25 +02:00
rm $pid_file
2024-06-05 20:27:24 +02:00
else
2024-08-20 16:58:25 +02:00
echo "No pid remains found, continuing."
fi
2024-08-22 20:38:29 +02:00
# Also check for Python caches (pycache) inspired by https://github.com/shuricksumy
2024-08-20 16:58:25 +02:00
local pycache = " ${ WGDASH } /src/__pycache__ "
if [ -d " $pycache " ] ; then
local pycache_filecount = $( find " $pycache " -maxdepth 1 -type f | wc -l)
if [ " $pycache_filecount " -gt 0 ] ; then
echo "Found old pycaches, removing."
rm -rf " $pycache " /*
else
echo "No pycaches found, continuing."
fi
else
echo "No pycaches found, continuing."
2024-06-05 20:27:24 +02:00
fi
2024-08-22 23:31:47 +02:00
local logdir = " ${ WGDASH } /src/log "
echo "Cleaning log directory."
2024-08-22 23:58:29 +02:00
find /opt/wireguarddashboard/src/log -name 'access_*.log' -exec rm { } +
find /opt/wireguarddashboard/src/log -name 'error_*.log' -exec rm { } +
2024-08-22 23:31:47 +02:00
echo "Removed unneeded logs!"
2024-08-22 20:38:29 +02:00
}
#update_checker() {
#if [ "$update" = "yes" ]; then
# echo "Activating Python venv and executing the WireGuard Dashboard service."
# . "${WGDASH}/src/venv/bin/activate"
# cd "${WGDASH}"/src || exit
# bash wgd.sh update
#else
# echo "Auto Updater disabled"
#fi
#}
# === SET ENV VARS ===
set_envvars( ) {
printf "\n------------- SETTING ENVIRONMENT VARIABLES ----------------\n"
# If the timezone is different, for example in North-America or Asia.
2024-08-23 14:46:41 +02:00
if [ " ${ tz } " != " $( cat /etc/localtime) " ] ; then
2024-08-22 20:38:29 +02:00
echo "Changing timezone."
ln -sf /usr/share/zoneinfo/" ${ tz } " /etc/localtime
echo " ${ tz } " > /etc/timezone
2024-08-22 23:58:29 +02:00
else
echo "Timezone is set correctly."
2024-08-22 20:38:29 +02:00
fi
# Changing the DNS used for clients and the dashboard itself.
if [ " ${ global_dns } " != " $( grep "peer_global_dns = " /opt/wireguarddashboard/src/wg-dashboard.ini | awk '{print $NF}' ) " ] ; then
echo "Changing default dns."
#sed -i "s/^DNS = .*/DNS = ${global_dns}/" /etc/wireguard/wg0.conf # Uncomment if you want to have DNS on server-level.
sed -i " s/^peer_global_dns = .*/peer_global_dns = ${ global_dns } / " /opt/wireguarddashboard/src/wg-dashboard.ini
2024-08-22 23:58:29 +02:00
else
echo "DNS is set correctly."
2024-08-22 20:38:29 +02:00
fi
# Setting the public IP of the WireGuard Dashboard container host. If not defined, it will trying fetching it using a curl to ifconfig.me.
if [ " ${ public_ip } " = "0.0.0.0" ] ; then
default_ip = $( curl -s ifconfig.me)
echo " Trying to fetch the Public-IP using ifconfig.me: ${ default_ip } "
sed -i " s/^remote_endpoint = .*/remote_endpoint = ${ default_ip } / " /opt/wireguarddashboard/src/wg-dashboard.ini
elif [ " ${ public_ip } " != " $( grep "remote_endpoint = " /opt/wireguarddashboard/src/wg-dashboard.ini | awk '{print $NF}' ) " ] ; then
echo " Setting the Public-IP using given variable: ${ public_ip } "
sed -i " s/^remote_endpoint = .*/remote_endpoint = ${ public_ip } / " /opt/wireguarddashboard/src/wg-dashboard.ini
fi
2024-06-05 20:27:24 +02:00
}
2024-06-05 09:16:29 +02:00
2024-08-20 16:58:25 +02:00
# === CORE SERVICES ===
2024-06-05 09:16:29 +02:00
start_core( ) {
2024-08-22 20:38:29 +02:00
printf "\n---------------------- STARTING CORE -----------------------\n"
2024-08-20 16:58:25 +02:00
2024-06-05 20:27:24 +02:00
echo "Activating Python venv and executing the WireGuard Dashboard service."
2024-08-20 16:58:25 +02:00
. " ${ WGDASH } " /src/venv/bin/activate
cd " ${ WGDASH } " /src || return # If changing the directory fails (permission or presence error), then bash will exist this function, causing the WireGuard Dashboard to not be succesfully launched.
2024-06-05 20:27:24 +02:00
bash wgd.sh start
2024-08-22 20:38:29 +02:00
# Isolated peers feature, first converting the existing configuration files and the given names to arrays.
2024-08-20 19:58:30 +02:00
local configurations = ( /etc/wireguard/*)
IFS = ',' read -r -a do_isolate <<< " ${ isolate } "
non_isolate = ( )
2024-06-06 00:12:11 +02:00
2024-08-22 20:38:29 +02:00
# Checking if there are matches between the two arrays.
2024-08-20 19:58:30 +02:00
for config in " ${ configurations [@] } " ; do
local config = $( echo " $config " | sed -e 's|.*/etc/wireguard/||' -e 's|\.conf$||' )
found = false
for interface in " ${ do_isolate [@] } " ; do
if [ [ " $config " = = " $interface " ] ] ; then
found = true
break
fi
done
if [ " $found " = false ] ; then
non_isolate += ( " $config " )
2024-06-08 13:30:24 +02:00
fi
2024-08-20 19:58:30 +02:00
done
2024-06-06 00:12:11 +02:00
2024-08-22 20:38:29 +02:00
# Isolating the matches.
2024-08-20 19:58:30 +02:00
for interface in " ${ do_isolate [@] } " ; do
2024-08-22 23:31:47 +02:00
if [ " $interface " = "none" ] ; then
echo " Found: $interface , stopping isolation checking. "
break
2024-08-20 19:58:30 +02:00
else
2024-08-22 23:31:47 +02:00
if [ -f " /etc/wireguard/ ${ interface } .conf " ] ; then
echo "Isolating interface:" $interface
upblocking = $( grep -c " PostUp = iptables -I FORWARD -i ${ interface } -o ${ interface } -j DROP " /etc/wireguard/${ interface } .conf)
downblocking = $( grep -c " PreDown = iptables -D FORWARD -i ${ interface } -o ${ interface } -j DROP " /etc/wireguard/${ interface } .conf)
if [ " $upblocking " -lt 1 ] && [ " $downblocking " -lt 1 ] ; then
sed -i " /PostUp =/a PostUp = iptables -I FORWARD -i ${ interface } -o ${ interface } -j DROP " /etc/wireguard/${ interface } .conf
sed -i " /PreDown =/a PreDown = iptables -D FORWARD -i ${ interface } -o ${ interface } -j DROP " /etc/wireguard/${ interface } .conf
fi
else
echo " Configuration for $interface does not seem to exist, continuing. "
fi
2024-08-20 19:58:30 +02:00
fi
done
2024-08-22 20:38:29 +02:00
# Removing isolation for the configurations that did not match.
2024-08-20 19:58:30 +02:00
for interface in " ${ non_isolate [@] } " ; do
if [ -f " /etc/wireguard/ ${ interface } .conf " ] ; then
2024-08-20 20:54:49 +02:00
echo "Removing Isolation if present for:" $interface
2024-08-20 19:58:30 +02:00
sed -i " /PostUp = iptables -I FORWARD -i ${ interface } -o ${ interface } -j DROP/d " /etc/wireguard/${ interface } .conf
sed -i " /PreDown = iptables -D FORWARD -i ${ interface } -o ${ interface } -j DROP/d " /etc/wireguard/${ interface } .conf
else
echo " Configuration for $interface does not seem to exist, continuing. "
fi
done
2024-06-06 00:12:11 +02:00
2024-08-22 20:38:29 +02:00
# The following section takes care of enabling wireguard interfaces on startup. Using arrays and given arguments.
2024-08-20 16:58:25 +02:00
IFS = ',' read -r -a enable_array <<< " ${ enable } "
2024-08-20 19:58:30 +02:00
2024-08-20 16:58:25 +02:00
for interface in " ${ enable_array [@] } " ; do
2024-08-22 23:31:47 +02:00
if [ " $interface " = "none" ] ; then
echo " Found: $interface , stopping enabling checking. "
break
2024-08-20 16:58:25 +02:00
else
2024-08-22 23:31:47 +02:00
echo "Enabling interface:" $interface
local fileperms = $( stat -c "%a" /etc/wireguard/${ interface } .conf)
if [ $fileperms -eq 644 ] ; then
echo "Configuration is world accessible, adjusting."
chmod 600 " /etc/wireguard/ ${ interface } .conf "
fi
if [ -f " /etc/wireguard/ ${ interface } .conf " ] ; then
wg-quick up $interface
else
echo " No corresponding configuration file found for $interface doing nothing. "
fi
2024-08-20 16:58:25 +02:00
fi
done
2024-06-05 09:16:29 +02:00
}
2024-08-20 16:58:25 +02:00
# === CLEAN UP ===
2024-06-05 09:16:29 +02:00
ensure_blocking( ) {
2024-08-22 20:38:29 +02:00
printf "\n-------------- ENSURING CONTAINER CONTINUATION -------------\n"
2024-06-07 13:25:46 +02:00
sleep 1s
2024-06-05 20:27:24 +02:00
echo "Ensuring container continuation."
2024-06-05 09:16:29 +02:00
# This function checks if the latest error log is created and tails it for docker logs uses.
2024-08-20 16:58:25 +02:00
if find "/opt/wireguarddashboard/src/log" -mindepth 1 -maxdepth 1 -type f | read -r; then
latestErrLog = $( find /opt/wireguarddashboard/src/log -name "error_*.log" | head -n 1)
latestAccLog = $( find /opt/wireguarddashboard/src/log -name "access_*.log" | head -n 1)
2024-08-22 20:38:29 +02:00
2024-06-07 13:25:46 +02:00
tail -f " ${ latestErrLog } " " ${ latestAccLog } "
2024-06-05 09:16:29 +02:00
fi
# Blocking command in case of erroring. So the container does not quit.
sleep infinity
2024-06-05 20:27:24 +02:00
}
# Execute functions for the WireGuard Dashboard services, then set the environment variables
2024-08-22 20:38:29 +02:00
ensure_installation
2024-06-05 20:27:24 +02:00
clean_up
2024-08-22 20:38:29 +02:00
#update_checker
start_core
2024-08-22 23:58:29 +02:00
set_envvars
2024-06-05 20:27:24 +02:00
ensure_blocking