Skip to content

Instantly share code, notes, and snippets.

@1d10t
Last active June 24, 2025 10:39
Show Gist options
  • Save 1d10t/3a84035f4d518f50b1ebaf09d565f3d2 to your computer and use it in GitHub Desktop.
Save 1d10t/3a84035f4d518f50b1ebaf09d565f3d2 to your computer and use it in GitHub Desktop.
ubuntu network manager dispatcher proxy auto setup
#!/bin/bash
# /etc/NetworkManager/dispatcher.d/90-proxy-autoset
IFACE="$1"
STATUS="$2"
USER_NAME="serg"
USER_ID=$(id -u "$USER_NAME")
run_as_user() {
sudo -u "$USER_NAME" \
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$USER_ID/bus" \
"$@"
}
update_hosts_entry() {
local hostname="$1" # пример: myserver.local
local ip="$2" # пример: $GATEWAY
local hosts_file="/etc/hosts"
# Проверка на пустые аргументы
if [[ -z "$hostname" || -z "$ip" ]]; then
echo "update_hosts_entry: hostname or ip not provided"
return 1
fi
# Создание бэкапа
cp "$hosts_file" "$hosts_file.bak"
# Удалить существующие строки с этим hostname
sed -i "/[[:space:]]$hostname$/d" "$hosts_file"
# Добавить новую строку
echo "$ip $hostname" >> "$hosts_file"
echo "update_hosts_entry: set $hostname -> $ip"
}
set_apt_proxy() {
local mode="$1" # "on" или "off"
local apt_proxy_file="/etc/apt/apt.conf.d/01proxy"
if [[ "$mode" == "on" ]]; then
local proxy_host="$2"
local proxy_port="$3"
if [[ -z "$proxy_host" || -z "$proxy_port" ]]; then
echo "set_apt_proxy: host or port not specified for 'on' mode"
return 1
fi
local proxy_url="http://$proxy_host:$proxy_port"
{
echo "Acquire::http::Proxy \"$proxy_url/\";"
echo "Acquire::https::Proxy \"$proxy_url/\";"
} > "$apt_proxy_file"
echo "set_apt_proxy: enabled $proxy_url"
elif [[ "$mode" == "off" ]]; then
rm -f "$apt_proxy_file"
echo "set_apt_proxy: proxy disabled"
else
echo "set_apt_proxy: unknown mode '$mode'"
return 1
fi
}
set_env_proxy() {
local mode="$1" # "on" или "off"
local proxy_host="$2"
local proxy_port="$3"
local proxy_url="http://$proxy_host:$proxy_port"
local env_file="/etc/environment"
if [[ "$mode" == "on" ]]; then
# Удалить старые переменные, если есть
sed -i '/^http_proxy=/d' "$env_file"
sed -i '/^https_proxy=/d' "$env_file"
# Добавить новые
{
echo "http_proxy=\"$proxy_url/\""
echo "https_proxy=\"$proxy_url/\""
} >> "$env_file"
export http_proxy="$proxy_url/"
export https_proxy="$proxy_url/"
echo "set_env_proxy: enabled $proxy_url"
elif [[ "$mode" == "off" ]]; then
sed -i '/^http_proxy=/d' "$env_file"
sed -i '/^https_proxy=/d' "$env_file"
unset http_proxy
unset https_proxy
echo "set_env_proxy: disabled"
else
echo "set_env_proxy: unknown mode '$mode'"
return 1
fi
}
LOG="/var/log/proxy-autoset.log"
echo "$(date): Interface=$IFACE, Status=$STATUS" >> "$LOG"
# Проверяем, что интерфейс — это Wi-Fi (wlp2s0) и статус — "up"
if [ "$IFACE" = "wlp2s0" ] && [ "$STATUS" = "up" ]; then
# Определим SSID
SSID=$(iwgetid -r)
# Получим IP шлюза
GATEWAY=$(ip route | grep default | grep "$IFACE" | awk '{print $3}')
echo "$(date): SSID=$SSID, Gateway=$GATEWAY" >> "$LOG"
# Пример логики: если определённый SSID и шлюз, установить прокси
if [ "$SSID" = "MOTOx113" ] || [ "$SSID" = "HONORx113" ]; then
PROXY_PORT=8117
PROXY_HOST="privoxy.local"
echo "$(date): Setting WORK proxy" >> "$LOG"
# Установка системного прокси (для GNOME)
run_as_user gsettings set org.gnome.system.proxy mode 'manual'
run_as_user gsettings set org.gnome.system.proxy.http host "$PROXY_HOST"
run_as_user gsettings set org.gnome.system.proxy.http port $PROXY_PORT
run_as_user gsettings set org.gnome.system.proxy.https host "$PROXY_HOST"
run_as_user gsettings set org.gnome.system.proxy.https port $PROXY_PORT
#
set_apt_proxy on "$PROXY_HOST" $PROXY_PORT
#
set_env_proxy on "$PROXY_HOST" $PROXY_PORT
#
update_hosts_entry "$PROXY_HOST" "$GATEWAY"
else
echo "$(date): Disabling proxy" >> "$LOG"
#
run_as_user gsettings set org.gnome.system.proxy mode 'none'
#
set_env_proxy off
#
set_apt_proxy off
fi
if [ "$SSID" = "MOTOx113" ]; then
update_hosts_entry "moto50f.local" "$GATEWAY"
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment