Last active
June 24, 2025 10:39
-
-
Save 1d10t/3a84035f4d518f50b1ebaf09d565f3d2 to your computer and use it in GitHub Desktop.
ubuntu network manager dispatcher proxy auto setup
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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