refac: new logic to detecting a Wireguard interface

This commit is contained in:
Daan Selen
2025-09-21 21:57:28 +02:00
parent 5ccfe07e12
commit 0d814ec03c

View File

@@ -13,15 +13,15 @@ hash_password() {
set_ini() { set_ini() {
local section="$1" key="$2" value="$3" local section="$1" key="$2" value="$3"
local current_value local current_value
# Add section if it doesn't exist # Add section if it doesn't exist
grep -q "^\[${section}\]" "$config_file" \ grep -q "^\[${section}\]" "$config_file" \
|| printf "\n[%s]\n" "${section}" >> "$config_file" || printf "\n[%s]\n" "${section}" >> "$config_file"
# Check current value if key exists # Check current value if key exists
if grep -q "^[[:space:]]*${key}[[:space:]]*=" "$config_file"; then if grep -q "^[[:space:]]*${key}[[:space:]]*=" "$config_file"; then
current_value=$(grep "^[[:space:]]*${key}[[:space:]]*=" "$config_file" | cut -d= -f2- | xargs) current_value=$(grep "^[[:space:]]*${key}[[:space:]]*=" "$config_file" | cut -d= -f2- | xargs)
# Don't display actual value if it's a password field # Don't display actual value if it's a password field
if [[ "$key" == *"password"* ]]; then if [[ "$key" == *"password"* ]]; then
if [ "$current_value" = "$value" ]; then if [ "$current_value" = "$value" ]; then
@@ -40,7 +40,7 @@ set_ini() {
fi fi
else else
sed -i "/^\[${section}\]/a ${key} = ${value}" "$config_file" sed -i "/^\[${section}\]/a ${key} = ${value}" "$config_file"
# Don't display actual value if it's a password field # Don't display actual value if it's a password field
if [[ "$key" == *"password"* ]]; then if [[ "$key" == *"password"* ]]; then
echo "- Added new setting $key (value hidden)" echo "- Added new setting $key (value hidden)"
@@ -61,58 +61,58 @@ echo "Starting the WGDashboard Docker container."
ensure_installation() { ensure_installation() {
echo "Quick-installing..." echo "Quick-installing..."
# Make the wgd.sh script executable. # Make the wgd.sh script executable.
chmod +x "${WGDASH}"/src/wgd.sh chmod +x "${WGDASH}"/src/wgd.sh
cd "${WGDASH}"/src || exit cd "${WGDASH}"/src || exit
# Github issue: https://github.com/donaldzou/WGDashboard/issues/723 # Github issue: https://github.com/donaldzou/WGDashboard/issues/723
echo "Checking for stale pids..." echo "Checking for stale pids..."
if [[ -f ${WGDASH}/src/gunicorn.pid ]]; then if [[ -f ${WGDASH}/src/gunicorn.pid ]]; then
echo "Found stale pid, removing..." echo "Found stale pid, removing..."
rm ${WGDASH}/src/gunicorn.pid rm ${WGDASH}/src/gunicorn.pid
fi fi
# Removing clear shell command from the wgd.sh script to enhance docker logging. # Removing clear shell command from the wgd.sh script to enhance docker logging.
echo "Removing clear command from wgd.sh for better Docker logging." echo "Removing clear command from wgd.sh for better Docker logging."
sed -i '/clear/d' ./wgd.sh sed -i '/clear/d' ./wgd.sh
# Create required directories and links # Create required directories and links
if [ ! -d "/data/db" ]; then if [ ! -d "/data/db" ]; then
echo "Creating database dir" echo "Creating database dir"
mkdir -p /data/db mkdir -p /data/db
fi fi
if [ ! -d "${WGDASH}/src/db" ]; then if [ ! -d "${WGDASH}/src/db" ]; then
ln -s /data/db "${WGDASH}/src/db" ln -s /data/db "${WGDASH}/src/db"
fi fi
if [ ! -f "${config_file}" ]; then if [ ! -f "${config_file}" ]; then
echo "Creating wg-dashboard.ini file" echo "Creating wg-dashboard.ini file"
touch "${config_file}" touch "${config_file}"
fi fi
if [ ! -f "${WGDASH}/src/wg-dashboard.ini" ]; then if [ ! -f "${WGDASH}/src/wg-dashboard.ini" ]; then
ln -s "${config_file}" "${WGDASH}/src/wg-dashboard.ini" ln -s "${config_file}" "${WGDASH}/src/wg-dashboard.ini"
fi fi
# Create the Python virtual environment. # Create the Python virtual environment.
. "${WGDASH}/src/venv/bin/activate" . "${WGDASH}/src/venv/bin/activate"
# Use the bash interpreter to install WGDashboard according to the wgd.sh script. # Use the bash interpreter to install WGDashboard according to the wgd.sh script.
/bin/bash ./wgd.sh install /bin/bash ./wgd.sh install
echo "Looks like the installation succeeded. Moving on." echo "Looks like the installation succeeded. Moving on."
# Setup WireGuard if needed # Setup WireGuard if needed
if [ ! -f "/etc/wireguard/wg0.conf" ]; then if [ -z "$(ls -A /etc/wireguard)" ]; then
cp -a "/configs/wg0.conf.template" "/etc/wireguard/wg0.conf" cp -a "/configs/wg0.conf.template" "/etc/wireguard/wg0.conf"
echo "Setting a secure private key." echo "Setting a secure private key."
local privateKey local privateKey
privateKey=$(wg genkey) privateKey=$(wg genkey)
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." echo "Done setting template."
else else
echo "Existing wg0 configuration file found, using that." echo "Existing wg0 configuration file found, using that."
@@ -121,51 +121,51 @@ ensure_installation() {
set_envvars() { set_envvars() {
printf "\n------------- SETTING ENVIRONMENT VARIABLES ----------------\n" printf "\n------------- SETTING ENVIRONMENT VARIABLES ----------------\n"
# Check if config file is empty # Check if config file is empty
if [ ! -s "${config_file}" ]; then if [ ! -s "${config_file}" ]; then
echo "Config file is empty. Creating initial structure." echo "Config file is empty. Creating initial structure."
fi fi
echo "Checking basic configuration:" echo "Checking basic configuration:"
set_ini Peers peer_global_dns "${global_dns}" set_ini Peers peer_global_dns "${global_dns}"
if [ -z "${public_ip}" ]; then if [ -z "${public_ip}" ]; then
public_ip=$(curl -s ifconfig.me) public_ip=$(curl -s ifconfig.me)
echo "Automatically detected public IP: ${public_ip}" echo "Automatically detected public IP: ${public_ip}"
fi fi
set_ini Peers remote_endpoint "${public_ip}" set_ini Peers remote_endpoint "${public_ip}"
set_ini Server app_port "${wgd_port}" set_ini Server app_port "${wgd_port}"
# Account settings - process all parameters # Account settings - process all parameters
[[ -n "$username" ]] && echo "Configuring user account:" [[ -n "$username" ]] && echo "Configuring user account:"
# Basic account variables # Basic account variables
[[ -n "$username" ]] && set_ini Account username "${username}" [[ -n "$username" ]] && set_ini Account username "${username}"
if [[ -n "$password" ]]; then if [[ -n "$password" ]]; then
echo "- Setting password" echo "- Setting password"
set_ini Account password "$(hash_password "${password}")" set_ini Account password "$(hash_password "${password}")"
fi fi
# Additional account variables # Additional account variables
[[ -n "$enable_totp" ]] && set_ini Account enable_totp "${enable_totp}" [[ -n "$enable_totp" ]] && set_ini Account enable_totp "${enable_totp}"
[[ -n "$totp_verified" ]] && set_ini Account totp_verified "${totp_verified}" [[ -n "$totp_verified" ]] && set_ini Account totp_verified "${totp_verified}"
[[ -n "$totp_key" ]] && set_ini Account totp_key "${totp_key}" [[ -n "$totp_key" ]] && set_ini Account totp_key "${totp_key}"
# Welcome session # Welcome session
[[ -n "$welcome_session" ]] && set_ini Other welcome_session "${welcome_session}" [[ -n "$welcome_session" ]] && set_ini Other welcome_session "${welcome_session}"
# If username and password are set but welcome_session isn't, disable it # If username and password are set but welcome_session isn't, disable it
if [[ -n "$username" && -n "$password" && -z "$welcome_session" ]]; then if [[ -n "$username" && -n "$password" && -z "$welcome_session" ]]; then
set_ini Other welcome_session "false" set_ini Other welcome_session "false"
fi fi
# Autostart WireGuard # Autostart WireGuard
if [[ -n "$wg_autostart" ]]; then if [[ -n "$wg_autostart" ]]; then
echo "Configuring WireGuard autostart:" echo "Configuring WireGuard autostart:"
set_ini WireGuardConfiguration autostart "${wg_autostart}" set_ini WireGuardConfiguration autostart "${wg_autostart}"
fi fi
# Email (check if any settings need to be configured) # Email (check if any settings need to be configured)
email_vars=("email_server" "email_port" "email_encryption" "email_username" "email_password" "email_from" "email_template") email_vars=("email_server" "email_port" "email_encryption" "email_username" "email_password" "email_from" "email_template")
for var in "${email_vars[@]}"; do for var in "${email_vars[@]}"; do
@@ -174,12 +174,12 @@ set_envvars() {
break break
fi fi
done done
# Email (iterate through all possible fields) # Email (iterate through all possible fields)
email_fields=("server:email_server" "port:email_port" "encryption:email_encryption" email_fields=("server:email_server" "port:email_port" "encryption:email_encryption"
"username:email_username" "email_password:email_password" "username:email_username" "email_password:email_password"
"send_from:email_from" "email_template:email_template") "send_from:email_from" "email_template:email_template")
for field_pair in "${email_fields[@]}"; do for field_pair in "${email_fields[@]}"; do
IFS=: read -r field var <<< "$field_pair" IFS=: read -r field var <<< "$field_pair"
[[ -n "${!var}" ]] && set_ini Email "$field" "${!var}" [[ -n "${!var}" ]] && set_ini Email "$field" "${!var}"
@@ -189,7 +189,7 @@ set_envvars() {
# Start service and monitor logs # Start service and monitor logs
start_and_monitor() { start_and_monitor() {
printf "\n---------------------- STARTING CORE -----------------------\n" printf "\n---------------------- STARTING CORE -----------------------\n"
# Due to some instances complaining about this, making sure its there every time. # Due to some instances complaining about this, making sure its there every time.
mkdir -p /dev/net mkdir -p /dev/net
mknod /dev/net/tun c 10 200 mknod /dev/net/tun c 10 200
@@ -198,15 +198,15 @@ start_and_monitor() {
# Actually starting WGDashboard # Actually starting WGDashboard
echo "Activating Python venv and executing the WireGuard Dashboard service." echo "Activating Python venv and executing the WireGuard Dashboard service."
bash ./wgd.sh start bash ./wgd.sh start
# Wait a second before continuing, to give the python program some time to get ready. # Wait a second before continuing, to give the python program some time to get ready.
sleep 1 sleep 1
echo -e "\nEnsuring container continuation." echo -e "\nEnsuring container continuation."
# Find and monitor log file # Find and monitor log file
local logdir="${WGDASH}/src/log" local logdir="${WGDASH}/src/log"
latestErrLog=$(find "$logdir" -name "error_*.log" -type f -print | sort -r | head -n 1) latestErrLog=$(find "$logdir" -name "error_*.log" -type f -print | sort -r | head -n 1)
# Only tail the logs if they are found # Only tail the logs if they are found
if [ -n "$latestErrLog" ]; then if [ -n "$latestErrLog" ]; then
tail -f "$latestErrLog" & tail -f "$latestErrLog" &
@@ -221,4 +221,4 @@ start_and_monitor() {
# Main execution flow # Main execution flow
ensure_installation ensure_installation
set_envvars set_envvars
start_and_monitor start_and_monitor