Перейти к содержанию

Резервное копирование через BMWCLIENT

Назначение документа

В документе описаны возможности резеревного копирования Облака. Резервное копирование выполняется через BMWCLIENT.

Документ нужен администраторам организации.

См. также: Резервное копирование почты, календарей, профилей пользователей и адресных книг

Возможности 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

Получить структуру файлов в облаке

Выполните следующую команду:

./bmwclient -server bmw.%domain% -method cloudBackup \
  -token %token% -email %email%

-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.

-save -byFolders

Пример запроса с параметрами -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.json и файлы находящиеся в облаке. При этом одинаковые файлы сохраняются один раз, а в файле tree.json содержится ссылка на этот файл. В файле tree.json отражена структура файлов в облаке, она находится внутри объекта "vfs":

"vfs": {
      ...
      "list": [
        {
          "name": "Календарь",
          "nodeid": "AwAAAEPFM2ReYsRIrazQnQ==",
          "mode": 4098,
          "list": [
            {
              "name": "1.txt",
              "mtime": 1683124497,
              "nodeid": "TAAAAEPFM2ReYsRIrazQnQ==",
              "mode": 4097,
              "size": 9,
              "hash": "VGVzdCBpbmZvAAAAAAAAAAAAAAA="
            }
            {
              "name": "1A46632B-.jpeg",
              "mtime": 1684172802,
              "nodeid": "0gAAAH4dVWTo0RCJj27QnQ==",
              "mode": 4097,
              "size": 138053,
              "hash": "bRMrS29FKvSoH4jexlhIumahHLw="
            }
            {
              "name": "1B606A7D-.jpeg",
              "mtime": 1684158651,
              "nodeid": "xgAAAH4dVWTo0RCJj27QnQ==",
              "mode": 4097,
              "size": 138053,
              "hash": "bRMrS29FKvSoH4jexlhIumahHLw="
            }
            ...
          ]
        }
      ]
    }
  • "name" — название файла/папки;
  • "mtime" — дата последнего обновления;
  • "mode" и "nodeid" — метаданные;
  • "size" — размер файла в битах;
  • "hash" — хэш от содержимого файла.

Внимание

Файлы размером менее 20 байт не сохраняются в папку с бэкапом, а в файле tree.json в поле hash записывается содержимое файла в формате Base64.

Все файлы в этом примере находятся внутри папки Календарь. Также можно заметить, что у файлов 1A46632B-.jpeg и 1B606A7D-.jpeg одинаковое значение в поле hash — значит это одинаковые файлы.

В интерфейсе облака это выглядит так:

disk-exmp

Чтобы сопоставить файл из папки с бэкапом с файлом в tree.json:

  1. Скопируйте значение в поле hash.
  2. Сконвертируйте это значение из Base64 в Hex. Например, с помощью: https://base64.guru/converter/decode/hex.
  3. Полученное значение — это файл в папке.

    hex hex2

Восстановить данные в облаке

Выполните следующую команду:

./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-архивом есть папка с таким же названием, то запрос не выполнится — нужно переместить папку:

[FATAL]: 2023/12/08 17:09:37 target directory ./tmp/n.gruzdev@wm2.on-premise.ru-1702027656 is not empty