2024-06-05 09:16:29 +02:00
#!/bin/bash
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-20 16:58:25 +02:00
# === CLEAN UP ===
2024-06-05 20:27:24 +02:00
clean_up( ) {
2024-08-20 16:58:25 +02:00
echo "--------------------- CLEAN UP -----------------------"
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 "
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
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-20 20:54:49 +02:00
echo "Setting permissions to not be world-accesible."
chmod 640 /etc/wireguard/*
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-20 16:58:25 +02:00
echo "--------------------- STARTING CORE -----------------------"
2024-06-09 23:11:22 +02:00
# This first step is to ensure the wg0.conf file exists, and if not, then its copied over from the ephemeral container storage.
2024-06-08 13:30:24 +02:00
if [ ! -f "/etc/wireguard/wg0.conf" ] ; then
cp "/wg0.conf" "/etc/wireguard/wg0.conf"
2024-08-20 16:58:25 +02:00
echo "Standard WG0 Configuration file not found, grabbing template."
2024-06-08 13:30:24 +02:00
else
2024-08-20 16:58:25 +02:00
echo "Standard WG0 Configuration file found, using that."
2024-06-08 13:30:24 +02:00
fi
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-20 20:54:49 +02:00
# Isolated peers feature:
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-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-20 19:58:30 +02:00
for interface in " ${ do_isolate [@] } " ; do
if [ -f " /etc/wireguard/ ${ interface } .conf " ] ; then
echo "Isolating:" $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
done
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-20 16:58:25 +02:00
# The following section takes care of enabling wireguard interfaces on startup.
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
echo " Preference for $interface to be turned on found. "
if [ -f " /etc/wireguard/ ${ interface } .conf " ] ; then
echo "Found corresponding configuration file, activating..."
wg-quick up $interface
else
echo " No corresponding configuration file found for $interface doing nothing. "
fi
done
2024-06-05 09:16:29 +02:00
}
2024-08-20 16:58:25 +02:00
# === SET ENV VARS ===
2024-06-05 09:16:29 +02:00
set_envvars( ) {
2024-08-20 20:54:49 +02:00
echo "------------- SETTING ENVIRONMENT VARIABLES ----------------"
2024-06-05 09:16:29 +02:00
# If the timezone is different, for example in North-America or Asia.
2024-06-05 20:27:24 +02:00
if [ " ${ tz } " != " $( cat /etc/timezone) " ] ; then
echo "Changing timezone."
2024-06-05 09:16:29 +02:00
2024-06-06 16:11:49 +02:00
ln -sf /usr/share/zoneinfo/" ${ tz } " /etc/localtime
echo " ${ tz } " > /etc/timezone
2024-06-05 09:16:29 +02:00
fi
# Changing the DNS used for clients and the dashboard itself.
2024-08-20 16:58:25 +02:00
if [ " ${ global_dns } " != " $( grep "peer_global_dns = " /opt/wireguarddashboard/src/wg-dashboard.ini | awk '{print $NF}' ) " ] ; then
2024-06-05 20:27:24 +02:00
echo "Changing default dns."
2024-06-05 09:16:29 +02:00
2024-06-06 16:11:49 +02:00
#sed -i "s/^DNS = .*/DNS = ${global_dns}/" /etc/wireguard/wg0.conf # Uncomment if you want to have DNS on server-level.
2024-08-20 16:58:25 +02:00
sed -i " s/^peer_global_dns = .*/peer_global_dns = ${ global_dns } / " /opt/wireguarddashboard/src/wg-dashboard.ini
2024-06-05 09:16: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.
2024-06-08 13:30:24 +02:00
if [ " ${ public_ip } " = "0.0.0.0" ] ; then
2024-06-05 20:27:24 +02:00
default_ip = $( curl -s ifconfig.me)
echo " Trying to fetch the Public-IP using ifconfig.me: ${ default_ip } "
2024-06-05 09:16:29 +02:00
2024-08-20 16:58:25 +02:00
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
2024-06-05 20:27:24 +02:00
echo " Setting the Public-IP using given variable: ${ public_ip } "
2024-06-05 09:16:29 +02:00
2024-08-20 16:58:25 +02:00
sed -i " s/^remote_endpoint = .*/remote_endpoint = ${ public_ip } / " /opt/wireguarddashboard/src/wg-dashboard.ini
2024-06-05 09:16:29 +02:00
fi
}
2024-08-20 16:58:25 +02:00
# === CLEAN UP ===
2024-06-05 09:16:29 +02:00
ensure_blocking( ) {
2024-08-20 20:54:49 +02:00
echo "-------------- ENSURING CONTAINER CONTINUATION -------------"
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-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
clean_up
2024-08-20 20:54:49 +02:00
repair
2024-06-05 20:27:24 +02:00
start_core
set_envvars
ensure_blocking