Rdp Manager Protocol Specification

Условные обозначения

RDP менеджер
Сервис, выполняющий функции создания и закрытия RDP сессий.
Сессия
Соединение с машиной по RDP протоколу.
Машина
Удаленный компьютер, с которым осуществляется соединение.
PID (Process identifier)
Уникальный числовой идентификатор запущенного процесса
Сообщение
Команда, отправленная сервису/сервисом по защищённому протоколу websocket.
Ответ на сообщение
Структурированная информация в виде цельного объекта, возвращаемая сервисом.

Описание протокола

Инициатором сообщения выступает пользователь, посредством отдачи команд RDP менеджеру.

Объекты

Handshake - Команда, инициирующая начало общения с оркестратором.

Protobuf-объект:

syntax = "proto3";
package Robin.Protocol.Agent.Messages.API.v2;
import "google/protobuf/timestamp.proto";

message Handshake {
    string type = 1;
    string apiVersion = 2;
    int32 pid = 3; // идентификатор процесса агента
    string mac = 4; // мак адрес сервера, на котором запущен агент
    string host = 5; // имя хоста
    google.protobuf.Timestamp startDate = 6; // Дата и время запуска агента в формате ISO-8601, например 2007-12-03T10:15:30+01:00 Europe
    string agentVersion = 7; // версия агента
    string protocolVersion = 8; // версия поддерживаемого протокола
    string user = 9; // УЗ, под которой запущен агент
}

Аттрибуты:

- type (string) - тип сообщения
- apiVersion (string) - версия API RDP менеджера
- pid (int32) - идентификатор процесса RDP менеджера
- mac (string) - MAC-адрес компьютера, на котором запущен RDP менеджер
- host (string) - IP адрес / DNS имя машины
- startDate (google.protobuf.Timestamp) - Дата и время запуска RDP менеджера в формате ISO-8601, например 2007-12-03T10:15:30+01:00 Europe
- agentVersion (string) - версия агента
- protocolVersion (string) - версия поддерживаемого протокола
- user (string) - имя учетной записи пользователя, под которой запущен RDP менеджер

HandshakeAcknowledge - Ответ от оркестратора, означающий начало общения с RDP менеджером.

Protobuf-объект:

syntax = "proto3";
package Robin.Protocol.RdpManager.Messages.API.v2;

import "Result.proto";


message HandshakeAcknowledge {
    string type = 1; // HANDSHAKE_ACK
    string apiVersion = 2;
    Result result = 3; // результат
    string agentUuid = 4; // оркестратор возвращает agentUuid
}

Аттрибуты:

- type (string) - доменное имя, к которому принадлежит машина
- username (string) - имя пользователя, под которым должна открыться сессия
- password (string) - пароль пользователя
- hostname (string) - IP адрес/DNS имя машины.

RdpSession - RDP сессия.

Protobuf-объект:

syntax = "proto3";

import "RdpSessionUser.proto";

message RdpSession {
    string hostname = 1;  // имя компьютера
    string domain = 2;  // доменная зона, в которую входит этот компьютер
    string port = 3;  // порт
    RdpSessionUser user = 4; // аутентификационные данные пользователя
}

Аттрибуты:

- domain (string) - доменное имя, к которому принадлежит машина
- username (string) - имя пользователя, под которым должна открыться сессия
- password (string) - пароль пользователя
- hostname (string) - IP адрес/DNS имя машины.

RdpSessionUser - `Пользователь RDP-сессии `.

Protobuf-объект:

syntax = "proto3";

import "RdpSessionUser.proto";

message RdpSession {
    string hostname = 1;
    string domain = 2;
    string port = 3;
    RdpSessionUser user = 4;
}

Аттрибуты:

- hostname (string) - имя компьютера.
- domain (string) - доменная зона, в которую входит этот компьютер.
- port (string) - RDP-порт, открытый на компьютере, для установки RDP-сессии.
- user (RdpSessionUser) - аутентификационные данные пользователя.

Result - Объект, возвращающий результат сообщения, его статус и код.

Protobuf-объект:

message Result {
    string code = 1; // код результата
    ResultType type = 2;
    string description = 3; // описание
};

Аттрибуты:

- code (string) - код результата
- type (enum) - статус сообщения
- description (string) - описание сообщения

Перечисления

ResultType - Статус сообщения, возвращаемого объектом Result.

Protobuf-объект:

/*универсальный объект с результатом*/
syntax = "proto3";
package Robin.Protocol.RDP.v1;

enum ResultType { // тип результата - перечисление
    SUCCESS = 0;
    WARNING = 1;
    ERROR = 2;
}

Возможные значения:

- RDP_SESSION_CLOSED (0) - сессия закрыта.
- RDP_SESSION_OPENED (1) - сессия открыта.
- RDP_SESSION_ERROR (2) - возникла ошибка сессии.

Сообщения

RdpSessionStart - открыть сессию.

Protobuf-объект:

syntax = "proto3";
package Robin.Protocol.RdpManager.Messages.API.v2;

import "RdpSession.proto";

message RdpSessionStart {
    string type = 1; // RDP_SESSION_START
    repeated RdpSession sessions = 2;
}

Аттрибуты:

- type (string) - тип сообщения (RDP_SESSION_START).
- sessions (RdpSession) - список объектов сессии, передаваемый в сообщении.

RdpSessionStartAcknowledge - ответ на сообщение об открытии сессии.

Protobuf-объект:

syntax = "proto3";
package Robin.Protocol.RdpManager.Messages.API.v2;

import "Result.proto";


message RdpSessionStartAcknowledge {
    string type = 1; // RDP_SESSION_START_ACKNOWLEDGE
    Result result = 2;
}

Аттрибуты:

- type (string) - тип сообщения (RDP_SERVICE_OPEN_SESSION_ACKNOWLEDGE).
- sessionPid (string) - PID (идентификатор процесса) запущенной RDP сессии. Нужен для дальнейшего закрытия сессии.
- status (RdpServiceStatus) - статус выполнения команды.

RdpSessionStartResult - результат на запуск сессии.

Protobuf-объект:

syntax = "proto3";
package Robin.Protocol.RdpManager.Messages.API.v2;

import "Result.proto";

message RdpSessionStartResult {
    string type = 1;  // RDP_SESSION_STOP_RESULT
    Result result = 2;
}

Аттрибуты:

- type (string) - тип сообщения (RDP_SESSION_START_RESULT).
- result (Result) - объект с результатом выполнения команды.

RdpSessionStop - закрыть сессию.

Protobuf-объект:

syntax = "proto3";
package Robin.Protocol.RdpManager.Messages.API.v2;

import "RdpSession.proto";

message RdpSessionStop {
    string type = 1; // RDP_SESSION_STOP
    repeated RdpSession sessions = 2;
}

Аттрибуты:

- type (string) - тип сообщения (RDP_SERVICE_CLOSE_SESSION).
- managerUuid (string) - идентификатор RDP менеджера.
- username (string) - имя пользователя
- hostname (string) - адрес машины
- sessionPid (string) - PID запущенной RDP сессии.

Примечание:

В этом сообщении можно использовать или сочетание аттрибутов username и hostname (в этом случае sessionPid указывать не требуется), или только sessionPid.

RdpSessionStopAcknowledge - ответ на сообщение о закрытии сессии.

Protobuf-объект:

syntax = "proto3";
package Robin.Protocol.RdpManager.Messages.API.v2;


message RdpSessionStopAcknowledge {
    string type = 1; // RDP_SESSION_STOP_ACKNOWLEDGE
}

Аттрибуты:

- type - тип сообщения (RDP_SERVICE_CLOSE_SESSION_ACKNOWLEDGE)

RdpSessionStopResult - результат на запуск сессии.

Protobuf-объект:

syntax = "proto3";
package Robin.Protocol.RdpManager.Messages.API.v2;

import "Result.proto";

message RdpSessionStopResult {
    string type = 1;  // RDP_SESSION_STOP_RESULT
    Result result = 2;
}

Аттрибуты:

- type (string) - тип сообщения (RDP_SESSION_STOP_RESULT).
- result (Result) - объект с результатом выполнения команды.

RdpManagerInfo - Информация о состоянии сессий RDP-менеджера.

Protobuf-объект:

syntax = "proto3";
import "RdpSession.proto";


message RdpManagerInfo {
    string type = 1; // RDP_MANAGER_INFO
    repeated RdpSession runningSessions = 2;
}

Аттрибуты:

- type - тип сообщения (RDP_SERVICE_CLOSE_SESSION_ACKNOWLEDGE)
- runningSessions - список открытых сессий RDP-менеджера.