Git Product home page Git Product logo

crcs's Introduction

Centralized Remote Control System

Технические характеристики.

Шифрование: SSL, хэширование bcrypt с добавлением соли.

Окружение: Сервер на Arch linux.

Используемые языки:

  • Сервер: C++, библиотеки C.
  • Клиент: Python3.9 + PyQT5.
  • Админ: Python3.9.
  • Сайт: PHP + bootstrap5.

API системы.

Формат пакетов администратора.

1. Пакет команды.

Предназачен исключительно для пересылки сервером команды хосту, которому предназначалось данное сообщение. Пакет реализует два метода отправки: Unicast, Broadcast. В обоих случаях отличается только получатель.

1.1. Пакет команды (Unicast)

Отличается тем, что номер пула можно оставить пустым, указывается только получатель - receiver.

{
    "op_type": "command",
    "command": "fp pwd",
    "receiver": "Unique host ID",
    "pool_id": null,
    "sessionuid": "Unique admin session ID"
}
1.2. Пакет команды (Broadcast)

В отличии от Unicast команды - указывается только идентификатор пула pool_id, receiver же остается пустым.

{
    "op_type": "command",
    "command": "fp pwd",
    "receiver": null,
    "pool_id": 1,
    "sessionuid": "Unique admin session ID"
}

2. Пакет регистрации личного кабинета в сети.

О назначении пакета говорит само название. Важно отметить, что после регистрации не начинается сессия администратора, всего лишь заносится соответствующая запись в базу данных.

{
    "op_type": "reg",
    "login": "login",
    "password": "password"
}

3. Пакет аутентификации.

Предназначен для того, чтобы начать админскую сессию. Как это происходит: отправляется пакет "auth", сервер сверяет введенные данные с теми, что хранятся в захешированном виде в БД. Если было найдено совпадение, то отправляет "sessionuid" - уникальный идентификатор сессии администратора, который сохраняется в базе данных на сервере в директории /var/usr/crcs_session/sessionuid (для Linux систем), который в последующем будет отправляться совместно с любым пакетом, отличным от auth и reg.

{
    "op_type": "auth",
    "login": "login",
    "password": "password"
}

4. Пакет команды серверу.

По своей реализации, этот пакет может отправляться любым компонентом системы и он успешно получит ответ, но по задумке, по крайней мере на данный момент - это может делать только администратор. Такие пакеты обрабатываются только сервером и никому не пересылаются. Общий формат такого пакета:

{
    "op_type": "server",
    "request": "Request to server",
    "additional_data": "Additional data of request",
    "sessionuid": "Unique admin session UID"
}
4.1. Запрос на создание нового пула.

"request": "CREATE_PULL" - Генерирует уникальный идентификатор пула и заносит сведения о нем в базу данных.

Возвращает: Код ответа.

4.2. Запрос на получение списка участников сети.

"request": "GET_POOL_MEMBERS" "additional_data": pool_id - Указывается целочисленный ID пула.

Возвращает: Список участников сети. В случае отсутствия - None.

4.3. Запрос на удаление пула.

"request": "DESTROY_POOL"

"additional_data": pool_id - Указывается целочисленный ID пула.

Возвращает: Код ответа.

4.4. Запрос на получение списка пулов, в которых состоит администратор.

"request": "GET_ADMIN_POOLS"

Возвращает: Список админских пулов.


Формат ответов всех компонетов сети.

Абсолютно все компоненты сети посылают ответ на какой-либо запрос в едином формате, что очень упрощает процесс обработки. В ответе, в поле "data", посылается уникальный идентификатор клиента, являющийся универсальным способом определения хостов.

{
    "code": "success",
    "commenct":"Some comment here.",
    "data": "Some data here."
}
  • code - Код ответа, имеет две вариации на момент написания документации: success и error.
  • comment - Комментарий к ответу. Используется для логирования, чаще всего для сообщения информации об ошибках.
  • data - какие-то json данные к ответу, когда это требуется.

Формат пакетов клиента.

1. Инициализация клиента, как участника пула.

Сообщает о вступлении клиента в пул, добавляется запись в БД и код ответа.

{
    "op_type": "init",
    "host_name": "Хостнейм клиента в сети для удобства.",
    "pool_id": 1
}

2. Подключение и объявление о готовности обрабатывать команды.

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

    "op_type": "ready",
    "host_id": "Unique host ID."

3. Выход из пула.

{
   "op_type": "del",
   "host_id": "Host UID"
}

Двухсторонняя передача необработанных данных.

Используется для передачи файлов от админа к клиенту и наоборот. Для этого используется один пакет для обоих сторон передачи:

{
   "op_type": "init_file_transaction",
   "filename": "Some filename.txt",
   "size": 1024,
   "host_id": "Unique host id"
}

Алгоритм протокола передачи админ->клиент.

  1. Администратор отправляет пакет, указывая host_id.
  2. Сервер отправляет этот пакет указанному хосту.
  3. Сервер переходит в режим пересылки потока байт указанному хосту, клиент переходит в режим принятия потока байт.
  4. Клиент начинает принимать поток байт до тех пор, пока сервер не разорвет подключение. Сервер понимает когда нужно остановить передачу, благодаря полю "size", которое ограничивает чтение.

Алгоритм протокола передачи админ<-клиент.

  1. Администратор отправляет пакет команды, где "command" равна "trans get {путь к файлу}".
  2. Клиент обрабатывает запрос, проверяет его на валидность введенного пути.
  3. Клиент отправляет пакет на пересылку необработанных данных серверу, где "host_id" равен null.
  4. Этот пакет сервер форвардит админу, чтобы тот перешел в режим обработки потока байт.
  5. Сервер переходит в режим передачи потока байт.
  6. Клиент начинает отправлять поток байт до тех пор, пока сервер не разорвет подключение. Сервер понимает когда нужно остановить передачу, благодаря полю "size", которое ограничивает чтение.

crcs's People

Contributors

kaseki1 avatar sepulturese avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.