Резервное копирование через BMWCLIENT
Назначение документа
В документе описаны возможности резеревного копирования Облака. Резервное копирование выполняется через BMWCLIENT.
Документ нужен администраторам организации.
См. также: Резервное копирование почты, календарей, профилей пользователей и адресных книг
Что такое BMWCLIENT?
BMWCLIENT — это клиент для выполнения запросов к gRPC API. Основные функции клиента: резервное копирование и восстановление почтового ящика, облака, календарей, профилей пользователей и адресных книг.
Шаг 1. Предварительные настройки
Чтобы выполнять запросы к bmwclient, нужно добавить перечень IP и подсетей в веб-интерфейсе установщика:
-
Откройте веб-интерфейс установщика
http://server-adress:8888
. -
Перейдите на вкладку Настройки → Настройки компонентов → Ограничение доступа к доменам.
-
Затем кликните по домену
bmw.server-adress
и нажмите кнопку редактировать . -
Включите опцию Ограничить доступ к домену.
-
Добавьте IP и подсети, под которыми разрешено обращаться к bmwclient'у. Чтобы разрешить всем IP и подсетям обращаться к bmwclient'у, добавьте IP-адрес
0.0.0.0/0
. По умолчанию доступ к доменуbmw.server-adress
запрещен всем IP/подсетям. -
Кликните по кнопке Сохранить.
-
Перейдите к списку машин и включите опцию «Не показывать завершённые».
-
Запустите следующие шаги:
Примечание
В случае моноинсталляции количество сервисов, для которых потребуется запуск шагов, будет отличаться.
Запросы к bmwclient'у можно будет выполнять, исходя из настроек IP и подсетей.
Шаг 2. Получить токен для выполнения запросов
- Перейдите на страницу
biz.<сompany_domain>
и авторизуйтесь в панели администратора. - Перейдите по URL-адресу
https://biz.<mail_domain>/oper/
-
В меню слева выберите пункт Токены, на странице нажмите Добавить.
-
В окне добавления токена укажите дату истечения действия токена (согласно вашим внутренним политикам компании), а также комментарий.
-
Нажмите Добавить. Отобразится окно со сгенерированным токеном.
Внимание
Обязательно скопируйте и сохраните значение в поле «Токен:», его можно увидеть только один раз в отображаемом окне.
Авторизационный токен передаётся при каждом запросе к bmwclient'у.
Шаг 3. Скачать BMWCLIENT
- Перейдите на страницу
biz.<сompany_domain>
и авторизуйтесь в панели администратора. -
Перейдите по URL-адресу
https://biz.<mail_domain>/oper/
-
В меню слева выберите пункт Клиент и скачайте клиент, кликнув по bmwclient.
Работа с bmwclient'ом происходит в командной строке (терминале). По умолчанию клиент скачивается в папку «Загрузки»/«Downloads».
Запуск клиента для Windows
Чтобы начать работу с bmwclient'ом под ОС Windows, не требуется дополнительных настроек и действий, достаточно шагов, выполненных выше.
Запуск клиента для Linux
Чтобы начать работать с bmwclient под ОС Linux, в терминале, в директории с bmwclient'ом, нужно запустить следующую команду:
Запуск клиента для OS X
Чтобы начать работать с bmwclient под OS X, нужно выполнить следующие действия:
-
В терминале, в директории с bmwclient'ом, нужно запустить последовательно команды:
-
Кликните «Отменить» во всплывающем уведомлении:
-
Откройте «Системные настройки» и перейдите в раздел «Конфиденциальность и безопасность» на вашем компьютере.
-
Кликните по кнопке Все равно разрешить для приложения bmwclient:
-
В терминале снова запустите команду
./bmwclient -help
. -
Кликните «Открыть» во всплывающем уведомлении:
Возможности BMWCLIENT и примеры запросов
Для каждого запроса необходимо обязательно передавать следующий список полей:
- -server — доменное имя для запросов в BMWCLIENT, например bmw.on-premise.ru.
- -tls — использует ли сервер шифрование (https). Флаг принимает два значения: true или false. По умолчанию считается, что шифрование используется.
- -method — метод, который необходимо вызвать в gRPC API.
- -token — токен для авторизации запросов к gRPC API, полученный на шаге 1.
Опционально можно задавать следующие параметры:
- -maxMessageSizeMB — максимальный размер сообщения передаваемый по gRPC. Значение по умолчанию: 128 МБ.
- -skipVersionCheck — сравнивать ли версии клиента и сервера. Значение по умолчанию: false.
- -timeout — принимает значение в секундах, нужно использовать на случай медленного соединения или, если запросы не выполняются с ошибкой timeout.
Получить список пользователей, файлы которых были изменены после указанного времени
Выполните следующую команду:
./bmwclient -server bmw.%domain% -tls=false -method cloudUsers -token %token% -startts %start_timestamp%
Пример запроса:
./bmwclient -server bmw.domain1.on-premise.ru \
-method cloudUsers -token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa \
-skipVersionCheck=true -startts 1695204000
-startts — дата и время изменения файлов у пользователей. Передается в формате UNIX timestamp.
Результат:
[INFO]: 2023/09/20 14:46:01 backend address is: bmw.domain1.on-premise.ru:443,
method is: cloudUsers
[INFO]: 2023/12/07 14:03:16 test_login_qdqm0ext@domain1.on-premise.ru
[INFO]: 2023/12/07 14:03:16 test_login_kjymg1yn@domain2.on-premise.ru
[INFO]: 2023/12/07 14:03:16 test_login_asyqg1ge@domain2.on-premise.ru
[INFO]: 2023/12/07 14:03:16 test_login_z0ohfzsc@domain2.on-premise.ru
[INFO]: 2023/12/07 14:03:16 test_login_aetdr5x9@domain3.on-premise.ru
[INFO]: 2023/12/07 14:03:16 test_login_2ixphpmh@domain4.on-premise.ru
Получить структуру файлов в облаке
Выполните следующую команду:
-email — email адрес почтового ящика, для которого выполняется запрос структуры.
Пример запроса:
./bmwclient -server bmw.domain1.on-premise.ru -method cloudBackup \
-domain wm2.on-premise.ru -token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa \
-email n.gruzdev@wm2.on-premise.ru
Результат:
[INFO]: 2023/09/27 14:13:56 backend address is: bmw.domain1.on-premise.ru:443,
method is: cloudBackup
[INFO]: tree:{info:{type:4 bizprj:2199023255553 ownerid:1000011 quota:2147483648} vfs:{name:"/" mode:2 list:{name:"Календарь" nodeid:"\x03\x00\x00\x00C\xc53d^b\xc4H\xad\xacН" mode:4098 list:{name:"1 (4).txt" mtime:1683124497 nodeid:"L\x00\x00\x00C\xc53d^b\xc4H\xad\xacН" mode:4097 size:9 hash:"Test info\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}
}} acls:{treeid:"623432346630303030303030"}} path:"/recovered_data" lock:3
Создать полную резервную копию облака
Чтобы создать полную резервную копию файлов в облаке для конкретного пользователя и сохранить результат в директорию, нужно выполнить следующую команду:
./bmwclient -server bmw.%domain% -method cloudBackup -token %token% \
-email %email% -savePath backups -zip -save
- -email — email-адрес почтового ящика, для которого снимается резервная копия.
- -savePath — путь на диске, куда необходимо сохранить резервную копию облака.
- -save — сохранить результат резервного копирования на диск в директорию, без сжатия.
- -zip — сжать в zip-архив результаты резервного копирования и сохранить на диск.
Флаги -save и -zip взаимоисключающие, их нельзя использовать вместе в одном запросе.
Пример запроса с параметром -save:
./bmwclient -server bmw.domain1.on-premise.ru -method cloudBackup \
-token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa -email n.gruzdev@wm2.on-premise.ru \
-save -savePath ./backups
В примере, в параметре -savePath, указан путь относительно папки, в которой находится bmwclient.
Результат:
[INFO]: 2023/09/20 18:25:42 backend address is: bmw.domain1.on-premise.ru:443,
method is: cloudBackup
Результат резервного копирования в папке backups/n.gruzdev@wm2.on-premise.ru-1702027656
. Где 1702027656
— это дата бэкапа в формате UNIX timestamp.
Пример запроса с параметрами -zip:
./bmwclient -server bmw.domain1.on-premise.ru -method cloudBackup \
-token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa -email n.gruzdev@wm2.on-premise.ru \
-zip -savePath ./backups
Результат:
[INFO]: 2023/09/20 18:25:42 backend address is: bmw.domain1.on-premise.ru:443,
method is: cloudBackup
Единственное отличие от бэкапа с параметром -save
— содержимое папки сжимается в архив.
Содержимое бэкапа
В папке с бэкапом всегда сохраняются файлы:
tree.json
— здесь отражена структура файлов в облаке. Структура файлов представляется в виде плоского дерева.tree.info.json
— метаданные дерева.publics.json
— здесь находятся данные об общих папках.- Файлы находящиеся в облаке.
При этом одинаковые файлы сохраняются один раз, а в файле tree.json
содержится ссылка на этот файл.
Пример файла tree.info.json
:
"type"
— Тип дерева. Возможные значения:- 0 — дерево обычного пользователя.
- 1 — общедоступное дерево обычного пользователя.
- 4 — дерево бизнес-пользователя.
- 5 — общедоступное дерево бизнес-пользователя.
"bizprj"
— идентификатор бизнес-проекта которому принадлежит дерево, используется для деревьев с типом 4 и 5."ownerid"
— ID владельца дерева."quota"
— максимальный размер хранилища пользователя.
Пример файла publics.json
:
{
"email": "n.gruzdev@wm2.on-premise.ru",
"ctime": 1724651727,
"extra": "{\"v\":2}",
"publics": [
{
"id": "esEn/x1p2X3uLt",
"extid": "/Календарь",
"ctime": 1724651727,
"flags": 6,
"extra": "{}"
}
]
}
"extid"
— путь до общей папки в дереве пользователя."ctime"
внутри поля"publics"
— дата создания общей папки."flags"
и"extra"
— служебные флаги и поля.
tree.json
содержит объекты двух типов:
- Папки. В поле
childs
находятся ссылки на вложенные в нее папки и файлы. - Файлы. В поле
nodeid
находится идентификатор папки, к которой принадлежит файл.
Пример файла tree.json
:
[
{
"name": "Календарь",
"nodeid": "3e2cc7f1f79e6c270855cbf917a254e7",
"mode": 4098,
"childs": [
"492cc7f1f79e6c270855cbf917a254e7",
"472cc7f1f79e6c270855cbf917a254e7",
"4a2cc7f1f79e6c270855cbf917a254e7"
]
},
{
"name": "1A46632B-.jpeg",
"mtime": 1708612045,
"nodeid": "472cc7f1f79e6c270855cbf917a254e7",
"mode": 4097,
"size": 138053,
"hash": "1ad3a8149519d8a8f93390c932324c45234d1257"
},
{
"name": "1B606A7D-.jpeg",
"mtime": 1708612045,
"nodeid": "4a2cc7f1f79e6c270855cbf917a254e7",
"mode": 4097,
"size": 138053,
"hash": "1ad3a8149519d8a8f93390c932324c45234d1257"
},
{
"name": "1.txt",
"mtime": 1708612057,
"nodeid": "492cc7f1f79e6c270855cbf917a254e7",
"mode": 4097,
"size": 9,
"hash": "7d5e985e0b5fee68b1b688f52632cdbabad9d7aa"
}
]
"name"
— название файла/папки;"mtime"
— дата последнего обновления;"mode"
и"nodeid"
— метаданные;"size"
— размер файла в битах;"hash"
— хэш от содержимого файла.
Внимание
Файлы размером менее 20 байт не сохраняются в папку с бэкапом, а в файле tree.json
в поле hash
записывается содержимое файла в формате Base64.
Все файлы в этом примере находятся внутри папки Календарь. Также можно заметить, что у файлов 1A46632B-.jpeg
и 1B606A7D-.jpeg
одинаковое значение в поле hash
— значит это одинаковые файлы.
В интерфейсе облака это выглядит так:
Чтобы сопоставить файл из папки с бэкапом с файлом в tree.json
:
- Скопируйте значение в поле
hash
. - Сконвертируйте это значение из Base64 в Hex. Например, с помощью: https://base64.guru/converter/decode/hex.
-
Полученное значение — это файл в папке.
Восстановить данные в облаке
Выполните следующую команду:
./bmwclient -server bmw.%domain% -method cloudRestore \
-token %token% -email %email% -readPath %backups_dir%
- -email — email-адрес почтового ящика, для которого выполняется восстановление.
- -readPath — путь до папки или zip-архива, в которой находится копия облака.
Пример запроса:
./bmwclient -server bmw.domain1.on-premise.ru -method cloudRestore \
-token JleaQ8dNU0UBX6oaugaWmJ12vaaFp9Sa -email n.gruzdev@wm2.on-premise.ru \
-readPath ./backups/n.gruzdev@wm2.on-premise.ru-1695212742
Результат:
[INFO]: 2023/09/21 10:19:09 backend address is: bmw.domain1.on-premise.ru:443,
method is: cloudRestore
Результат, если указан путь до zip-архива:
[INFO]: 2023/09/21 10:19:09 backend address is: bmw.domain1.on-premise.ru:443,
method is: cloudRestore
[INFO]: 2023/12/08 17:09:49 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/
tree.json
[INFO]: 2023/12/08 17:09:49 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/
ce6b1c9881e86da69491a7fb1ea4ee8389be2bca
[INFO]: 2023/12/08 17:09:49 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/
8ac8a3b6100a4b087630df8ec086bd6e96581d86
[INFO]: 2023/12/08 17:09:50 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/
f1bd71e8454f37762b84f1ad78edecff59bf1414
[INFO]: 2023/12/08 17:09:50 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/
dbb9c3ce2f14e98016cba2e2f37725bc8b97a639
[INFO]: 2023/12/08 17:09:50 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/
b4ea03212c7a351c3a23cf6c72df30dec9e7182c
[INFO]: 2023/12/08 17:09:50 unzipping tmp/n.gruzdev@wm2.on-premise.ru-1702027656/
6d132b4b6f452af4a81f88dec65848ba66a11cbc
[INFO]: 2023/12/08 17:09:50 deleted temp directory ./tmp/
Внимание
Если в одной директории с zip-архивом есть папка с таким же названием, то запрос не выполнится — нужно переместить папку: