Кроссплатформенный переключатель прокси-сервера на Python + Qt
Устав искать нормальный портативный инструмент для переключения между моим рабочим прокси-сервером и прямым подключением дома (который, к тому же, работал бы на Windows и Linux), я решил-таки запилить собственную тулзу для этих целей. Вооружившись Python и Qt, начал клепать код в VSCode… Что из этого вышло — читаем под катом.
Мотивация
Основной мотивацией для создания данного инструмента стало жуткое неудобство системных настроек прокси при работе из офиса и дома. Каждый раз приходилось лезть в настройки прокси, передвигать флажок… А, кроме того, еще удалять или скрывать системные переменные HTTP_PROXY (и им подобные), чтобы консольные приложения вроде git также слушались руля… Это на Винде. А на Линуксе так вообще веселая история: не все графические системы имеют встроенные утилиты для управления настройками прокси, и моя Kali Linux как раз такая. Приходится вручную комментировать / раскомментировать экспорты переменных среды (той же HTTP_PROXY) и перелогиниваться… Морока, одним словом.
Беглый (а затем и не очень беглый) поиск в гугле / яндексе результатов не дал: предлагаются в основном плагины для браузеров, переключающие прокси только для браузера (системные настройки не изменяются). Нормальной легковесной, портативной, бесплатной, кроссплатформенной тулзы с графическим интерфейсом мне найти так и не удалось. И тогда, кряхтя и сопя от борьбы с ленью, открыл я VSCode и создал новый проект на Python…
Требования к инструменту
Почиркав в блокноте наброски GUI, я определился со следующими минимальными требованиями к приложению:
включение / выключение прокси-сервера одной кнопкой (с соответствующими автоматическими изменениями переменных среды)
настройки прокси должны быть постоянными, т.е. записываться в соответствующие системные файлы и оставаться после перезагрузки
возможность раздельных настроек для HTTP, HTTPS, FTP и (что бывает нужно для Unix) — RSYNC
импорт / экспорт настроек в / из файла
возможность подробного лога для отладки
Сразу скажу, что особой эстетичнойти GUI в минимальных требованиях не числилось. Главное — простота и интуитивность. Это так, чтобы вы меня не слишком терроризировали за дизайнерские способности :)
Где хранятся системные настройки прокси
Windows
На машинах под Windows настройки прокси хранятся (как и большинство других системных настроек) в реестре. А именно, в ветке HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings (таким образом, эти настройки задаются пользователем и не являются общесистемными).
Настройки прокси в реестре Windows. Зеленым выделены основные переменные.
За настройки прокси отвечают две переменные в реестре:
ProxyServer: адрес и порт прокси сервера, разделенные двоеточием (у моего прокси, например, адрес = 192.168.1.10, порт = 3128)ProxyOverride: разделенные запятыми адреса и маски адресов, которые должны работать по прямому соединению, минуя прокси (обычно сюда добавляется, что означает localhost, т.е. не использовать прокси для локальных соединений)
Кроме того, многие приложения (в основном, консольные) берут настройки прокси не из реестра, а из специальных переменных среды:
HTTP_PROXY— прокси для HTTP-соединений в форматеhttp://[[USER]:[PASSWORD]@]HOST:PORT(например, «http://user: pass@192.168.1.1:3000» или если без прокси-аутентификации: «http://192.168.1.1:3000»)HTTPS_PROXY— то же для HTTPS-соединенийFTP_PROXY— то же для FTP-соединенийRSYNC_PROXY— то же для RSYNC-соединенийNO_PROXY— адреса в обход прокси (аналог вышеуказанногоProxyOverride)
Переменные среды в Windows: определены переменные, относящиеся к настройкам прокси
Linux и MacOS
В Unix’ах, как водится, все настройки хранятся в обычных файлах: пользовательские — в директории текущего пользователя (~/...), системные — в директории /etc.
Настройки прокси задаются такими же переменными среды для соответствующих соединений (HTTP_PROXY и т.д.) + NO_PROXY для прямых адресов + иногда может встречаться переменная ALL_PROXY, задающая настройки для всех типов соединений.
Вот неполный перечень файлов, в которых обычно задаются переменные среды и иные настройки:
Пользователь:
~/.profile, ~/.bashrc, ~/.bash_profile, ~/.zshrc, ~/.cshrc, ~/.tcshrc, ~/.loginСистема:
/etc/environment, /etc/profile, /etc/bashrc, /etc/bash.bashrc, /etc/zsh/zshrc, /etc/csh.cshrc, /etc/csh.login
А еще, конечно, переменные могут определяться в скриптах, расположенных в специальных директориях: /etc/init.d, /etc/environment.d и т.п. Простор фантазии, в двух словах!
Структура приложения
➯ Приложение размещено на Github.
Структура приложения (писалось на Python 3.10) получилась такая:
