Skip to content

ilindan-dev/dns-manager

Repository files navigation

DNS Manager

Go Version Build Status Lint Architecture

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

В проекте настроен 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

About

Lightweight client-server application for secure, atomic OS-level DNS management (/etc/resolv.conf) built with Hexagonal Architecture.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors