Скрипт копирования файла на Яндекс.Диск через API

Для собственных нужд резервного копирования написал небольшой скрипт, который умеет авторизоваться на Яндекс.Диске, посредством API загружать файлы и сохранять под уникальными именами. Преследовались следующие цели:

  1. Использвать одно из имеющихся в наличии облачных хранилищ, а то гигабайты пространств простаивают впустую
  2. Не использовать монтирование, дабы ПО VPS сервера не лазило по папкам (да, я параноик :) )
  3. Не хранить учётную запись сервисов Яндекса в скрипте ни в явном, ни в зашифрованном виде. Для авторизации Яндекс позволяет зарегистрировать собственное приложение, привязать к нему токен и делегировать некоторые права. Собственно поэтому выбор пал на API.
  4. Скрипт на bash. Языка интерпретатора за глаза хватает для поставленных целей, да и скрипт теоретически должен работать на любом линухе.
  5. Поддержка шифрования
  6. Отправка логов на почту

Регистрация приложения

Регистрация приложения будет состоять из нескольких пунктов.

1. Переходим в раздел OAuth Яндекса и регистрируем новое приложение: https://oauth.yandex.ru/client/new?ncrnd=8650

Яндекс.Диск: регистрация приложения, название

Из обязательных полей заполняем «Название» (например, backup) и «Права» (необходимо выбрать пункт Яндекс.Диск REST API), где поставить галку напротив пункта «Доступ на запись всего Диска».

 Яндекс.Диск: регистрация приложения, права

Внизу страницы кликаем на пункт «Подставить URL для разработки» и нажимаем «Сохранить».

Яндекс.Диск: регистрация приложения, callback url

Нас перекинет на страницу приложения. Её мы не закрываем, она нам ещё пригодится.

Яндекс.Диск: страница приложения

2. Подтверждаем права на доступ приложения к данным Яндекса. Для этого перейдём по ссылке https://oauth.yandex.ru/authorize?response_type=token&display=popup&client_id=<id приложения> ,подставив вместо <id приложения> полученный в предыдущем пункте id.

Яндекс.Диск: регистрация приложения, подтверждение прав

Нажимаем кнопку «Разрешить» и получаем заветный токен приложения, который прописываем в скрипте.

Яндекс.Диск: токен приложения

Настройка скрипта

Основные настройки разместил в секции settings.

# ---------- SETTINGS -------------

# Переменная, в которую нужно прописать токен приложения Яяндекс.Диска
token='8ed0561990184e88a152c68b8da8fa53'

# Название папки, в которую будут писаться бэкапы
backupDir='vps-backup'

# Название фала журнала
logFile=yadisk.log

# UID ключа GPG
GPGENCRYPTUID=''

# Отправлять лог копирования на указанный e-mail
mailLog=''

# Отправлять на e-mail только логи с ошибками
mailLogErrorOnly=false

При использовании шифрования требуется убедиться в наличии открытого подписанного ключа:

$ gpg --list-keys
/<username>/.gnupg/pubring.gpg
------------------------
...
pub   4096R/74188200 2014-07-23
uid                  Ivan Zharenkov <ivan@zharenkov.ru>
sub   4096R/54678085 2014-07-23
...
 
И при необходимости подписать его:
$ gpg --edit-key ivan@zharenkov.ru
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  4096R/74188200  created: 2014-07-23  expires: never       usage: SC  
                     trust: unknown       validity: unknown
sub  4096R/54678085  created: 2014-07-23  expires: never       usage: E   
[ unknown] (1). Ivan Zharenkov <ivan@zharenkov.ru>

gpg> sign

pub  4096R/74188200  created: 2014-07-23  expires: never       usage: SC  
                     trust: unknown       validity: unknown
 Primary key fingerprint: 7349 57AC 9104 0084 6511  0B8A 0CAB AD50 7418 8200

     Ivan Zharenkov <ivan@zharenkov.ru>

Are you sure that you want to sign this key with your
key "Ivan Zharenkov (server) <<username>@zharenkov.ru>" (C56E4A26)

Really sign? (y/N) y

gpg> quit
Save changes? (y/N) y

 

Опции запуска

Скрипт имеет ряд опций.

h -- вызов справки

f -- путь до копируемого файла или его название

g -- установка UID ключа GPG. Опция перекрывает настройки

m -- адрес электронной почты для отправки логов

e -- отправлять только логи с ошибками

Использование скрипта

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

# создаём резервную копию самого себя :) :
$ ./yd-api-backuper.sh -f ./yd-api-backuper.sh

# Шифрование дампа БД с ключом ivan@zharenkov.ru с последующим копированием:
$ ./yd-api-backuper.sh -f mysql.dmp -g ivan@zharenkov.ru

# То же самое, но с отправкой на электронную почту ошибок копирования:
$ ./yd-api-backuper.sh -f mysql.dmp -g ivan@zharenkov.ru -m ivan@zharenkov.ru -e

Обработка ошибок и файл журнала

Если в результате работы скрипта возникнет ошибка, то будет выведено предупреждение:

Some errors occured. Check log file for detail

Логгер запишет в журнал дату и время запуска, имя копируемого файла, а также ошибку, которую вернул Яндекс.API. В приведённом ниже примере приведены ошибки авторизации (неверный токен) и отсутствия целевой папки:

[2014-07-17 09:30:31] yd-api-backuper.sh: Yandex Disk Error: PlatformNotAuthorized
[2014-07-17 09:31:48] yd-api-backuper.sh: Yandex Disk Error: PlatformDirectoryDoesntExists

Замечания

Скрипт не умеет копировать папки и при попытке копирования выдаст ошибку открытия файла. Я это сделал неслучайно, ввиду того, что Яндекс.API генерирует уникальную ссылку для загрузки конкретного файла. Если необходимо забэкапить каталог, то его придётся предварительно архивировать хотя бы tar'ом.

Где взять

Скрипт можно взять на GitHub: https://github.com/ivn86/yd-api-backuper

Добавлено: 2014-07-17, обновлено: 2015-05-25


Поделиться:

4 комментариев

2016-12-14 в 13:51 Naked написал:
При получении https://oauth.yandex.ru/authorize?response_type=token&display=popup&client_id=<id приложения> <> скобки указывать не нужно
2015-06-25 в 21:25 Ещё один параноик написал:
Хороший скрипт! Также рекомендую использовать папки приложений
https://tech.yandex.ru/disk/api/concepts/app-folders-docpage/
2015-05-25 в 11:58 ИvN написал:
> Если задана «g», то должно автоматом включаться шифрование.
Пофикшено. :)
2014-10-22 в 13:45 Алексей Матюшкин написал:
Опция «e» лишняя. Если задана «g», то должно автоматом включаться шифрование.

Ваш Оккам :)

Оставить комментарий

Комментарий появится после одобрения.

Поля со значком * обязательны для заполнения.