суббота, 4 мая 2019 г.

Обновление прошивки MikroTik 931-2nD при отсутствии свободного места и невозможности использовать Netinstall

Данная публикация является продолжением материала "Про попытки обновления прошивки MikroTik RB931-2nD".

Итак, версия прошивки MikroTik 931-2nD – 6.44


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

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



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

После некоторых размышлений было принято решение сделать понижение версии прошивки (так называемый Downgrade) с последующим обновлением до необходимой.

Архив версий прошивок расположен по адресу https://mikrotik.com/download/archive

Из этого архива необходимо найти версию прошивки, которая бы "уместилась" в доступное для записи дисковое пространства внутреннего накопителя MikroTik 931-2nD, объём которого составляет всего лишь 16 Мегабайт.

Такой версией прошивки оказалась 6.40.8  Так как при экспериментах по поиску версий было обнаружено, что выбранная для загрузки ещё более ранняя версия routeros-smips-6.40.7.npk


было решено сохранить routeros-smips-6.40.8.npk на свой ресурс. Не исключено, что со временем при вызове routeros-smips-6.40.8.npk в будущем отобразится точно такое же 404 Not Found.  Скачать routeros-smips-6.40.8.npk

Теперь нужно загрузить routeros-smips-6.40.8.npk на MikroTik, после чего вызвать процедуру Downgrade. Загрузить файл можно через Winbox, который в Linux работает через Wine. Для загрузки нажать на кнопку Upload и выбрать нужный файл.


Далее перейти в System – Packages и нажать на кнопку "Downgrade".


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


 Важно.  На всякий случай рекомендуется сделать резервную копию своих настроек, для чего нажать на кнопку New Тerminal


и в появившемся окне вписать export file=

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


MikroTik 931-2nD будет загружен с версией прошивки 6.40.8

Но через wifi он может быть недоступен.  Если это так, то нужно соединиться с маршрутизатором через патчкорд и загрузить его с дефолтной конфигурацией (в интерфейсе Winbox выбрать System – Reset Configuration).


Если всё хорошо, то wifi появится:


Если такой наблюдается такой вариант:


то повторите сброс в настройки по умолчанию (Reset Configuration).

Если всё плохо, то выключите MikroTik, зажмите две клавиши внизу устройства (снимок не очень хороший, но готовых фото мной в сети найдено не было),


подайте на него питание. Через секунд 10 обе клавиши можно отпустить. Устройство будет загружено с настройками, при которых все интерфейсы будут находиться в одном bridge, а адрес MikroTik получит от "вышестоящего" сервера dhcp. После этого снова соединитесь с MikroTik, предварительно выяснив какой он адрес получил, и повторите Reset Configuration.

При функционировании MikroTik 931-2nD с версией прошивки 6.40.8 уже будет достаточно места (Free HDD Space) для загрузки файла с новой прошивкой.


На рисунке видно, что доступного для записи места 7,6 Мб.

Загрузите файл с новой прошивкой на MikroTik и перезагрузите устройство. После перезагрузки маршрутизатор будет функционировать с новой прошивкой, например:


При этом в моём случае Free HDD Space составил 7,2 Мб, что позволяет в дальнейшем снова понизить его до 6.40.8, а затем обновить прошивку до более новой версии.


Вызовите System – Routerboard и проверьте поля Current Firmware и Upgrade Firmware. В идеале их значения должны быть одинаковыми (рисунок приводится для 951-2n, но для 931-2nD будет точно так же).


Если значение Current Firmware меньше, то нажмите Upgrade и перезагрузите устройство. После перезагрузки эти значения будут равными.

Если настройки MikroTik с обновлённой прошивкой не отвечают состоянию настроек для Вашей сети, то через New Terminal импортируйте файл с сохранёнными настройками командой import file=  После знака  = укажите имя файла с настройками, который предварительно необходимо загрузить в Files.

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

В сети имеется немало восторженных отзывов о работе MikroTik 931-2nD. Но, по моему мнению, стабильная работа возможна лишь с небольшим количеством подключённых к нему потребителей и, скорее всего, небольшим числом правил Firewall. При достижении Free Memory (см. рис. выше) значений, приближающихся к 0, маршрутизатор, скорее всего, перейдёт в состояние "завис" и возврат его в нормальное функционирование будет возможен только через его жёсткую перезагрузку (отключение питания).

Но в интересах обеспечения связи с Интернет 1-4 узлов без других изысков в виде VPN, приоритетов трафика и т.п. MikroTik 931-2nD вполне может бесперебойно функционировать. Хотя это предположение не претендует на истину в последней инстанции. Детальные тесты на способность MikroTik 931-2nD выполнять широкий спектр задач автором данной публикации не проводились.

Для использования всех возможностей RouterOS лучше всего воспользоваться устройством MikroTik, которое имеет больше как оперативной памяти (64 Мб и выше), так и объём внутреннего накопителя (32 Мб и выше).

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

Вывод из файла определённых строк средствами bash


Необходимость вывода определённых строк из файла возникла при дальнейшем анализе автоматически созданных отчётов о состоянии Диска Яндекс. Особенно это актуально при использовании нескольких аккаунтов Диска Яндекс с целью определения: вместится ли туда дополнительный объём информации или надо ждать освобождения доступного дискового пространства в результате автоматической очистки его Корзины (или очищать Корзину вручную). После выполнения команды yandex-disk status и записи результатов в файл yandex-disk.txt, например

yandex-disk status > /home/user/reposrts/yandex-disk.txt

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

Статус ядра синхронизации: ожидание команды
Путь к папке Яндекс.Диска: '/home/user/Yandex.Disk/account1'
Всего: 43 GB
Занято: 38.44 GB
Свободно: 4.56 GB
Максимальный размер файла: 50 GB
Размер корзины: 6,38 GB

Последние синхронизированные пути:

...

Из полученного файла предмет интереса составляют строки "Занято", "Свободно", "Размер корзины". Другими словами, интерес представляют только строки 4, 5 и 7.

С этой целью создан скрипт на bash, в котором

reports – указание каталога отчётов,

values – указание каталога для записи промежуточных значений,

sed -n -e 4,5p -e 7p  – команда вывода 4, 5 и 7 строк из файла отчёта accoun1.txt

#!/bin/bash
reports=/home/user/reports
values=/home/user/reports/values
yandex-disk status > $values/accoun1.txt
sed -n -e 4,5p -e 7p $values/account1.txt > $reports/account1.txt
exit

В результате его выполнения получается желаемый результат:

Занято: 38.44 GB
Свободно: 4.56 GB
Размер корзины: 6,38 GB

При "разборе полётов" был использован материал ресурса rus-linux.net.

среда, 17 апреля 2019 г.

Предупреждение о заполненности диска через bash

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

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

Стимулами к автоматизации уведомления о сильной заполненности диска явились сравнительно малая ёмкость винчестера и оказание содействия другу, совершенно недавно переметнувшемуся из союза пользователей Windows в сообщество Linux, имеющему точно такой же винчестер как и у меня объёмом в 500 Гигабайт (при форматировании в основной раздел с файловой системой его объём превращается в 465 Гигабайт).


Так как считается, что заполнять диск данными более чем 90 % не является желательным, а для операций по исправлению ошибок на файловой системе (особенно в ходе которых будут осуществляться попытки перезаписи данных из плохих кластеров в хорошие) может потребоваться не менее 5 % доступного для записи места на диске, то было принято решение автоматически уведомлять о наличии свободного места (доступного пользователю), начиная от его значений в 10 % и ниже. Несмотря также на то, что по сравнению с ntfs файловая система ext4 в значительно меньшей степени подвержена фрагментации, её чрезмерное заполнение может дурно повлиять на производительность. Если кому интересно про дефрагментацию в Linux, то читать здесь.

В публикации рассматривается диск, на котором имеется 1 раздел с установленной системой Linux. Отдельного раздела под /home не создавалось, домашний каталог расположен в корне файловой системы, поэтому в дальнейшем имеется в виду, что диск соответствует /dev/sda1

Автоматизация уведомления достигается запуском скрипта при старте системы или через назначение пользовательского задания cron.

Формируемые в процессе работы скрипта данные записываются в выделенный для этой цели каталог  /home/user/scripts/temp , который в скрипте будет выступать как переменная dest. Создаваемые файлы имеют имена df*.txt, где под символом * понимаются значения от 1 до 6. Под user понимается домашний каталог пользователя, под логином которого осуществлён вход в систему.

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

#!/bin/bash
dest=/home/user/scripts/temp

Получить сведения о дисковом пространстве:

df -h /dev/sda1 > $dest/df1.txt

Файл df1.txt будет иметь примерно такой вывод:


Внимательный пользователь может задаться вопросом о разнице между снимком экрана в GParted (в начале заметки) и только что приведенным. Дело в том, что используются разные алгоритмы подсчёта, при которых какие-то данные учитываются, а какие-то – нет. Кроме того, ряд данных может оказаться недоступным для чтения. 
Определённую информацию о существующих в этом вопросе разночтениях можно получить здесь и здесь. Лично мне понравится комментарий: "Другое дело нужно не забывать о разнице между K/M/G и KiB/MiB/GiB. Собственно за *iB хочется вырвать все конечности маркетологам производителей HDD, которые внедрили K=1000 в информационных системах когда изначально K было 1024 для IT и 1000 для физиков.".
Кроме того, вывод df1.txt отображает более объективную информацию, так как показывает дисковое пространство, которое доступно (см. Дост 44G). "Доступно" – это именно тот объём диска, на который пользователь может осуществить запись данных под своими полномочиями в системе. Часть свободного дискового пространства диска пользователю не доступна для записи.

Из файла df1.txt необходимо получить вывод 5-го столбца и записать его в файл df2.txt

cat $dest/df1.txt | awk '{print($5)}' > $dest/df2.txt


Из полученного результата для дальнейшего использования нужны только цифры, поэтому из df2.txt последовательно удаляются слово Использовано% и символ % . Результаты операций записываются в файлы df3.txt и df4.txt

str=Использовано%
while read LINE; do
echo "${LINE##*$str}"
done < $dest/df2.txt | tee $dest/df3.txt


rev $dest/df3.txt | cut -c 2- | rev > $dest/df4.txt


Так как далее скрипт будет "читать" вывод из файла, то в df4.txt необходимо избавиться от первой строки, которая является пустой. Результат записывается в файл df5.txt

sed -n 2p $dest/df4.txt > $dest/df5.txt


Предупреждение о заполненности диска использует условие "если значение равно x, то y (выводится предупреждение), а если не равно х, то z (ничего не делать).

Выполнение условия реализуется инструкцией:

if [ "значение" -eq x ];
then
вывод предупреждения
else
:
fi

Но параметр -eq не применяется с двузначными числами, поэтому из df5.txt необходимо удалить первый символ и записать результат в df6.txt

rev $dest/df5.txt | cut -c 1 | rev > $dest/df6.txt


Полученный результат уже можно использовать в операциях соответствия заданным условиям.

Предусматривается, что при значениях df6.txt от 0 до 9 будут выводиться предупреждения:

0 – осталось свободно 10 % диска
1 – осталось свободно 9 % диска
2 – осталось свободно 8 % диска
3 – осталось свободно 7 % диска
4 – осталось свободно 6 % диска
5 – осталось свободно 5 % диска
6 – осталось свободно 4 % диска
7 – осталось свободно 3 % диска
8 – осталось свободно 2 % диска
9 – осталось свободно 1 % диска

которые будут отображаться на экране до тех пор, пока пользователь не нажмёт кнопку OK. Содержанию файла df6.txt присваивается переменная value.

value=`cat $dest/df6.txt`
if [ $value -eq 0...9 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 10...1 % диска." 2>/dev/null
else
:
fi

Теоретически, при каждом запуске скрипта в имеющиеся в файлах df*.txt значения будут записываться новыми. Но эти промежуточные данные можно и удалять. Например, удалить перечисленное:

rm $dest/df1.txt $dest/df2.txt $dest/df3.txt $dest/df4.txt $dest/df5.txt $dest/df6.txt

или найти и удалить объекты, совпадающие по шаблону имени – 

find $dest -name df*.txt -delete

Всё было бы неплохо, если бы полученные в df5.txt значения были от 90 и выше. Но они могут быть и 20, и 30, и 70 ... В таком случае если занято 72% диска, то будет выдано предупреждение о наличии только 8% доступного (свободного) места на диске, что далеко не соответствует действительности. Поэтому после получения значения df5.txt производится дополнительное сравнение: если 89 и менее, то всё хорошо и ничего делать не надо, в противном случае необходимо выдавать предупреждения.

Проверка реализуется следующим образом. Читается значение a, которое и является результатом вывода df5.txt  Значению b устанавливается пороговая величина 89. Затем производится сравнение двузначных чисел a и b.

a=`cat $dest/df5.txt`
b=89
if [ $a -le $b ]
then
# 89% и меньше, ничего делать не надо, всё в порядке
else
# команды вывода предупреждения
fi

Команды вывода предупреждений оформляются в отдельный скрипт alarm.sh, который будет запущен в случае else (см. выше).

В конечном итоге получилось 2 скрипта: diskusage.sh и alarm.sh

Листинг diskusage.sh:

#!/bin/bash
dest=/home/user/scripts/temp
df -h /dev/sda1 > $dest/df1.txt
cat $dest/df1.txt | awk '{print($5)}' > $dest/df2.txt
str=Использовано%
while read LINE; do
echo "${LINE##*$str}"
done < $dest/df2.txt | tee $dest/df3.txt
rev $dest/df3.txt | cut -c 2- | rev > $dest/df4.txt
sed -n 2p $dest/df4.txt > $dest/df5.txt
a=`cat $dest/df5.txt`
b=89
if [ $a -le $b ]
then
:
else
/home/user/scripts/alarm.sh
fi
#   Если необходимо удалить все полученные df*.txt
#,  то убрать символ решётки (#) в строке ниже
#find $dest -name df*.txt -delete
exit

Листинг alarm.sh:

#!/bin/bash
level=/home/user/scripts/temp
rev $level/df5.txt | cut -c 1 | rev > $level/df6.txt
value=`cat $dest/df6.txt`
if [ $value -eq 0 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 10 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 1 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 9 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 2 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 8 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 3 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 7 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 4 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 6 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 5 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 5 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 6 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 4 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 7 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 3 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 8 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 2 % диска." 2>/dev/null
else
:
fi
if [ $value -eq 9 ];
then
zenity --width=190 --height=50 --info --text "\nОсталось свободно 1 % диска." 2>/dev/null
else
:
fi
exit

То есть, проверочным запускаемым скриптом является diskusage.sh  Если значение a (полученное из файла df5.txt) составит 90 и более, то запускается скрипт alarm.sh

Для приведенных в примере данных файлов df*.txt результат работы скриптов приводится ниже:


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

Отображение в Linux встроенных в файлы exe и dll иконок

Интересный результат получился после установки пакета exe-thumbnailer, который был  установлен больше "из любопытства", чем необходимости.


Теперь применяемые мной некоторые файлы Windows отображаются не значком приложений wine, а так как и в Windows:

  

    

    

вторник, 9 апреля 2019 г.

Очистка объектов Корзины старше N дней через bash


Данная публикация является продолжением более ранней, опубликованной под наименованием "Об автоматизации очистки Корзины в Linux или "страсти" по очистке Корзины через терминал" (https://onformix.blogspot.com/2018/01/trashclean.html).

На тот момент не хватило знаний для реализации последнего пункта "А если необходимо удалить содержимое Корзины только старше N дней?" через скрипт на bash. Но эта нерешённая задача постоянно стимулировала к поиску вариантов её реализации, несмотря на то, что были найдены такие инструменты как autotrash и trash-cli.

Этот процесс напоминал абзац из произведения Пола Андерсона "Патруль времени":

Дорогой мой, вы же ещё ни с чем не управились! Для вас и для меня, с точки зрения нашего индивидуального биологического времени, эту  работу ещё предстоит сделать. И не думайте, пожалуйста, что успех предрешён,  раз он зафиксирован в истории. Время эластично, а  человек обладает свободой воли. Если вы потерпите неудачу, история изменится. Упоминание о вашем успехе пропадёт из её анналов, а моего рассказа об этом успехе не будет. Именно так это и происходило в тех считанных эпизодах, когда Патруль терпел поражение. Работа по этим делам всё ещё ведется, и если там достигнут наконец успеха, то история изменится и окажется, что  успех  был как бы "всегда". Tempus non nascitur, fit [время не рождается само собой, а делается (лат.)], если можно так выразиться.

Решение этой задачи оказалось частным случаем реализации другой – удаления файлов/папок через N дней через скрипт bash.

Можно даже сказать, что они почти идентичны за исключением того, что файл отчёта с перечнем окончательно удалённых объектов из Корзины приводится в более "читабельный" вид, так как перед именем каждого из удалённых объектов указывается ещё и путь /home/user/.local/share/Trash/files/, что делает его не совсем удобным для восприятия.

В процессе очистки от объектов старше N дней используются понятия о структуре Корзины и методике поиска удаления через связку команд find и -delete, которые описаны здесь и здесь.

В процессе генерации отчёта об удалённых объектах, который имеет в скрипте наименование Trash.txt к имени указанного файла добавляются дата удаления (месяц.день) и наименование компьютера H-3. А старые файлы отчёта старше установленного времени очистки Корзины (N) удаляются через N+2 дней.

В приводимом примере N устанавливается равным 3.

Результатом является следующее:

#!/bin/bash
D1=/home/user/.local/share/Trash/files
D2=/home/user/.local/share/Trash/info
D3=/home/user/Reports
file=`find $D1 -type f | wc -l`
if [ $file -eq 0 ];
then
:
else
date=`date '+%m.%d'`
find $D1 -mtime +3 > $D3/Trash-ini.txt
find $D1 -mtime +3 -delete
find $D2 -mtime +3 -delete
fi
str=/home/user/.local/share/Trash/files/
while read LINE; do
echo "${LINE##*$str}"
done < $D3/Trash-ini.txt | tee $D3/$date.H-3.Trash.txt
rm $D3/Trash-ini.txt
dir=`find $D1 -type d -empty | wc -l`
if [ $dir -eq 0 ];
then
:
else
find $D1 ! -name 'files' -empty -delete
fi
file=`find $D3 -name *.H-3.Trash.txt -mtime +5 | wc -l`
if [ $file -eq 0 ];
then
:
else
find $D3 -name *.H-3.Trash.txt -mtime +5 -delete
fi
file=`find $D3 -name *.H-3.Trash.txt -empty | wc -l`
if [ $file -eq 0 ];
then
:
else
find $D3 -name *.H-3.Trash.txt -empty -delete
fi
exit

воскресенье, 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