Найти тему
Nuances of programming

Как спроектировать REST API для выполнения системных команд с помощью Actix Rust

Оглавление

Источник: Nuances of Programming

Привет! Сегодня я расскажу, как создать REST API для выполнения системных команд на вашем сервере с помощью метода, которым пользуются известные компании.

Представьте, что вы переместили свою базу данных на другой сервер, отличный от вашего внутреннего сервера, и хотите теперь управлять сервером баз данных через внутренний API. Для этого нужно создать демона на сервере баз данных.

Шаг первый  —  подбираем зависимости

Начнем с того, что добавим в проект несколько зависимостей:

Расскажу вкратце об этих зависимостях, а также о том, как они будут использоваться.

  • Actix  —  это фреймворк для нашего REST API.
  • serde необходим для сериализации и десериализации.
  • simple_logger и log нужны для ведения журнала.
  • последний, pam  —  для аутентификации пользователя.

Шаг второй  —  поднимаем и запускаем простой сервер

Буду следовать следующим строкам кода, как советует документация:

Обзор архитектуры
Обзор архитектуры

Если все пройдет как надо, вы увидите лог, похожий на мой:

логи терминала
логи терминала

Реализация очень простая, но, полагаю, для базового уровня Actix этого достаточно:

Такое файловое дерево я использую для данного проекта. Надеюсь, вас не смущают моды, которые у меня стоят.

Шаг третий  —  создаем функцию для валидации пользователя

Для этого я применю pam crate. С помощью этого метода вызывающий API может проверить, имеет ли пользователь доступ к серверу или нет:

Шаг четвертый  —  создаем функцию для исполнения команд

Эта функция получает JSON-запрос с именем пользователя и паролем и возвращать логический результат.

Оба этих метода будут совместно использовать корневой путь serv.

Шаг пятый  —  создаем основную функцию

Все основные функции реализованы. Теперь нужно установить связь с сервером.

Простое объяснение выполненного

Всё взято из документации.

Метод run() возвращает экземпляр типа Server. Методы этого типа могут применяться для управления http-сервером.

pause()  —  приостанавливает прием входящих соединений.

resume()  —  возобновляет прием входящих соединений.

stop()  —  останавливает обработку входящих соединений, останавливает всех работников и осуществляет выход из системы.

Из-за дерева файлов mod executor должен быть устроен так, как показано ниже. В противном случае созданные нами методы окажутся непригодными.

mod executor {
pub mod validate_password;
pub mod execute;
}

Для каждой из функций созданы две службы. Таким образом, каждая из них будет действовать на адресе 127.0.0.1:8088/serv/.

Здесь определены десять рабочих потоков, вызывающих некоторые системные команды, выполнение которых может занять значительное время. После создания воркеров каждый из них получает отдельный экземпляр приложения для обработки запросов, устраняя время ожидания.

Actix может ждать запросов на поддержание соединения. Поведение соединения keep_alive определяется настройками сервера. Из документации:

  • 75, Some(75), KeepAlive::Timeout(75)  —  таймеру keep alive предоставлено 75 секунд.
  • None или KeepAlive::Disabled  —  keep aliveотключен.
  • KeepAlive::Tcp(75)  —  задействованы параметры сокета SO_KEEPALIVE.

Запустим, наконец, приложение:

cargo run

Заключение

Этот API создавался для удаленного управления серверным API. Поэтому для выполнения Linux-команд не требуется SSH.

Надеюсь, эта статья поможет вам в работе с Rust и Actix. Спасибо, что прочитали!

Читайте также:

Читайте нас в Telegram, VK

Перевод статьи: Asel Siriwardena, “How to Build a REST API using Actix Rust to Execute System Commands — A Step-by-Step Guide”