воскресенье, 24 февраля 2019 г.

ODrive – клиент синхронизации с Диском Google для Ubuntu и производных

На днях мой родственник прислал мне интересную ссылку на клиент синхронизации с Диском Google для Ubuntu и её производных. Так как Linux Mint и является такой производной, то мне стало интересно "пощупать" данное решение.

Скачать можно пакет deb, App.Image или snap с сайта github.

Мной был скачан пакет deb, который и был установлен на Linux Mint 19.1 xfce.

Запуск установленного ПО был произведен из меню с секции "Прочее":


Если такой пункт у Вас отсутствует, то запустить можно из терминала командой

"/opt/OpenDrive/odrive" %U

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



После нажатия на кнопку "Next" было предложено соединиться с учётной записью Google и определить каталог для синхронизации.


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





После того как приложению ODrive будет разрешён доступ к учётной записи Google синхронизация с Google Диском станет доступной.



Если вдруг после начала синхронизации Вы получите такую же ошибку как и у меня,


то проверьте качество соединения с Интернет. В моём случае, например, другой компьютер локальной сети в это время активно получал данные через торрент-клиент. После приостановки работы торрент-клиента синхронизация стала осуществляться. При этом состояние синхронизации отображалось на значке ODrive дополнительным значком красного цвета.



Сначала уведомление об игнорировании 4-х файлов не вызвало обеспокоенности, но со временем она стала возрастать. А после завершения процесса синхронизации и вовсе приобрела характеристику "неприемлемо". При этом значок состояния показывал, что синхронизация завершена.




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


Возвращаясь к вопросу об игнорировании файлов, справедливости ради следует отметить, что в ходе дальнейших запусков ODrive такого уведомления не отображалось:


При вызове контекстного меню (клик правой кнопкой по значку) отобразились пункты:


Preferences ... (предпочтения) – вызывает окно настроек ODrive. Окно настроек включает в себя имя учётной записи Google и расположение каталога синхронизации на жёстком диске.

Launch on startup – запускать при старте компьютера. По умолчанию галочка не проставлена.

Quit ODrive  – завершить работу приложения.

При удалении или добавлении файлов уведомления отображаются через оповещения, например:



Настройки приложения, кэш и журналы работы расположены в ~/.config/odrive


Для назначения эмблем Drive на каталоги скачайте архив zip, содержащий эмблемы Диска Google и Odrive, и воспользуйтесь приёмами их добавления к существующим эмблемам: для Linux Mint 18 или для Linux Mint 19.

Для полного удаления приложения из системы выполните в терминале

sudo apt purge -y odrive && rm -fr ~/.config/odrive

Как указано на сайте omgubuntu.co.uk, в отличие от имеющихся решений, Odrive бесплатен для использования: free, open-source Electron application

Недостатком ODrive является невозможность настроить выборочную синхронизацию каталогов. Клиент синхронизирует всё.

вторник, 19 февраля 2019 г.

Восстановление одной из папок по умолчанию домашнего каталога пользователя xfce

Не так давно на компьютер, который большей частью функционирует в полуавтоматическом режиме понадобилось поместить контент в каталог "Музыка". Однако такой каталог отсутствовал! При его создании заново он не имел системного значка, то есть являлся обычным каталогом.


Некоторое время приходилось с этим фактом мириться, но, в конце концов, желание разобраться пересилило природную "ленивость".

При просмотре файла ~/.config/user-dirs.dirs было обнаружено, что в нём отсутствуют указатели на каталоги "Музыка" и "Общие". На листинге ниже обратите внимание на строки XDG_MUSIC_DIR и XDG_PUBLICSHARE_DIR:

XDG_DESKTOP_DIR="$HOME/Рабочий стол"
XDG_DOWNLOAD_DIR="$HOME/Загрузки"
XDG_TEMPLATES_DIR="$HOME/Шаблоны"
XDG_PUBLICSHARE_DIR="$HOME/"
XDG_DOCUMENTS_DIR="$HOME/Документы"
XDG_MUSIC_DIR="$HOME/"
XDG_PICTURES_DIR="$HOME/Изображения"
XDG_VIDEOS_DIR="$HOME/Видео"

С целью попытки восстановления необходимых каталогов:

1. В упомянутый выше файл были внесены изменения (xed ~/.config/user-dirs.dirs):

XDG_PUBLICSHARE_DIR="$HOME/Общие"

XDG_MUSIC_DIR="$HOME/Музыка"

2. Осуществлён перезапуск Thunar командой thunar -q

3. Вручную созданы каталоги "Музыка" и "Общие", которые автоматически получили требуемые значки:


4. Для помещения "Музыка" на боковую панель закладок выделите его и выполните команду "Отправить на Боковая панель (закладку)" через правое контекстное меню.

P.S. После сравнения с другой системой оказалось, что каталог "Общие" в ней имеет имя "Общедоступные". Впрочем, ничто не мешает исправить "Общие" на "Общедоступные" описанным выше способом.

воскресенье, 17 февраля 2019 г.

Linux Mint 19.1 – кнопка запуска "состояние Диска Яндекс" + автозакрытие окна терминала через xx секунд


Применявшийся ранее в Linux Mint 18 способ вызова команды отображения состояния синхронизации Диска Яндекс посредством запуска скрипта bash через кнопку запуска в Linux Mint 19.1 xfce стал работать некорректно.

При отработке status.sh

#!/bin/bash
xfce4-terminal -H -e "yandex-disk status"

наблюдалась следующая картина:


Установка галочки в поле "Больше не спрашивать" к желаемому результату не приводила.

Приемлемый результат был достигнут только при изменении status.sh на:

#!/bin/bash
xfce4-terminal -x sh -c 'yandex-disk status; exec bash'


Про аналогичное решение для Cinnamon читайте здесь.

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

В этом случае попробуйте ввести в команду параметр задания ширины/высоты окна терминала  --geometry=AAxBB , где

AA – ширина окна, BB – высота окна

Меня, например, устроил вариант 80х35 :

#!/bin/bash
xfce4-terminal --geometry=80x35 -x sh -c 'yandex-disk status; exec bash'


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

Как указано в этой публикации, в файл ~/.bashrc необходимо добавить строки

# Exit Terminal
TMOUT=xx
export TMOUT

xx – время бездействия в секундах.

вторник, 12 февраля 2019 г.

Про удаление файлов/папок через N дней через скрипт bash в Linux

При обмене отдельными файлами или файлами, организованными в папки, непременно возникает вопрос своевременного их удаления как устаревших или потерявших актуальность. Как правило, респонденты не удаляют предоставленные им данные: нет времени, потом, забыл(а) ... В итоге время нахождения контента в папках обмена начинает стремиться к бесконечности. Действительно, чего волноваться? Диски нынче большие, места хватает ...

Описанный ниже вариант используется в целях "найти и удалить контент старше N дней" в папках общего доступа таких ресурсов как Диск Яндекс, Dropbox, MEGA, pCloud. При этом каждая папка имеет свои настройки времени хранения контента, при превышении которого он подлежит удалению.

Примечание 1. Указанные в тексте команды могут быть не оптимальными с точки зрения правильного кодинга. Полагаю, что мне это может быть простительным, так как, не имея в данном вопросе профильного образования, информацию пришлось собирать по кусочкам с разных сайтов. Поэтому, по большому счёту, все приводимые ниже листинги являются своего рода компиляцией уже готовых решений.

Итак, обмен с использованием 5 ресурсов облачного хранения: 4 Яндекс Диска и 1 Dropbox. В каждом их них создана папка общего доступа.

Удалить файлы/папки старше N дней

Удаление устаревших файлов и папок осуществляется в ходе задания, запускаемого через cron, то есть без участия пользователя. В процессе выполнения задания создаются файлы отчётов - списка удалённого контента. При этом в имени файла отчёта содержится дата его создания. Файлы отчётов также подлежат удалению через определённое время (X дней).

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

Примечание 2. В силу особенностей запуска по расписанию клиентов pCloud и MEGA удаление в них файлов/папок старше N дней необходимо производить перед выполнением остановки клиента. Про остановку клиента читать здесь и здесь.

Объясняется это тем, что после запуска pcloud и megasync выполнение последующих за ними команд невозможно до тех пор, пока pcloud или megasync активны. А после выключения процессов pcloud или megasync нет синхронизации и, соответственно, передачи изменений в облако.


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

Скрипт очистки использует инструкции "если A, то B и если не А, то С".

if <запрос на соответствие условию>
then <действие 1>
else <действие 2>
fi

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

Перед выполнением указываются расположение папки для поиска (DIR1) и расположение папки отчётов (DIR2). DIR1 и DIR2 используются для того, чтобы в скрипте не писать каждый раз пути к папкам, заменяя их указанными переменными. Имена DIR1 и DIR2 указаны для примера. Для лучшего восприятия своих скриптов примените понятные Вам имена.

Формулировка условия описывается переменной filecount.

Команда "ничего не делать" соответствует символу двоеточия, то есть : .

DIR1=/home/user/Exchange/Beatrice
DIR2=/home/user/Exchange/Reports
filecount=`find $DIR1 -type f | wc -l`
if [ $filecount -eq 0 ];
then
:

Если же какие-то файлы присутствуют, то выполняется ряд последовательных операций:

– определить текущую дату;

– сформировать файл протокола с датой создания;

– удалить контент старше N дней.

else
date=`date '+%d'`
find $DIR1 -mtime +N > $DIR2/$date.Beatrice.txt
find $DIR1 -mtime +N -delete
fi

Примечание 3.

Результатом выполнения date является установка даты. В указанном выше случае файл будет иметь наименование, например, 18.Beatrice.txt, то есть за 18-число месяца. 


Если в имя файла есть необходимость включать и месяц, то переменная date должна быть указана в виде `date '+%m.%d'` Пример результирующего файла – 04.18.Beartice.txt

 %m соответствует текущему месяцу, а %d – дню месяца.

Примечание 4.
Имеется несколько вариантов команды удаления: 


 find /path -mtime +N -exec rm -rf {} \; 

 find /path -type f -mtime +N | xargs rm -rf  

 find /path -mtime +N -delete

В средней команде указан поиск файлов: -type f   Для папок вводить -type d

На одном из форумов было найдено, что -delete работать будет быстрее. Так как лично мне была более понятна команда -delete, то она и приводится во всех указанных ниже листингах команд.


Уточнение для Dropbox и MEGA. В папках общего доступа таких клиентов могут находиться скрытый файл .dropbox или папка .debris Поэтому целесообразно исключить их из удаления, добавив инструкцию "кроме".

Кроме –  ! -name 'имя_объекта'. Например:

find $DIR1 ! -name '.dropbox' -mtime +N -delete или

find $DIR1 ! -name '.debris' -mtime +N -delete

Примечание 5.

При использовании параметра +N Вы можете быть удивлены тем, что контент будет удалён не через N дней, а позднее. Это связано в тем, что аргумент -mtime интерпретируется как количество целых дней. То есть, -mtime +N означает строго больше , -mtime -N означает строго меньше. Другими словами, если возраст объекта составляет 1 день, 23 часа, 59 минут и 59 секунд, то -mtime +1 обрабатывает его, как будто это 1 день, 0 часов, 0 минут. Связано с особенностями программной реализации.

В итоге получается, что -mtime +1 выбирает файлы, которые были изменены как минимум 2 дня назад. Чтобы получить файлы, измененные не менее 1 дня назад, используйте -mtime +0

Другой способ. Если необходимо удалить файлы старше чем, например, ровно 48 часов, то используйте –daystart: find /path type -f -daystart -mtime +1

Если необходимо указывать минуты, то используется -mmin N, что соответствует утверждению "данные файлы последний раз изменены N минут назад.


Примечание 6.

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

atime

atime означает время доступа. Эта временная метка сообщает, когда последний раз обращались к файлу. Изменяется, если использовались cat, vim, less или какой-либо другой инструмент для чтения или отображения содержимого файла.

mtime

mtime означает время изменения (модификации). Означает, что содержимое файла было изменено путем редактирования файла. При копировании или переносе в другое место хранения это значение не изменяется.

ctime

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

Как просмотреть временные метки файла? Командой stat . Пример:

stat ~/winehq.key
Файл: /home/user/winehq.key
Размер: 3220 Блоков: 8 Блок В/В: 4096 обычный файл
Устройство: 801h/2049d Inode: 18880312 Ссылки: 1
Доступ: (0664/-rw-rw-r--) Uid: ( 1000/ minter) Gid: ( 1000/ user)
Доступ: 2018-12-20 03:48:48.108006716 +0300
Модифицирован: 2018-12-19 17:07:25.000000000 +0300
Изменён: 2018-12-20 03:48:42.368059166 +0300
Создан: -

Как узнать, когда был изначально создан файл?

Вы заметили последнюю строку вывода команды stat? В нём указывается «Создан». Можно предположить, что это представляет собой timestmap, когда файл был «рождён» (или создан, если быть более точным).

Хотя ext4 поддерживает временную метку создания, команда stat в настоящее время не может её показать. Возможно, будущие версии команды stat покажут временную метку создания в строке «Создан».

В некоторых случаях нужно выяснить, был ли файл удален и пересоздан заново или это тот самый оригинальный файл. По параметру ctime достоверно сказать об этом нельзя, так как он может меняться при любых изменениях атрибутов. Поэтому нужен другой параметр для проверки. В тот момент, когда файл удаляют и создают заново с тем же именем, большая часть его атрибутов остается неизменной. Меняются в основном два – ctime и inode. ctime покажет, когда последний раз изменились атрибуты файла (совсем не обязательно, что из-за удаления и создания), а inode изменится, так как для операционной системы это будет уже совсем другой файл с новым индексным дескриптором.

Смотреть inode можно двумя способами:

stat
ls -i


Ожидается, что в результате выполнения find $DIR1 -mtime +N -delete будут найдены и удалены все объекты старше N дней. Однако, как говорят, "гладко было на бумаге, да забыли про овраги".

На практике выяснилось, что могут иметь место случаи, когда "хорошая мысля пришла апасля" и файлы могут быть перемещены в другую созданную позднее папку. Получится ситуация, при которой mtime созданной папки более "молодой", чем mtime содержащихся в ней файлов. В итоге – после удаления в ней файлов эта папка не будет удалена (другое значение mtime) и будет представлять из себя пустой объект.

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


В этом случае можно использовать условие "посчитаем пустые папки". Если ничего не будет найдено, то ничего и не делаем. Если что-то найдём, то удалим. При этом исключим из удаления саму папку общего доступа (в рассматриваемом случае Beatrice), так как было несколько случаев удаления подобной папки, не содержащей уже никаких данных.

dircount=`find $DIR1 -type d -empty | wc -l`
if [ $dircount -eq 0 ];
then
:
else
find $DIR1 ! -name 'Beatrice' -empty -delete
fi

Аналогичные описанным выше действия применяются и для файлов отчётов. То есть используется алгоритм:

– найти в папке отчетов файлы в имени которых присутствует Beatrice.txt. В самом начале процедуры удаления удаления такой файл был сформирован. Его полное имя будет, например, 18.Beatrice.txt (см. выше);

– если таких файлов не найдено, то ничего не делать;

– при нахождении удалить такие файлы старше X дней.

filecount=`find $DIR2 -name *.Beatrice.txt -mtime +X | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $R -name *.Beatrice.txt -mtime +X -delete
fi

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

filecount=`find $DIR2 -name *.Beatrice.txt -empty | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $R -name *.Beatrice.txt -empty -delete

Завершить выполнение скрипта командой exit

Итого, полный текст скрипта будет иметь вид:

#!/bin/bash
DIR1=/home/user/Exchange/Beatrice
DIR2=/home/user/Exchange/Reports
filecount=`find $DIR1 -type f | wc -l`
if [ $filecount -eq 0 ];
then
:
else
date=`date '+%d'`
find $DIR1 -mtime +N > $DIR2/$date.Beatrice.txt
find $DIR1 -mtime +N -delete
fi
dircount=`find $DIR1 -type d -empty | wc -l`
if [ $dircount -eq 0 ];
then
:
else
find $DIR1 ! -name 'Beatrice' -empty -delete
fi
filecount=`find $DIR2 -name *.Beatrice.txt -mtime +X | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $DIR2 -name *.Beatrice.txt -mtime +X -delete
fi
filecount=`find $DIR2 -name *.Beatrice.txt -empty | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $DIR2 -name *.Beatrice.txt -empty -delete
exit

Оформите как исполняемый файл. Например, clean или clean.sh. Принципиального значения наличие/отсутствие расширения не имеет. Важно лишь то, чтобы такой файл был исполняемым.

Примечание 7. На практике в Linux Mint 19 xfce через свойства файла в менеджере файлов Thunmar файлам без расширения (скриптам) не удавалось установить "исполняемый". В таком случае его можно переименовать из, например, clenan в clean.sh, назначить его исполняемым, а затем переименовать его обратно в clean. "Исполняемость" файла сохранится.

В случае отсутствия необходимости создания файлов отчётов и их последующего удаления через X дней приведенный выше текст скрипта упрощается до вида:

#!/bin/bash DIR=/home/user/Exchange/Beatrice
filecount=`find $DIR -type f | wc -l`
if [ $filecount -eq 0 ];
then
:
else
find $DIR1 -mtime +N -delete
fi
dircount=`find $DIR -type d -empty | wc -l`
if [ $dircount -eq 0 ];
then
:
else
find $DIR ! -name 'Beatrice' -empty -delete
fi
exit

Примечание 8. Не забывайте про особенность общих папок в Dropbox и MEGA. Добавляйте для них исключения .dropbox и .debris (см. выше).

Запустить клиент и удалить папки/файлы старше N дней

Запуск клиента Диска Яндекс

Поясняющие подробности можно прочитать здесь. Приводится только пример скрипта.

#!/bin/bash
crash=/home/user/.config/yandex-disk/crash.txt
D1=/home/user/.config/yandex-disk
D2=/home/user/scripts/yandex/client-1
if [ -f $crash ]; then
rm -f $D1/crash.txt
else
:
fi
rm -f $D1/config.cfg
rm -f $D1/iid
rm -f $D1/passwd
cp $D2/config.cfg $D1
cp $D2/iid $D1
cp $D2/passwd $D1
yandex-disk start
sleep 60
/home/user/scripts/clean-1
sleep 240
yandex-disk stop
sleep 5 && exit

Примечание 9.

После старта клиента Диска Яндекс (yandex-disk start) даётся время на запуск клиента и его соединение с облаком (sleep 60). Затем осуществляется очистка. После этого даётся 4 минуты на приём/передачу данных (sleep 240), после чего следует команда остановки клиента и завершения работы скрипта. 60 секунд и 240 секунд указаны условно. Пользователь сам определяет сколько времени должно пройти и следует ли ему использовать первое ожидание (sleep 60).


Если на Диске Яндекс больше чем 1 папка обмена, то тогда на каждую папку создаётся свой скрипт. Они, соответственно, должны быть запущены один за другим, например:

/home/user/scripts/clean-1
/home/user/scripts/clean-2
/home/user/scripts/clean-3

Ожидание 5 секунд после команды остановки Диска Яндекс введено "на всякий случай", чтобы гарантировать остановку клиента с используемой конфигураций. Это обусловлено тем, что у меня последовательно другом за другом запускаются 4 Диска Яндекс, каждый со своими настройками.

Если у Вас только 1 учётная запись Диска Яндекса, то нет необходимости переписывать конфигурацию клиента. Скрипт упрощается до вида:

#!/bin/bash
yandex-disk start
sleep 60
/home/user/scripts/clean-1
sleep 240
yandex-disk stop
exit

Запуск клиента Dropbox

Пример:

#!/bin/bash
dropbox start
sleep 40
/home/user/scripts/clean-4.sh
sleep 260
dropbox stop
exit

Скрипт запуска клиентов с очисткой

Например, у меня оформлен запуск 5-ти клиентов последовательно друг за другом. Перед запуском очереди заданий клиентов Диска Яндекс проверяется наличие уже запущенного экземпляра Диска Яндекс. Если такой экземпляр будет найден, то выдаётся команда на его остановку.

#!/bin/bash
yd=/tmp/yandex-disk-*
if [ -d $yd ]; then
yandex-disk stop
else
:
fi
sleep 5
/home/user/scripts/yandex/client1/daemon
/home/user/scripts/yandex/client2/daemon
/home/user/scripts/yandex/client3/daemon
/home/user/scripts/yandex/client4/daemon
/home/user/scripts/dropboxauto
exit

При включении мной такого задания по расписанию имелось в виду, что каждое задание выполняется не менее 5-ти минут. Следовательно, общее время выполнения указанных заданий составит не менее 25-ти минут. В реальности оно больше за счёт различного рода пауз между отдельными операциями, поэтому его продолжительность была оценена в 30 минут.

воскресенье, 10 февраля 2019 г.

Автоматизация процессов в Linux: периодический запуск Dropbox в указанный период времени

Выполнение указанной задачи может быть обусловлено необходимостью отслеживания появления новых файлов (папок) в папке общего доступа (обмена) Dropbox.

В частности, с 19 до 22 часов Dropbox должен запускаться на 10 минут. При этом период между данными запусками должен составить 30 минут.

При завершении этого 10-минутного сеанса работы папка общего доступа (обмена) должна быть проверена на наличие новых файлов/папок. Если такие файлы/папки имеются, то они подлежат перемещению в другую папку. Затем папка назначения открывается сопоставленным менеджером файлов (nautilus, nemo, caja, thunar).

Так как готового решения, на первый взгляд, не существует, то пришлось создать "самопальное" решение на bash. Может быть, кому-нибудь пригодится это решение или его отдельные элементы.


Задача является комплексной и состоит из нескольких отдельных задач:

– проверка наличия уже существующего процесса Dropbox;

– запуск 10-минутного сеанса работы;

– проверка наличия файлов/папок в папке общего доступа;

– назначение периодического пользовательского задания cron.


Проверка существования запущенного сеанса Dropbox обусловлена тем, что в назначенное время Dropbox может быть запущен вручную для выполнения какой-либо синхронизации. Если Dropbox уже запущен, то он должен быть остановлен.

Основным процессом Dropbox является выполняемая задача

dropbox-dist/dropbox-lnx.x86_64-.../dropbox , где в качестве многоточния указана версия используемого в настоящее время клиента. Но момент написания данной публикации такой версией является 66.4.84, поэтому в диспетчере задач необходимо произвести поиск задачи

dropbox-dist/dropbox-lnx.x86_64-66.4.84/dropbox

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

1. Определяется текущая версия ПО Dropbox

ver=`cat ~/.dropbox-dist/VERSION`

2. Нас основании текущей версии указывается имя задачи для поиска

task=dropbox-dist/dropbox-lnx.x86_64-$ver/dropbox

3. Осуществляется поиск задачи Dropbox. Результат имеет два варианта: 0 – Dropbox не запущен, 1 – Dropbox запущен. Результат записывается в файл dropbox.txt  Расположение данного файла указано для моих нужд, у Вас оно определяется Вами. При выводе результата в файл dropbox.txt предыдущее значение заменяется новым, поэтому необходимости в последующем удалении данного файла не имеется.

ps ax | grep -v grep | grep $task | wc -l > ~/scripts/dropbox.txt

4. Для следующей операции сравнения "если ... то ..." производится считывание значения, записанного в файл dropbox.txt

value=`cat ~/scripts/dropbox.txt`

5. Если Dropbox не запущен (в dropbox.txt записан 0), то никаких действий не производится. В противном случае (Dropbox запущен) выдаётся команда остановки Dropbox.

 if [ $value -eq 0 ];
then
:
else
dropbox stop
fi

В результате получился следующий скрипт bash, которому условно назначено имя exist.sh

#!/bin/bash
ver=`cat ~/.dropbox-dist/VERSION`
task=dropbox-dist/dropbox-lnx.x86_64-$ver/dropbox
ps ax | grep -v grep | grep $task | wc -l > ~/scripts/dropbox.txt
value=`cat ~/scripts/dropbox.txt`
if [ $value -eq 0 ];
then
:
else
dropbox stop
fi
sleep 5 && exit

Команда 5 секундной паузы введена для "перестраховки", так как после команды остановки Dropbox необходимо 3-5 секунд для закрытия всех открытых подключений.


Проверка наличия в папке обмена новых файлов/папок. Автоматический перенос данных в другую папку.

Определяются переменные: H-1 – общая папка (обмена) Dropbox, H-2 – папка назначения, в которую будут переноситься данные.

D1=/home/user/Dropbox/H-1
D2=/home/user/Work/H-2

Производится подсчёт файлов (соответственно и папок, в которых будут расположены файлы):

count=`find $D1 -type f | wc -l`

Если в результате поиска выдано значение 0 (нет никаких файлов), то не производится никаких действий:

if [ $count -eq 0 ];
then
:

В противном случае всё содержимое папки общего доступа Dropbox копируется в другую папку (назначения):
 
else
cp -r $D1/* $D2

В папке источника данные подлежат удалению. Так как папка общего доступа Dropbox может иметь скрытый файл .dropbox, то он из процесса удаления должен быть исключён. То есть, в папке источника найти все данные и удалить их за исключением файла .dropbox:

find $D1/* ! -name '.dropbox' -delete

В папке назначения наоборот – найти и удалить скопированный из папки источника файл .dropbox, так как команда cp -r будет копировать всё, в том числе и скрытые файлы/папки: 

find $D2 -name '.dropbox' -delete

Завершить цикл и открыть папку назначения в файловом менеджере:

fi
xdg-open $D2

Листинг скрипта (например, do.sh) на bash:

#!/bin/bash
D1=/home/user/Dropbox/H-1
D2=/home/user/Work/H-2
count=`find $D1 -type f | wc -l`
if [ $count -eq 0 ];
then
:
else
cp -r $D1/* $D2
find $D1/* ! -name '.dropbox' -delete
find $D2 -name '.dropbox' -delete
fi
xdg-open $D2
exit

Если соответствующая переменной D1 папка является вложенной папкой общей папки Dropbox, то в ней файл .dropbox будет отсутствовать. В таком случае скрипт упрощается:

#!/bin/bash
D1=/home/user/Dropbox/H-1
D2=/home/user/Work/H-2
count=`find $D1 -type f | wc -l`
if [ $count -eq 0 ];
then
:
else
cp -r $D1/* $D2
find $D1/* -delete
fi
xdg-open $D2
exit

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


Отображение в Linux Mint 18.3 xfce


Отображение в Linux Mint 19.1 xfce

В этом случае можно использовать скрипт:

#!/bin/bash
DIR=/home/user/Dropbox/H-1
count=`find $DIR -type f | wc -l`
if [ $count -eq 0 ];
then
:
else
zenity --width=200 --height=50 --info --text "\nВ каталоге H-1 имеются данные" 2>/dev/null
fi
exit

Команда zenity вызывает отображение сообщения на экране монитора, которое будет отображаться до тех пор, пока пользователь не нажмёт кнопку OK.

--width=200 --height=50 указывает на ширину и высоту отображаемого окна. В Linux Mint 18.3 в этом не было необходимости, а в Linux Mint 19.1 такие параметры уже пришлось ввести.

Символ \n соответствует команде "перейти на новую строку". Введено для более лучшего визуального восприятия сообщения.



Скрипт 10-минутного сеанса работы Dropbox состоит из двух вышеописанных и команд запуска/остановки Dropbox.

#!/bin/bash
~/scripts/exist.sh
dropbox start -i
sleep 600
~/scripts/do.sh
dropbox stop
sleep 5 && exit

Команда 5 секундной паузы введена для "перестраховки", так как после команды остановки Dropbox необходимо 3-5 секунд для закрытия всех открытых подключений.


Периодический запуск Dropbox в указанный промежуток времени осуществляется через пользовательское задание cron. Запустите в терминале crontab -e и назначьте задание. Для описанной задачи, например:

*/30 19-22 * * * export DISPLAY=:0 && /путь_к_скрипту

понедельник, 4 февраля 2019 г.

Автоопределение кодировки в xed (Linux Mint)

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


Чтобы текст отображался нормально выполните в терминале одну из двух команд, указанных ниже. Если команда не соответствует, то терминал выдаст какое-либо сообщение. При правильной команде терминал после некоторого "размышления" вернётся к состоянию готовности к приёму команд.

Для Linux Mint xfce 18.3 и 19.* вводить вторую команду.

gsettings set org.x.editor auto-detected-encodings "['UTF-8', 'WINDOWS-1251', 'KOI8-R', 'CP866', 'CURRENT', 'ISO-8859-15', 'UTF-16']"

gsettings set org.x.editor.preferences.encodings auto-detected "['UTF-8', 'WINDOWS-1251', 'KOI8-R', 'CP866', 'CURRENT', 'ISO-8859-15', 'UTF-16']"

При открытии проблемного файла снова вопрос с повестки дня был снят.


воскресенье, 3 февраля 2019 г.

Полное удаление wicd из Linux Mint

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

Для установки wicd одной командой выполните в терминале

sudo apt update && sudo apt install -y wicd && sudo systemctl stop NetworkManager.service && sudo systemctl disable NetworkManager.service && shutdown -r now

После перезагрузки компьютера будет запущена программа wicd и далее всё по-русски.

В принципе, работа wicd не вызывала у меня нареканий. Но в конечном итоге пришлось от неё отказаться и вернуться на Network Manager. В моей LAN используется автоматическое внесение в DNS хостов и сопоставленных им IP, полученных от dhcp (подробности). При использовании wicd такой механизм работать перестал.

Ситуация же с удалением wicd напомнила мне фразу из к/ф "17 мгновений весны":

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

"Выход" из wicd сопровождался таким количеством остаточных следов, что пришлось разработать целую операцию по их удалению.

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

В список подлежащих удалению компонентов не были включены

/usr/lib/python2.7/dist-packages/wicd  и
/usr/lib/python2.7/dist-packages/wicd-1.7.4.egg-info

так как версия python со временем может измениться. Эти компоненты можно удалить вручную, запустив с правами суперпользователя (через sudo) Midnight Commander или графический менеджер файлов.

В итоге получилось 8 последовательно запускаемых скриптов, которые выполняют процедуру очистки системы от wicd. Все эти 8 скриптов выполняются в рамках объединённой команды по удалению, например wicd-purge.sh (исполняемый файл), запускаемой в терминале:

sudo /home/user/wicd-purge.sh

#!/bin/bash
/home/user/1.sh
/home/user/2.sh
/home/user/3.sh
/home/user/4.sh
/home/user/5.sh
/home/user/6.sh
/home/user/7.sh
/home/user/8.sh

Содержание каждого из скриптов приведено ниже:

Листинг 1.sh

#!/bin/bash
apt purge -y wicd
exit

Листинг 2.sh

#!/bin/bash
rm -fr /etc/wicd
rm -fr /etc/default/wicd
rm -fr /var/run/wicd
rm -fr /var/log/wicd
rm -fr /var/lib/wicd
rm -fr /usr/share/wicd
rm -fr /usr/bin/wicd
rm -fr /run/wicd
rm -fr /usr/share/bug/python-wicd
rm -fr /usr/share/bug/wicd-daemon
rm -fr /usr/share/bug/wicd-gtk
rm -fr /usr/share/doc/python-wicd
rm -fr /usr/share/doc/wicd-daemon
rm -fr /usr/share/doc/wicd-gtk
rm -fr /sys/fs/cgroup/devices/system.slice/wicd.service
rm -fr /sys/fs/cgroup/systemd/system.slice/wicd.service
exit

Листинг 3.sh

#!/bin/bash
rm /etc/dbus-1/system.d/wicd.conf
rm /etc/init.d/wicd
rm /etc/rc0.d/K01wicd
rm /etc/rc1.d/K01wicd
rm /etc/rc2.d/S03wicd
rm /etc/rc3.d/S03wicd
rm /etc/rc5.d/S03wicd
rm /etc/rc6.d/K01wicd
rm /etc/xdg/autostart/wicd-tray.desktop
rm /usr/lib/pm-utils/sleep.d/55wicd
rm /usr/share/app-install/desktop/wicd-gtk.wicd.desktop
rm /usr/share/app-install/icons/wicd-gtk.svg
rm /usr/share/applications/wicd.desktop
rm /usr/bin/wicd-client
rm /usr/bin/wicd-cgtk
rm /usr/sbin/wicd
exit

Листинг 4.sh

#!/bin/bash
rm /usr/share/icons/hicolor/128x128/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/16x16/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/192x192/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/22x22/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/24x24/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/32x32/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/36x36/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/48x48/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/64x64/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/72x72/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/48x48/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/96x96/apps/wicd-gtk.png
rm /usr/share/icons/hicolor/scalable/apps/wicd-gtk.svg
rm /usr/share/pixmaps/wicd-gtk.xpm
exit

Листинг 5.sh

#!/bin/bash
rm /usr/share/locale/ca/LC_MESSAGES/wicd.mo
rm /usr/share/locale/cs/LC_MESSAGES/wicd.mo
rm /usr/share/locale/da/LC_MESSAGES/wicd.mo
rm /usr/share/locale/de/LC_MESSAGES/wicd.mo
rm /usr/share/locale/el/LC_MESSAGES/wicd.mo
rm /usr/share/locale/en/LC_MESSAGES/wicd.mo
rm /usr/share/locale/en_GB/LC_MESSAGES/wicd.mo
rm /usr/share/locale/es/LC_MESSAGES/wicd.mo
rm /usr/share/locale/et/LC_MESSAGES/wicd.mo
rm /usr/share/locale/fr/LC_MESSAGES/wicd.mo
rm /usr/share/locale/fr_CA/LC_MESSAGES/wicd.mo
rm /usr/share/locale/gl/LC_MESSAGES/wicd.mo
rm /usr/share/locale/he/LC_MESSAGES/wicd.mo
rm /usr/share/locale/hr/LC_MESSAGES/wicd.mo
rm /usr/share/locale/hu/LC_MESSAGES/wicd.mo
rm /usr/share/locale/it/LC_MESSAGES/wicd.mo
rm /usr/share/locale/ja/LC_MESSAGES/wicd.mo
rm /usr/share/locale/nl/LC_MESSAGES/wicd.mo
rm /usr/share/locale/pl/LC_MESSAGES/wicd.mo
rm /usr/share/locale/pt/LC_MESSAGES/wicd.mo
rm /usr/share/locale/pt_BR/LC_MESSAGES/wicd.mo
rm /usr/share/locale/ru/LC_MESSAGES/wicd.mo
rm /usr/share/locale/si/LC_MESSAGES/wicd.mo
rm /usr/share/locale/sk/LC_MESSAGES/wicd.mo
rm /usr/share/locale/sv/LC_MESSAGES/wicd.mo
rm /usr/share/locale/tr/LC_MESSAGES/wicd.mo
rm /usr/share/locale/uk/LC_MESSAGES/wicd.mo
rm /usr/share/locale/zh_CN/LC_MESSAGES/wicd.mo
rm /usr/share/locale/zh_TW/LC_MESSAGES/wicd.mo
exit

Листинг 6.sh

#!/bin/bash
rm /usr/share/man/man1/wicd-client.1.gz
rm /usr/share/man/man1/wicd-gtk.1.gz
rm /usr/share/man/man5/wicd-manager-setting.conf.5.gz
rm /usr/share/man/man5/wicd-wired-setting.conf.5.gz
rm /usr/share/man/man5/wicd-wireless-setting.conf.5.gz
rm /usr/share/man/man8/wicd.8.gz
rm /usr/share/man/nl/man1/wicd-client.1.gz
rm /usr/share/man/nl/man1/wicd-gtk.1.gz
rm /usr/share/man/nl/man5/wicd-manager-settings.conf.5.gz
rm /usr/share/man/nl/man5/wicd-wired-settings.conf.5.gz
rm /usr/share/man/nl/man5/wicd-wireless-settings.conf.5.gz
rm /usr/share/man/nl/man8/wicd.8.gz
rm /usr/share/pixmaps/wicd-gtk-xpm
rm /usr/share/python/runtime.d/wicd-daemon.rtupdate
rm /usr/share/python/runtime.d/wicd-gtk.rtupdate
exit

Листинг 7.sh

#!/bin/bash
find  /var/lib/dpkg/info/ -name 'python-wicd.*' -delete
find  /var/lib/dpkg/info/ -name 'wicd-*' -delete
exit

Листинг 8.sh

#!/bin/bash
systemctl enable NetworkManager.service
shutdown -r now

После выполнения wicd-purge.sh и последующим за этим рестартом системы снова активизируется Network Manager и дальнейшая работа осуществляется так как это было до установки wicd.

Если запросить в файловой системе поиск объектов wicd, то результат должен быть примерно таким: