Резервное копирование данных в хранилище с помощью Python на Linux/Windows

В инструкции рассмотрен процесс загрузки и выгрузки файлов в/из объектного хранилища 1cloud с помощью языка программирования Python.

Что это такое?

Иногда бывает удобно использовать именно язык Python в силу разных причин для резервирования данных в объектное хранилище. В инструкции описано получение токена авторизации для подключения к хранилищу и скрипты для загрузки или выгрузки файлов.

В нашей инструкции используется версия Python 2.7.

Первоначальные требования

Для того чтобы выполнить резервное копирование данных, необходимо:

  1. Наличие контейнера в облачном хранилище, в котором будут храниться резервные копии. Создать его можно несколькими способами: через панель управления; с помощью приложений S3Browser, Cyberduck или Rclone; с помощью Swift API или S3 REST API.
  2. Необходимо запомнить ExternalId хранилища в системе swift, это можно сделать через API запрос.
  3. Пользователь, от имени которого будет происходить загрузка дампа в контейнер, должен иметь к нему доступ. К приватным контейнерам по умолчанию доступ имеет только владелец хранилища, к публичным доступ имеют все пользователи. О том как предоставить доступ другим пользователям для работы с приватным контейнером читайте в нашей инструкции.

Установка Python на Linux

Для установки Python выполните следующие команды, но как правило Python уже установлен на наших виртуальных серверах:

sudo apt update
sudo apt install python2.7

Для установки необходимых зависимостей выполните следующие команды:

sudo apt update
sudo apt install python-pycurl python-certifi

Установка Python на Windows

По умолчанию на серверах Windows не установлен интерпретатор Python, для его загрузки перейдите на официальный сайт Python и скачайте установщик.

После установки в меню Windows появится ссылка на командную строку. Для дальнейшей работы необходимо открыть командную строку.

Python (command line)

Для установки дополнительных библиотек используйте pip. Откройте командную строку и перейдите в каталог:

cd C:\Python27\Scripts

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

.\pip.exe install certifi
.\pip.exe install pycurl

Теперь все необходимые пакету установлены.

Получения токена для управления хранилищем

Запустите следующий скрипт для получения токена авторизации, указав при этом следующие параметры: <TenantId>, <имя_пользователя>, <пароль>.

Скрипт:

import pycurl, json, certifi
from StringIO import StringIO
buffer = StringIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, 'https://1cloud.store/v3/auth/tokens')
c.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json'])
c.setopt(pycurl.CAINFO, certifi.where())
data = json.dumps({'auth': {'scope': {'project': {'domain': {'name': 'Default'}, 'name': '<TenantId>'}}, 'identity': {'password': {'user': {'domain': {'name': 'Default'}, 'password': '<пароль>', 'name': '<имя_пользователя>'}}, 'methods': ['password']}}})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.WRITEHEADER, buffer)
c.perform()
body = buffer.getvalue()
print(body)

Например:

import pycurl, json, certifi
from StringIO import StringIO
buffer = StringIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, 'https://1cloud.store/v3/auth/tokens')
c.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json'])
c.setopt(pycurl.CAINFO, certifi.where())
data = json.dumps({'auth': {'scope': {'project': {'domain': {'name': 'Default'}, 'name': '66'}}, 'identity': {'password': {'user': {'domain': {'name': 'Default'}, 'password': 'fRSWHnjZtkxL', 'name': '66_admin'}}, 'methods': ['password']}}})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.setopt(pycurl.WRITEHEADER, buffer)
c.perform()
body = buffer.getvalue()
print(body)

В результате выполнения вы увидите подобный ответ:

>>> print(body)
HTTP/1.1 201 Created
Server: nginx
Date: Thu, 27 Sep 2018 11:03:37 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
X-Subject-Token: gAAAAABbrLkJgz8qWqiJ9D1bNly9RmASFfpJgrdcK_7NWhR93zA4Qpk_FyVjv8o77QAzthaHbCekk-kFIXKBABPJoClRdM-T7ELxKL-XgxkSYzVrcg1y0aVEu1lDwHMEJ8sezOCIVcFkFxQnbpWSB9dJfUI5vPHmPc0m2CJhYvz_x21XZcm5Ab7
Vary: X-Auth-Token
x-openstack-request-id: req-12f5b3d6-a429-42a0-a258-8сс1ad5b430c
Access-Control-Allow-Origin: *
Strict-Transport-Security: max-age=31536000; includeSubDomains;
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Access-Control-Allow-Headers: X-Auth-Token, Content-Type, Origin, Cache-Control
Access-Control-Expose-Headers: X-Backend-Timestamp, Last-Modified, ETag, X-Timestamp, Content-Type, X-Subject-Token

Токен является значением параметра X-Subject-Token, это значение в дальнейшем и будет использоваться.

Загрузка файлов в хранилище

Для того чтобы загрузить файл в объектное хранилище замените в следующих строках кода параметры на свои: <ExternalId>, <имя_контейнера>, <имя_файла>, <токен>, <путь_до_файла_для_загрузки>>:

c.setopt(pycurl.URL, 'https://1cloud.store/v1/AUTH_<ExternalId>/<имя_контейнера>/<имя_файла>')
c.setopt(pycurl.HTTPHEADER, ['Content-Type: text/html'])
c.setopt(pycurl.HTTPHEADER, ['X-Auth-Token: <токен>'])
c.setopt(c.UPLOAD, 1)
file = open('<путь_до_файла_для_загрузки>')
c.setopt(c.READDATA, file)
c.perform()

Например:

c.setopt(pycurl.URL, 'https://1cloud.store/v1/AUTH_o4TnXNEfma3D1iVPx9rbYRo2YTHZAfxe/publ/win.txt')
c.setopt(pycurl.HTTPHEADER, ['Content-Type: text/html'])
c.setopt(pycurl.HTTPHEADER, ['X-Auth-Token: gAAAAABbrLkJgz8qWqiJ9D1bNly9RmASFfpJgrdcK_7NWhR93zA4Qpk_FyVjv8o77QAzthaHbCekk-kFIXKBABPJoClRdM-T7ELxKL-XgxkSYzVrcg1y0aVEu1lDwHMEJ8sezOCIVcFkFxQnbpWSB9dJfUI5vPHmPc0m2CJhYvz_x21XZcm5Ab7'])
c.setopt(c.UPLOAD, 1)
file = open('C:\Users\\ivan.ivanov\Documents\output.txt')
c.setopt(c.READDATA, file)
c.perform()

В результате указанный файл будет загружен в файловое хранилище.

Выгрузка файла

С помощью Python также можно загрузить файл из объектного хранилища на ваш локальный компьютер или сервер. Замените в следующих строках кода параметры на свои: <ExternalId>, <имя_контейнера>, <имя_файла>, <токен>, <путь_до_загружаемого_файла>. В результате на вашей машине будет создан новый файл:

c.setopt(pycurl.URL, 'https://1cloud.store/v1/AUTH_<ExternalId>/<имя_контейнера>/<имя_файла>')
c.setopt(pycurl.HTTPHEADER, ['X-Auth-Token: <токен>'])
c.setopt(pycurl.HTTPGET, 1)
file = open('<путь_до_загружаемого_файла>', "w+")
c.setopt(c.WRITEFUNCTION, file.write)
c.perform()
file.close()

Например:

c.setopt(pycurl.URL, 'https://1cloud.store/v1/AUTH_o4TnXNEfma3D1iVPx9rbYRo2YTHZAfxe/publ/win.txt')
c.setopt(pycurl.HTTPHEADER, ['X-Auth-Token: gAAAAABbrLkJgz8qWqiJ9D1bNly9RmASFfpJgrdcK_7NWhR93zA4Qpk_FyVjv8o77QAzthaHbCekk-kFIXKBABPJoClRdM-T7ELxKL-XgxkSYzVrcg1y0aVEu1lDwHMEJ8sezOCIVcFkFxQnbpWSB9dJfUI5vPHmPc0m2CJhYvz_x21XZcm5Ab7'])
c.setopt(pycurl.HTTPGET, 1)
file = open('C:\Users\\ivan.ivanov\Documents\download.txt', "w+")
c.setopt(c.WRITEFUNCTION, file.write)
c.perform()
file.close()

После выполнения скрипта по указанному пути появится файл из хранилища.

 


Средняя оценка: 5,0, всего оценок: 1