Необходимо реализовать сервис и клиент для выставления имя хоста в Linux, а также изменение списка DNS серверов.
Сервис работает по протоколу gRPC, но также реализует и REST http API сгенерированный с помощью grpc-gateway.
CLI Клиент использует фреймворк Cobra и может отправлять команды сервису (как через REST API, так и по grpc):
Реализуются следующие команды:
- Получить имя хоста
- Изменить имя хоста
- Получить список глобальных DNS
- Добавить DNS сервера в список
- Удалить DNS сервера из списка
Makefile содержит необходимые скрипты
make server client
Компиляция производит два исполняемых файла: bin/client
и bin/server
.
Для изменения DNS серверов редактируется файл /etc/systemd/resolved.conf
, а также перезагружается systemd-resolved
, в связи с чем в примере bin/server
запускается через sudo
# Запустить gRPC сервер на порте 1212 (по умолчанию 1234)
sudo bin/server --grpc-port 1212
# Другие флаги:
# --rest-port Порт на котором будет запущен REST http-gateway
# --grpc-logs Выводит также логи самой библиотеки grpc
# --help Больше информации о CLI
При запуске сервера вместе с REST gateway через флаг --rest-port
на указанном порту будет запущен сервер с API сгенерированным через grpc-gateway.
localhost:xxxx/api/*
- API эндпоинтыlocalhost:xxxx/
- Swagger документация API
bin/client --addr 0.0.0.0:1234 hostname # Получить имя хоста
bin/client --addr 0.0.0.0:1234 hostname set new-hotname # Изменить имя хоста
bin/client --addr 0.0.0.0:1234 dns # Получить список DNS серверов
bin/client --addr 0.0.0.0:1234 dns add 1.1.1.1 8.8.8.8 # Добавить DNS сервера
bin/client --addr 0.0.0.0:1234 dns remove 1.1.1.1 8.8.8.8 # Удалить DNS сервера
# Другие флаги
# --rest Клиент отправляет REST запросы вместо gRPC
# --timeout Выставляет timeout на запросы (по умолчанию 1 секунда)
# --help Больше информации о CLI
Для изменения и получения имени хоста исполняется команда hostnamectl
Для изменения же DNS серверов редактируется файл /etc/systemd/resolved.conf
, после чего перезапускается systemd-resolved
для применения изменений. Так что до тех пор пока дистрибутив работает через systemd, все должно работать.