module
0.0.0-20240514121623-71dd397b0380
Repository: https://github.com/artenso/command-runner.git
Documentation: pkg.go.dev
# README
Command-Runner
Command-Runner - приложение для запуска bash скриптов.
Запуск
Приложение запускается командой:
docker-compose up -d
Описание
Приложение поддерживает gRPC и REST API через gRPC-Gateway
Для этого был написан proto файл со следующими ручками:
AddCommand
- добавляет и запускает команды. Команды передаются в тело запроса в виде строки.GetCommand
- получает информацию о команде (текст команды, статус выполнения, вывод команды и ее pid в системе)ListCommand
- получает информацию о списке команд (текст команды, статус выполнения и ее pid в системе). В запрос передаются query-параметры limit и offset для пагинацииStopCommand
- останавливает запущенные команды
Приложение работает с базой данных Postgres
Для взаимодействия были выбраны библиотеки goose, pgx, scanny и squirrel, как наиболее популярные и удобные. Бд состоит из одной таблицы "commands"
CREATE TABLE commands (
-- Уникальный идентификатор команды в бд
id BIGSERIAL PRIMARY KEY ,
-- Текст команды
command TEXT NOT NULL DEFAULT '',
-- Статус выполнения команды
status status NOT NULL DEFAULT 'UNSPECIFIED',
-- Идентификатор процесса в системе
pid BIGINT,
-- Вывод команды
output TEXT
);
Для статуса выполнения команды создан отдельный тип
CREATE TYPE status AS ENUM ('UNSPECIFIED', 'NEW', 'IN_PROGRESS', 'DONE', 'FAILED', 'STOPPED');
Приложение контейнеризовано с помощью Docker и Docker-Compose
Написаны Docker файлы для приложения и для миграций бд, а также файл docker-compose для запуска всех контейнеров.
Логгирование
Написан логгер на базе uber zap, с возможностью устанавливать уровень логирования и указывать путь вывода логов.
Конфигурция
При запуске приложение читает файл конфигурации (config.json), где содержатся такие параметры как:
- gRPC и HTTP порты
- уровень логирования и путь к файлу с логами
- период обновления базы данных (сек)
- базовый размер буфера для записи вывода команд
Примеры использования
- Добавление команды: метод
POST
, адресlocalhost:8000/command/add
, запрос
ответ{ "command":"ping -c 2 ya.ru" }
{ "id": "1" }
- Получение информации о команде: метод
GET
, адресlocalhost:8000/command/1
, ответ до завершения выполнения команды
ответ после завершения выполнения команды{ "command": "ping -c 2 ya.ru", "status": "IN_PROGRESS", "output": "PING ya.ru (77.88.44.242): 56 data bytes\n64 bytes from 77.88.44.242: seq=0 ttl=55 time=13.089 ms", "pid": "15" }
{ "command": "ping -c 2 ya.ru", "status": "DONE", "output": "PING ya.ru (77.88.44.242): 56 data bytes\n64 bytes from 77.88.44.242: seq=0 ttl=55 time=13.089 ms\n64 bytes from 77.88.44.242: seq=1 ttl=55 time=13.154 ms\n\n--- ya.ru ping statistics ---\n2 packets transmitted, 2 packets received, 0% packet loss\nround-trip min/avg/max = 13.089/13.121/13.154 ms\n", "pid": "15" }
- Получение списка команд: метод
GET
, адресlocalhost:8000/command/list?limit=10&offset=0
, ответ{ "commands": [ { "command": "ping -c 2 ya.ru", "status": "DONE", "pid": "14" }, { "command": "ping -c 2 ya.ru", "status": "DONE", "pid": "15" }, { "command": "ping -c 2 ya.ru", "status": "DONE", "pid": "16" }, ] }
- Остановка выполнения команды: метод
PUT
, адресlocalhost:8000/command/2/stop
, ответ
если после этого вызвать получение команды ответ будет со статусом{}
STOPPED
{ "command": "ping -c 2 ya.ru", "status": "STOPPED", "output": "PING ya.ru (5.255.255.242): 56 data bytes\n64 bytes from 5.255.255.242: seq=0 ttl=53 time=14.114 ms", "pid": "18" }