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

Исключение запуска задания, которое осуществляется при входе пользователя в систему после её старта, в субботу и воскресенье


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


Пояснение алгоритма

Получение информации осуществляется в папку Обмен жёсткого диска.

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

#!/bin/bash
obmen=/home/minter/Обмен
scripts=/home/minter/.scripts
sleep 30
if [ -d $obmen ]; then
  :
else
  mkdir /home/minter/Обмен
fi
$scripts/user-1/get-old-messages.sh
$scripts/dropboxme.sh
sleep 20
yandex-disk start
exit


Сначала был "придуман", условно говоря, старый вариант, который будет назван вариантом 1. Впоследствии возникло другое решение, который будет назван вариантом 2. Далее приводятся оба варианта.

Проверка условия дня недели

В случае субботы и воскресенья необходимо предотвратить запуск описанного выше скрипта.

После некоторого периода размышлений было принято решение оттолкнуться от результат запроса дня недели date +%u  Результатом такого запроса будут 1, 2, 3, 4, 5, 6, 7, где 1 соответствует первому дню недели, то есть понедельнику.

В результате скрипту получения материала назначено имя start3.sh, который будет запущен только после того как два предыдущих с именами start1.sh и start2.sh будут отработаны.

Скрипт start1.sh смотрит на соответствие дня недели субботе. Если получен результат "не суббота", то передаётся команда на запуск start2.sh.

Скрипт start2.sh выполняет аналогичное действие – проверяет на соответствие дня недели воскресенью. Если получен результат "не воскресенье", то передаётся команда на запуск start3.sh.

Если получен результат "суббота" или "воскресенье"), то пользователю выводится на экран сообщение, которое будет отображаться до тех пор, пока не будет нажата кнопка OK:




Что получилось в итоге

Листинги start1.sh и start2.sh приводятся ниже. Символы \n в строке zenity означают переход на новую строку.

Вариант 1

#!/bin/bash
day=`date +%u`
scripts=/home/minter/.scripts
if [ $day -eq 6 ];
then
zenity --width=300 --height=50 --info --text "Сегодня суббота.\n\nПолучение материала не осуществляется.\n\nПолучение можно осуществить вручную,\nнажав на кнопку верхней панели\n 'Получить информацию'\n\nНе нажимайте, если Интернет отсутствует." 2>/dev/null
:
else
$scripts/start2.sh
fi
exit

#!/bin/bash
day=`date +%u`
scripts=/home/minter/.scripts
if [ $day -eq 7 ];
then
zenity --width=300 --height=50 --info --text "Сегодня воскресенье.\n\nПолучение материала не осуществляется.\n\nПолучение можно осуществить вручную,\nнажав на кнопку верхней панели\n 'Получить информацию'\n\nНе нажимайте, если Интернет отсутствует." 2>/dev/null
:
else
$scripts/start3.sh
fi
exit

Под start3.sh можно понимать или самый первый скрипт, приводимый в начале публикации, или специально написанный для такого случая аналогичный скрипт на bash с "урезанным" функционалом.

В будние дни до завершения работы start3.sh продолжают работать start1.sh и start2.sh  Это связано с тем, что start1.sh и start2.sh не могут завершить свою работу по команде exit до тех пор, пока все перечисленные в них команды не будут отработаны. start1.sh и start2.sh занимают примерно 3,1 Мб оперативной памяти каждый. Если это сильно "напрягает", то можно воспользоваться вариантом 2.

Вариант 2

Используется проверка сравнения полученного дня недели установленному значению. Если номер дня недели 5 и меньше, то есть будние дни, то запускается скрипт скрипт получения материала start3.sh (см. выше). Если номер для недели 6 или 7 (суббота или воскресенье), то запускается script2.sh, который уведомляет о том, что данный день недели суббота или воскресенье.

#!/bin/bash
scripts=/home/minter/.scripts
a=`date +%u`
b=5
if [ $a -le $b ]
then
#zenity --width=150 --height=50 --info --text "\nСегодня – будний день." 2>/dev/null
$scripts/start3.sh
else
$scripts/start2.sh
fi
exit

#!/bin/bash
day=`date +%u`
if [ $day -eq 6 ];
then
zenity --width=300 --height=50 --info --text "Сегодня – суббота.\nПолучение материала не осуществляется.\n\nПолучение можно осуществить вручную,\nнажав на кнопку верхней панели\n 'Получить информацию'\n\nНе нажимайте, если Интернет отсутствует." 2>/dev/null
else
:
fi
if [ $day -eq 7 ];
then
zenity --width=300 --height=50 --info --text "Сегодня – воскресенье.\nПолучение материала не осуществляется.\n\nПолучение можно осуществить вручную,\nнажав на кнопку верхней панели\n 'Получить информацию'\n\nНе нажимайте, если Интернет отсутствует." 2>/dev/null
else
:
fi
exit

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.


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


вторник, 12 марта 2019 г.

Включение wifi на Lenovo ideapad 330-17AST

После установки по просьбе товарища на ноутбук Lenovo ideapad 330-17AST Linux Mint 19.1 xfce было обнаружено, что встроенный wifi не работает.

После запуска sysinfo получена информация, что в состав оборудования данного устройства входит устройство RTL8821CE:


Способ "заставить" работать RTL 8821CE был найден на github.

Выполните действия:

sudo apt install -y build-essential dkms
sudo apt install -y git
git clone https://github.com/tomaspinho/rtl8821ce.git
cd rtl8821ce/
sudo ./dkms-install.sh
sudo make all
sudo make install
sudo modprobe -a 8821ce

Вместо установки git и получения через него rtl8821ce.git можно скачать этот архив.

Запустите  sudo xed /etc/default/grub , найдите строку GRUB_CMDLINE_LINUX_DEFAULT= и внесите в неё запись  pci=noaer

Обновите grub командой  sudo update-grub

При очередном обновлении ядра работоспособность wifi должна сохраниться.

Для других дистрибутивов Linux воспользуйтесь сведениями, изложенными на этом ресурсе: https://github.com/tomaspinho/rtl8821ce


Календари в терминале Linux Mint 19.1 xfce

После состоявшегося перехода на Linux Mint 19 xfce используемые мной ранее календари на 3 и 12 месяцев, описанные в предыдущей публикации, перестали работать.

Речь идёт об отображении в терминале календарей на 3 и 12 месяцев, запускаемых через значки запуска, при вызове которых выполняются скрипты на bash. Попытка разобраться выявила, что в Linux Mint 19 xfce скрипты необходимо переписать.


Календарь на 3 месяца

#!/bin/bash
xfce4-terminal --geometry=60x15 -x sh -c 'ncal -3; exec bash'



Календарь на 12 месяцев

#!/bin/bash
xfce4-terminal --geometry=80x32 -x sh -c 'ncal -y; exec bash'



Параметр geometry=YYxZZ определяет ширину (YY) и высоту (ZZ) окна терминала. Если Вас не устраивают значения в приводимых примерах, Вы можете указать свои.