Интерфейс для Яндекс.Диска в Ubuntu 14.04



Как известно, Яндекс.Диск на Ubuntu существует только как консольный клиент. Сегодня я решил «хватит это терпеть» и написал для себя простенький скрипт, который значительно упрощает работу с ним (исходники внизу статьи).

Стоит пояснить, что данный скрипт писался для личного пользования, но знакомый уговорил выложить тут, поэтому такие вещи, как абсолютные адреса файлов, будут не абсолютными и вам стоит подправить их для собственной системы.

Для работы нам нужно только три файла:
  1. Файл запуска для взаимодействия с пользователем
  2. Bash скрипт для взаимодействия с клиентом
  3. Иконка сервиса Яндекс.Диск


Начнем с BASH. Создаём в любом удобном месте файл ya-disk.sh:

<code class="bash" style="margin: 0px; padding: 1px 4px; border: 1px solid #e1e1e8; font-size: 12px; vertical-align: baseline; outline: 0px; display: block; white-space: pre-wrap; font-family: Menlo, Monaco, 'Courier New', monospace; color: #222222; border-radius: 3px; background: #f7f7f9;"><span class="shebang" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: olive;">#!/bin/bash</span> case <span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$1</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">in</span> start) <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;"># Команда запуска</span> deamon=`yandex-disk start` notify-send -i <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$HOME</span>/Розробка/yandex-disk/icon.png"</span> <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$deamon</span>"</span> ;; stop) <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;"># Команда остановки</span> deamon=`yandex-disk stop` notify-send -i <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$HOME</span>/Розробка/yandex-disk/icon.png"</span> <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$deamon</span>"</span> ;; *) <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;"># Команда проверки статуса</span> deamon=`yandex-disk status` <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">if</span> <span class="test_condition" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px;">[[ <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$deamon</span>"</span> == <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"Ошибка: демон не запущен"</span> ]]</span> <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;"># Проверяем состояние демона и если он не запущен - Запускаем.</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">then</span> deamon=`yandex-disk start` notify-send -i <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$HOME</span>/Розробка/yandex-disk/icon.png"</span> <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$deamon</span>"</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">else</span> <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;"># Если демон уже запущен собираем информацию и выводим</span> status=`yandex-disk status | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">'^Статус ядра синхронизации: .*$'</span> | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">': .*$'</span>` all=`yandex-disk status | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">'Всего:.*'</span>` nfree=`yandex-disk status | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">'Занято:.*'</span>` free=`yandex-disk status | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">'Свободно:.*'</span>` maxfile=`yandex-disk status | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">'Максимальный размер файла:.*'</span>` trash=`yandex-disk status | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">'Размер корзины:.*'</span>` <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">if</span> <span class="test_condition" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px;">[[ <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$status</span>"</span> == <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">": синхронизация"</span> ]]</span> <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;"># Если демон в процесе синхронизации</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">then</span> SUNC=`yandex-disk status | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">'Статус синхронизации: .*'</span> | grep -o <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">'[^:]*$'</span>` notify-send -i <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$HOME</span>/Розробка/yandex-disk/icon.png"</span> <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"Синхронизация"</span> <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"Прогресс:<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$SUNC</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$all</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$nfree</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$free</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$maxfile</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$trash</span>"</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">elif</span> <span class="test_condition" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px;">[[ <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$status</span>"</span> == <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">": обработка данных"</span> ]]</span>; <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">then</span> <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;"># Если демон ведёт учет файлов</span> notify-send -i <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$HOME</span>/Розробка/yandex-disk/icon.png"</span> <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"Статус<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$status</span>"</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">else</span> <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;"># Если демон простаивает</span> notify-send -i <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$HOME</span>/Розробка/yandex-disk/icon.png"</span> <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"Статус<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$status</span>"</span> <span class="string" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #339900;">"<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$all</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$nfree</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$free</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$maxfile</span>\n<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #968e5b;">$trash</span>"</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">fi</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">fi</span> ;; esac <span class="comment" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: gray;">#окончание оператора case.</span> <span class="keyword" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">exit</span> 0 </code>


Теперь создадим файл запуска.

Переходим по адресу, где лежат все наши ярлыки приложений:

<code class="bash" style="margin: 0px; padding: 1px 4px; border: 1px solid #e1e1e8; font-size: 12px; vertical-align: baseline; outline: 0px; display: block; white-space: pre-wrap; font-family: Menlo, Monaco, 'Courier New', monospace; color: #222222; border-radius: 3px; background: #f7f7f9;">cd /usr/share/applications/ </code>

Теперь создаем ярлык нашего нового приложения командой:

<code class="bash" style="margin: 0px; padding: 1px 4px; border: 1px solid #e1e1e8; font-size: 12px; vertical-align: baseline; outline: 0px; display: block; white-space: pre-wrap; font-family: Menlo, Monaco, 'Courier New', monospace; color: #222222; border-radius: 3px; background: #f7f7f9;">sudo gedit ya-disk.desktop </code>

Со следующим содержанием:

<code class="bash" style="margin: 0px; padding: 1px 4px; border: 1px solid #e1e1e8; font-size: 12px; vertical-align: baseline; outline: 0px; display: block; white-space: pre-wrap; font-family: Menlo, Monaco, 'Courier New', monospace; color: #222222; border-radius: 3px; background: #f7f7f9;">[Desktop Entry] Version=1.0 Type=Application Name=Яндекс.Диск Comment=Позволяет Запускать, останавливать и получать информацию о состоянии вашего Яндекс.Диска Exec=/home/alex/Розробка/yandex-disk/ya-disk.sh Terminal=<span class="literal" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">false</span> Icon=/home/alex/Розробка/yandex-disk/icon.png StartupNotify=<span class="literal" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: #4d7386;">true</span> Actions=Window;Document; [Desktop Action Window] Name=Запустить Exec=/home/alex/Розробка/yandex-disk/ya-disk.sh start OnlyShowIn=Unity; [Desktop Action Document] Name=Остановить Exec=/home/alex/Розробка/yandex-disk/ya-disk.sh stop OnlyShowIn=Unity; </code>

Не забудьте изменить значение параметров Exec и Icon. Они должны вести на соответствующие файлы на вашем.

И последний штрих. Скачайте и разместите иконку по адресу, который указан в параметре Icon
Для меня это:

<code class="bash" style="margin: 0px; padding: 1px 4px; border: 1px solid #e1e1e8; font-size: 12px; vertical-align: baseline; outline: 0px; display: block; white-space: pre-wrap; font-family: Menlo, Monaco, 'Courier New', monospace; color: #222222; border-radius: 3px; background: #f7f7f9;">/home/alex/Розробка/yandex-disk/icon.png </code>

Вот и всё.

В Dash появится иконка Яндекс.Диск. Если вынести её на панель Unity, то правой кнопкой можно останавливать и запускать демон.

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