Автоматическая синхронизация flash памяти MP3 плеера с локальным каталогом (обновлено)
Отредактировано 2017.02.08
Наконец-то дошли руки, чтобы сделать автоматическую синхронизацию flash памяти MP3 плеера с локальным каталогом.
Описанная ниже реализация тестировалась на дистрибутиве GNU/Linux Kubuntu 14.04 и GNU/Linux Kubuntu 16.04, но, в принципе, ничего не мешает использовать её на любом другом дистрибутиве с udev.
Принцип работы синхронизации следующий: после подключения MP3 плеера (определяется с помощью правила udev) запускается скрипт, выполняющий зеркалирование при помощи rsync. Монтирование и размонтирование выполняется скриптом автоматически. О начале и окончании синхронизации посылается уведомление на рабочий стол.
Идентификацию flash накопителя MP3 плеера будем производить при помощи UUID.
В нашем случае это: 2408-0200
Для начала создадим перманентную точку монтирования:
sudo mkdir /media/MP840
и пропишем правило в /etc/fstab
:
UUID=2408-0200 /media/MP840 vfat noauto,async,rw,user,dmask=000,fmask=111,utf8,codepage=866 0 0
Предположим, что мы храним мастер копию файлов для плеера в
/home/username/MySync/TranscendMP840/sdcard/
,
а полное имя скрипта /home/username/MySync/TranscendMP840/sdcard/sync-to-player.sh
.
Создадим правило для udev /etc/udev/rules.d/99-usb-player-mp840.rules
:
KERNEL=="sd?1", ENV{ID_FS_UUID}=="2408-0200", RUN+="/bin/su username -c '/home/username/MySync/TranscendMP840/sdcard/sync-to-player.sh'"
Содержимое скрипта синхронизации:
#!/bin/bash
set -e # abort if any command failed
# MP3 player must be attached to the USB
if [ ! -b /dev/disk/by-uuid/2408-0200 ]
then
echo "MP840 is not attached"
exit 1
fi
# /etc/fstab:
# UUID=2408-0200 /media/MP840 vfat noauto,async,rw,user,dmask=000,fmask=111,utf8,codepage=866 0 0
mount /media/MP840
# the flag file must be created on the device root
if [ ! -f /media/MP840/rsync-accept.flag ]
then
echo "The flag file on the MP840 is missing"
umount -l /media/MP840
exit 1
fi
# detect the dbus session of the current user
USERNAME=`whoami`
export DBUS_SESSION_BUS_ADDRESS=`ps -u $USERNAME e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]{10}' | tail -c35`
# for kde5 because previous recept is not working
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]
then
pid=$(pgrep -u $USERNAME kdeconnectd)
dbus=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
export DBUS_SESSION_BUS_ADDRESS=$dbus
fi
# notification of the beginning of the synchronization
echo "Synchronization is beginning"
espeak -p 1 "Synchronization is beginning"
if [ ! -z "$DBUS_SESSION_BUS_ADDRESS" ]
then
notify-send "MP3 Player MP840" "Synchronization is beginning..."
fi
# synchronization: mirror
rsync -vr --delete --size-only /home/username/MySync/TranscendMP840/sdcard/ /media/MP840/sdcard/
# operation may take a long time, due to `async` in the /etc/fstab
umount -l /media/MP840
# notification of the completion of synchronization
echo "Synchronization is complete"
espeak -p 1 "Synchronization is complete"
if [ ! -z "$DBUS_SESSION_BUS_ADDRESS" ]
then
notify-send "MP3 Player MP840" "Synchronization is complete!"
fi
# all is well
exit 0
Для того чтобы началась синхронизация в корне файловой системы
плеера необходимо создать пустой файл rsync-accept.flag
. Это необходимо, во-первых,
для того, чтобы исключить затирание носителя информации со случайно совпавшим UUID,
во-вторых, может случиться так, что на плеер будут записаны файлы в обход
мастер копии. В последнем случае следует не забыть удалить данный файл,
чтобы избежать потери данных.
Для работы скрипта вам потребуются установить пакеты libnotify-bin
и espeak
.
UPD: добавлена поддержка kde5 и голосовые оповещения
Ссылки
-
http://reactivated.net/writing_udev_rules.html - writing udev rules by Daniel Drake (dsd)
-
https://gist.github.com/AlekseyDurachenko/335e3ca333a70d16a101 - скрипт синхронизации