Шифрование: SSL, хэширование bcrypt с добавлением соли.
Окружение: Сервер на Arch linux.
Используемые языки:
- Сервер: C++, библиотеки C.
- Клиент: Python3.9 + PyQT5.
- Админ: Python3.9.
- Сайт: PHP + bootstrap5.
Предназачен исключительно для пересылки сервером команды хосту, которому предназначалось данное сообщение. Пакет реализует два метода отправки: Unicast, Broadcast. В обоих случаях отличается только получатель.
Отличается тем, что номер пула можно оставить пустым, указывается только получатель - receiver.
{
"op_type": "command",
"command": "fp pwd",
"receiver": "Unique host ID",
"pool_id": null,
"sessionuid": "Unique admin session ID"
}
В отличии от Unicast команды - указывается только идентификатор пула pool_id, receiver же остается пустым.
{
"op_type": "command",
"command": "fp pwd",
"receiver": null,
"pool_id": 1,
"sessionuid": "Unique admin session ID"
}
О назначении пакета говорит само название. Важно отметить, что после регистрации не начинается сессия администратора, всего лишь заносится соответствующая запись в базу данных.
{
"op_type": "reg",
"login": "login",
"password": "password"
}
Предназначен для того, чтобы начать админскую сессию. Как это происходит: отправляется пакет "auth", сервер сверяет введенные данные с теми, что хранятся в захешированном виде в БД. Если было найдено совпадение, то отправляет "sessionuid" - уникальный идентификатор сессии администратора, который сохраняется в базе данных на сервере в директории /var/usr/crcs_session/sessionuid (для Linux систем), который в последующем будет отправляться совместно с любым пакетом, отличным от auth и reg.
{
"op_type": "auth",
"login": "login",
"password": "password"
}
По своей реализации, этот пакет может отправляться любым компонентом системы и он успешно получит ответ, но по задумке, по крайней мере на данный момент - это может делать только администратор. Такие пакеты обрабатываются только сервером и никому не пересылаются. Общий формат такого пакета:
{
"op_type": "server",
"request": "Request to server",
"additional_data": "Additional data of request",
"sessionuid": "Unique admin session UID"
}
"request": "CREATE_PULL"
- Генерирует уникальный идентификатор пула и заносит сведения о нем в базу данных.
Возвращает: Код ответа.
"request": "GET_POOL_MEMBERS"
"additional_data": pool_id
- Указывается целочисленный ID пула.
Возвращает: Список участников сети. В случае отсутствия - None.
"request": "DESTROY_POOL"
"additional_data": pool_id
- Указывается целочисленный ID пула.
Возвращает: Код ответа.
"request": "GET_ADMIN_POOLS"
Возвращает: Список админских пулов.
Абсолютно все компоненты сети посылают ответ на какой-либо запрос в едином формате, что очень упрощает процесс обработки. В ответе, в поле "data", посылается уникальный идентификатор клиента, являющийся универсальным способом определения хостов.
{
"code": "success",
"commenct":"Some comment here.",
"data": "Some data here."
}
- code - Код ответа, имеет две вариации на момент написания документации: success и error.
- comment - Комментарий к ответу. Используется для логирования, чаще всего для сообщения информации об ошибках.
- data - какие-то json данные к ответу, когда это требуется.
Сообщает о вступлении клиента в пул, добавляется запись в БД и код ответа.
{
"op_type": "init",
"host_name": "Хостнейм клиента в сети для удобства.",
"pool_id": 1
}
Сообщает о готовности хоста принимать команды. После отправки пакета соединение не закрывается, а продолжается на протяжении всей сессии. Таким образом можно проще отслеживать статус подключения клиентов.
"op_type": "ready",
"host_id": "Unique host ID."
{
"op_type": "del",
"host_id": "Host UID"
}
Используется для передачи файлов от админа к клиенту и наоборот. Для этого используется один пакет для обоих сторон передачи:
{
"op_type": "init_file_transaction",
"filename": "Some filename.txt",
"size": 1024,
"host_id": "Unique host id"
}
- Администратор отправляет пакет, указывая host_id.
- Сервер отправляет этот пакет указанному хосту.
- Сервер переходит в режим пересылки потока байт указанному хосту, клиент переходит в режим принятия потока байт.
- Клиент начинает принимать поток байт до тех пор, пока сервер не разорвет подключение. Сервер понимает когда нужно остановить передачу, благодаря полю "size", которое ограничивает чтение.
- Администратор отправляет пакет команды, где "command" равна "trans get {путь к файлу}".
- Клиент обрабатывает запрос, проверяет его на валидность введенного пути.
- Клиент отправляет пакет на пересылку необработанных данных серверу, где "host_id" равен null.
- Этот пакет сервер форвардит админу, чтобы тот перешел в режим обработки потока байт.
- Сервер переходит в режим передачи потока байт.
- Клиент начинает отправлять поток байт до тех пор, пока сервер не разорвет подключение. Сервер понимает когда нужно остановить передачу, благодаря полю "size", которое ограничивает чтение.