DNS Manager - это легковесное клиент-серверное приложение на Go для безопасного управления DNS-серверами
операционной системы посредством редактирования конфигурации /etc/resolv.conf.
Проект реализован в виде единого бинарного файла (Unified Binary), который предоставляет CLI-интерфейс как для запуска gRPC-сервера, так и для клиентского управления им.
- Атомарная запись: Обновление файла конфигурации происходит через временный файл и системный вызов
os.Rename. Система гарантированно не останется с поврежденным конфигом при сбоях питания или падении процесса. - Сохранность данных: Парсер изменяет исключительно директивы
nameserver, оставляя пользовательские комментарии и системные настройки (например,search,options) в исходном виде. - Потокобезопасность: Вся бизнес-логика защищена мьютексами (
sync.RWMutex), что исключает состояние гонки при конкурентных запросах к gRPC API. - Graceful Shutdown: Сервер корректно обрабатывает системные сигналы (
SIGTERM,SIGINT) и дожидается завершения активных соединений перед остановкой. - Чистая Архитектура: Разделение на порты и адаптеры (Hexagonal Architecture) позволяет легко тестировать бизнес-логику изолированно от сети и файловой системы.
Для работы с проектом потребуется Go 1.26 и утилита make.
В проекте настроен Makefile для автоматизации рутинных задач. Описание доступных команд:
make tools- устанавливает все необходимые зависимости для разработки и кодогенерации (плагиныprotoc,protolint,grpcurlиgolangci-lint). Убедитесь, что у вас установлен системный компиляторprotoc.make protobuf- компилирует файлы контрактовproto/dns/v1/dns.protoв исходный код Go (создает gRPC-клиенты и стабы сервера).make protolint- проверяет стиль написания.protoфайлов с помощьюprotolint.make lint- запускает строгую проверку исходного кода линтеромgolangci-lintв соответствии с конфигурацией.golangci.yaml.make test- запускает все юнит-тесты и интеграционные E2E тесты с включенным детектором гонки данных (-race).
# 1. Установите инструменты и зависимости
make tools
# 2. Сгенерируйте gRPC код
make protobuf
# 3. Соберите бинарный файл
go build -o dns-manager ./cmd/dns-managerПриложение предоставляет единую точку входа со встроенной справочной системой (Cobra CLI). Для получения справки по любой команде используйте флаг --help.
По умолчанию сервер пытается изменять системный /etc/resolv.conf, для чего требуются права суперпользователя (sudo).
Для локального тестирования предусмотрен флаг --config.
# Запуск в на порту 50051 (требует root)
sudo ./dns-manager server 50051
# Запуск с файлом конфига, куда будем писать
touch test_resolv.conf
./dns-manager server 50051 --config ./test_resolv.confКлиент позволяет управлять запущенным сервером по сети. По умолчанию клиент обращается к localhost:50051, но адрес
можно переопределить глобальным флагом -s или --server.
# Добавить новый DNS-сервер
./dns-manager client add 8.8.8.8
# Удалить DNS-сервер
./dns-manager client remove 8.8.8.8
# Получить список текущих серверов
./dns-manager client list
# Пример управления удаленным сервером
./dns-manager client list --server 192.168.1.100:50051Проект покрыт изолированными юнит-тестами и полноценным интеграционным E2E-тестом. Интеграционный тест разворачивает gRPC-сервер в памяти на динамическом порту, подключает к нему клиента и проводит полный цикл проверки бизнес-логики над временным файлом.
Для запуска тестов используйте:
make test