воскресенье, 31 марта 2019 г.

Linux. Обмен файлами по модели "компьютер – компьютер" как альтернатива E-mail


Данная публикация может рассматриваться как расширение (обновление, дополнение, уточнение) ранее опубликованного материала о периодическом запуске Dropbox в указанный период времени и отслеживании появления новых файлов (папок) в папке общего доступа (обмена) Dropbox – https://onformix.blogspot.com/2019/02/dropbox-auto.html.

Краткий план публикации:

1. Что понимается под моделью обмена "компьютер – компьютер".
2. Почему обмен файлами, а не E-mail.
3. Практическая реализация с использованием скриптов на bash.
Создание файла, переименование файла при его создании. Автоматическая отправка файла (файлов) и их получение без участия пользователя. Вывод уведомлений на экран при получении файлов или открытие менеджера файлов в определённой папке.

В дальнейшем будет использоваться термин "папки". В графических окружениях Cinnamon и MATE используется именно этот термин, тогда как в xfce используется "каталоги". Разное употребление, вероятно, связано с пониманием авторов русских локализаций термина Folder.

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

Для ответа на вопрос "почему ..." придётся немного растечься "мыслею по древу".

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

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

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

Можно, конечно, перейти на обмен через Viber или Telegram, но опять же две стороны, принимающие участие в обмене должны иметь однотипные мессенджеры. И это преодолимо. Но когда твои другие контакты начинают видеть, что ты, наконец-то, появился в сети, то склонны забрасывать совершенно не информативными сообщения типа "Чего молчишь?" или "Ты где?". В результате часто происходило, что после включения приложения мессенджера с вдумчивой деятельностью за компьютером приходилось прощаться. Так как существуют респонденты, которые при отсутствии немедленного ответа на их сообщения в мессенджере начинают обижаться.

Поэтому два своих самых активных респондента были мной переведены на модель обмена сообщениями со мной в виде файлов. Дополнительным преимуществом такого способа является то, что с компьютера можно отправить не только небольшие текстовые или графические файлы, но и мультимедиа не слишком больших объёмов. Их размер может составить 50-150 Мб, но конкретное значение зависит от скорости среды передачи данных и продолжительности работы клиента синхронизации, если он запускается на непродолжительное время, по истечении которого автоматически прекращает свою работу (закрытие приложения).

Для реализации такого механизма обмена необходимо, чтобы у получающего и передающего была учётная запись на каком-либо ресурсе из перечисленных: Dropbox, Mega, pCloud, Диск Яндекс, Диск Google, где и создаётся общая папка обмена, которая в дальнейшем синхронизируется с компьютерами участников обмена.

Примечание 1. Так как Google не предоставляет клиента синхронизации для Linux, то пользователям Ubuntu и производных можно воспользоваться сторонним решением – клиентом ODrive.

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

При моей переписке обмен сообщениями производится через написание файлов odt, редактируемых в Libre Office (хочется надеяться, что встроенная проверка правописания заставит обращать внимание пользователей на то, что после точки и запятой необходим пробел, а предложение следует начинать с заглавной буквы).

Как это происходит:

1. В папку предобмена копируется заранее созданный шаблон сообщения Message.odt
2. Скопированный файл переименовывается в день_года.часы-минуты.Message.odt
3. Переименованный файл открывается на редактирование сопоставленным приложением Libre Office Writer или Free Office.

Как пример именования файла привожу 081.17-24.Message.odt, из наименования которого понятно, что файл создан в 81-й день от начала года в 17 часов 24 минуты. Подобный формат гарантирует уникальность имени файла, для перезаписи которого необходимо вернуться во времени назад в 81-й день от начала года к 17 часам 24 минутам. А так как машину времени ещё не изобрели, то и второго файла с таким же именем быть не может.

Далее подразумевается, что папка Exchange является папкой обмена сообщениями и другими файлами со всеми пользователями. А уже в ней идёт разделение по пользователям:

– Outbox-1 – для отправки 1-му респонденту;
– Outbox-2 – для отправки 1-му респонденту;
– Inbox-1 – для получения от 1-го респондента;
– Inbox-2 – для получения от 2-го респондента.


Создание файла

Реализация описанных выше трёх действий осуществляется скриптом на bash.

Пример для Libre Office:

#!/bin/bash
sm=$HOME/scripts/Message.odt
dm=$HOME/Exchange/Outbox-1
date=`date '+%j.%H-%M'`
cp $sm $dm
mv $dm/Message.odt $dm/$date.Message.odt
xdg-open $dm/$date.Message.odt
exit

Пример для Softmaker Free Office:

#!/bin/bash
sm=$HOME/Шаблоны/Message.docx
dm=$HOME/Exchange/Outbox-1
date=`date '+%j.%H-%M'`
cp $sm $dm
mv $dm/Message.docx $dm/$date.Message.docx
/usr/bin/textmaker18free $dm/$date.Message.docx
exit

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

Пример для Libre Office:

#!/bin/bash
sm=$HOME/scripts/Message.odt
dm=$HOME/Exchange/Outbox-1
temp=$HOME/scripts
cp $sm $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".odt
find $dm -mmin -1 > $temp/created.txt
perl -ni -e 'print unless $. == 1' $temp/created.txt
read var < $temp/created.txt
xdg-open "$var"
exit

Пример для Softmaker Free Office:

#!/bin/bash
sm=$HOME/Шаблоны/Message.docx
dm=$HOME/Exchange/Outbox-1
temp=$HOME/scripts
cp $sm $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".docx
find $dm -mmin -1 > $temp/created.txt
perl -ni -e 'print unless $. == 1' $temp/created.txt
read var < $temp/created.txt
/usr/bin/textmaker18free "$var"
exit

Примечание 2. На одном из компьютеров используется не Libre Office, а Softmaker (Free Office), что обусловлено более низкими требованиями Free Office к аппаратной части компьютера. К примеру, при сравнении объёма израсходованной оперативной памяти после запуска текстовый редактор Softmaker "съел" 66 Мегабайт, а Writer пакета Libre Offrice – 234 Мб.

Запуск скрипта bash у меня оформлен в виде значка запуска (используется графическое окружение xfce). В Cinnamon и MATE тоже можно сделать кнопки запуска, но вследствие неиспользования у себя данных оболочек решение вам придётся найти самостоятельно. Когда-то мной использовался Cinnamon и для того времени создать в нём кнопку запуска можно было так – https://onformix.blogspot.com/2016/01/kn-zap-cinnamon.html


Отправка файла (файлов)

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

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

Папка Share-1 является папкой обмена с 1-м пользователем, в которой Inbox – условно "Входящие" от меня. Имена папок могут быть любыми, так как для Mega и pCloud имя папки компьютера значения не имеет, так как они сопоставляются в оболочке управления клиентом, а для Dropbox и Диска Яндекс сопоставление производится через механизм символических ссылок.

#!/bin/bash
D1=$HOME/Exchange/Outbox-1
D2=$HOME/Share-1/Inbox
filecount=`find $D1 -type f | wc -l`
if [ $filecount -eq 0 ];
then
:
else
cp -r $D1/* $D2
find $D1/* -delete
# Если все файлы odt вами в дальнейшем экспортируются в pdf, то имеет смысл исходные файлы odt удалять. Для этого уберите символ # в строках ниже.
#sleep 5
#find $D2 -name "*.odt" -delete
fi
exit

Запуск скрипта производится по расписанию через пользовательское задание cron.

Ниже приводится пример назначения выполнения задания с 19 до 22 часов ежедневно через каждые 30 минут:

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

Примечание 3. Применение export DISPLAY=:0 обусловлено тем, что задания отправки/получения осуществляются у меня в ходе запуска остановки Dropbox, в скрипт запуска/остановки которого они включены как команды sh. А отображение значков статуса Dropbox как раз и обеспечивается инструкцией export DISPLAY=:0

Примечание 4. В команды правого контекcтного меню Thunar можно добавить пункт, например, "Отправить по обмену". При этом выделенные папки или файл(ы) будут отправляться в папку предобмена. Пример как это сделать в xfce читать здесь. В качестве команды указать cp -r %F путь_к_папке_предобмена  В качестве условий появления можно отметить все возможные варианты.
Как сделать для Cinnamon и MATE также не скажу по причине неиспользования у себя данных оболочек. Но решения можно поискать в Интернет.

Предотвращение отправки "пустых" файлов

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

В таком случае перед процедурой отправки файла (файлов) можно включить проверку на запущенность текстового редактора. Результат проверки записывается в файл, например, busy.txt (при записи очередного результата проверки данный файл будет перезаписан новым значением). Если значение файла равно 0, то текстового редактора не запущено и файл(ы) можно отправлять. Если текстовый редактор запущен, то результат проверки не будет равен нулю (при тестах результат был равен 2) и отправку производить не надо.

Пример для Libre Office:

#!/bin/bash
check=путь_к_расположению_файла_с результатом_проверки
ps ax | grep -v grep | grep writer | wc -l > $check/busy.txt
value=`cat $check/busy.txt`
if [ $value -eq 0 ];
then
путь_к_скрипту_отправки
else
:
fi
exit

Пример для Softmaker (Free Office):

#!/bin/bash
check=путь_к_расположению_файла_с результатом_проверки
task=textmaker
ps ax | grep -v grep | grep $task | wc -l > $check/busy.txt
value=`cat $check/busy.txt`
if [ $value -eq 0 ];
then
путь_к_скрипту_отправки
else
:
fi
exit

Примечание 5. У пользователей, использующих запуск Dropbox только на определённое время, то есть запуск – работа – выключение (подробности) имеется два варианта его запуска: первоначальный и периодический. Первоначальный запуск производится на длительное время при включении компьютера через некоторое время (через 30-60 секунд), а периодический через пользовательское задание cron. В этом случае может возникнуть, если так можно выразиться, коллизия, связанная с тем, что пользователь включился примерно как раз в то время, когда настало время запуска Dropbox через задание cron. Чтобы такого не происходило, необходимо перед запуском Dropbox осуществлять проверку на его "запущенность", то есть проверять наличие в системе существования процесса Dropbox. Скрипт запуска Dropbox после старта системы условно назовём dropbox-1.sh, а запуск по расписанию cron как dropbox-2.sh

Пример для варианта включения на 20 минут после старта системы. В тексте скрипта предусматривается, что продолжительность работы Dropbox при его запуске через dropbox-2.sh составляет 5 минут (300 секунд).

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

Аналогичным способом производится проверка и при запуске dropbox-2.sh

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


Получение файла (файлов)

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

Примечание 6. Для вывода текстового сообщения на экран, вероятно, может потребоваться запуск скрипта с инструкцией:

export DISPLAY=:0 && путь_к_скрипту.sh

Так это или нет попробуйте выяснить экспериментально. Лично у меня запускается с инструкцией, так как скрипт выполняется в процессе запуска Dropbox с необходимостью отображения индикатора в системной лотке (трее, на подставке рабочего стола).

Если какое-то действие не надо, то поставьте в начале описывающего данное действие строки символ # или исключите её из скрипта.

#!/bin/bash
D1=$HOME/Share-1/Outbox
D2=$HOME/Exchange/Inbox-1
user-1=`find $D1 -type f | wc -l`
if [ $user-1 -eq 0 ];
then
:
else
cp -r $D1/* /$D2
find $D1/* -delete
fi
note=`find $D2 -type f | wc -l`
if [ $note -eq 0 ];
then
  sleep 5
else
  zenity --width=100 --info --text "\nФайл(ы) от User-1"
xdg-open $D2
fi
exit

Запуск также осуществляется по расписанию на периодической основе.

Если выполнение скриптов отправки/получения осуществляется при запуске/остановке клиентов синхронизации Dropbox или Диска Яндекс, то эти команды можно включать так:

#!/bin/bash
путь_к_скрипту_отправки.sh
dropbox start -i
sleep 290
путь_к_скрипту_получения.sh
sleep 10
dropbox stop
exit

#!/bin/bash
путь_к_скрипту_отправки.sh
yandex-disk start
sleep 290
путь_к_скрипту_получения.sh
sleep 10
yandex-disk stop
exit

Задержка перед остановками клиентов в 10 секунд даст возможность клиентам синхронизации передать изменения в облако (удаление отправленных пользователем сообщений), тем самым подтвердив факт получения сообщения от пользователя.

Для Mega и pCloud запуск скриптов отправки необходимо осуществлять до запуска этих клиентов, например,

путь_к_скрипту_отправки.sh
megasync

путь_к_скрипту_отправки.sh
/home/user/pcloud

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

путь_к_скрипту_получения.sh
sleep 10
скрипт_остановки_megasync

путь_к_скрипту_получения.sh
sleep 10
скрипт_остановки_pcloud

Скрипты остановки Mega и pCloud имеют особенности реализации. Смотреть примеры скрипта остановки Mega и скрипта остановки pCloud.


После всего этого можно надуть щёки от осознания собственной значимости или мании собственного величия, потому что


Комментариев нет:

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