Всем большой привет! Вношу свою лепту в продолжение темы "Руководство по допиливанию.. " на примере el guahiro с его полезными ПКМ Thunar скриптами. На данный момент уважаемый el выкладывает свои наработки не сюда на форум, а в телеграмм-канал Xubuntu-ru.net и это понятно - сейчас обратной связи нет с форумчанами. Но я всё-таки решил написать сюда дабы малёха оживить уснувший форум. А речь пойдёт об обработке видеоссылок (youtube, rutube, OK, VK, и т.д.). Во многих случаях гораздо удобнее просматривать видео не в браузере, а во внешнем плейере, а т.к. при этом хочется вдобавок ещё и gui-удобств, то и возникла у меня идея своять скрипт. Как говорится лучше один раз увидеть, чем читать бредни разработчика, коим я не очень то и являюсь 😂. Поэтому смотрим кино:
Спойлер
videolinks (https://zen.yandex.ru/video/watch/62d3e11c9f801562d7975fca)
Итак, по-порядку. Должны быть установлены некоторые утилиты.
Устанавливаем mpv:
sudo apt install mpv
При этом автоматом установится youtube-dl, но он нам не нужен ввиду различных косяков и это совсем другая история.
Вместо него будем использовать yt-dlp.
Установка yt-dlp:
sudo wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp -O /usr/local/bin/yt-dlp
sudo chmod 755 /usr/local/bin/yt-dlp
sudo apt purge -y youtube-dl
sudo mv /usr/local/bin/yt-dlp /usr/local/bin/youtube-dl
Если система 22.04 , то последняя команда (переименование с youtube-dl в yt-dlp ) не нужна.
Установка остальных утилит:
sudo apt install yad xsel wmctrl xdotool
Вместо zenity я применяю yad, т.к. у него больше возможностей. Например, zenity для выбора пунктов меню использует старинные радиобаттоны. Но это было бы ерунда если бы тыкание мышкой в строчку выбора срабатывало. Нет же - нужно обязательно в кругляшок попасть. Неудоообно! В yad такой проблемы нет. Правда в yad я не мог сначала корректно заставить работать пульсирующий прогресс-бар. Но потом победил )).
Теперь, когда необходимые утилиты установлены, нужно положить в /usr/local/bin/ скрипт link_youtube.sh:
#!/bin/bash
# ОБРАБОТКА ВИДЕОССЫЛОК В БРАУЗЕРАХ (youtube и т.д.) (Alt + Y)
#Создание каталога Разное, если его нет.
if ! [ -d "/home/$USER/Видео/Разное" ]; then
mkdir "/home/$USER/Видео/Разное"
fi
#Присвоение переменной url значения из буфера обмена
url=$(xsel --clipboard --output)
#оставляем в названии будующего файла только 70 начальных символов
b=${url:6:76}
#убираем из скопированного буфера обмена символ прямого слэша, запрещённый для имён файлов в линуксе
c=${b////}
#Воспроизведение в mpv или скачивание или создание ссылки
choice=$(yad --list \
--column=" Что сделать?":tip "Воспроизвести в MPV плейере" \
"Создать ссылку в ~/Видео/Разное/" \
"Скачать видео в ~/Видео/Разное/" \
--title "" \
--window-icon=/usr/local/icons/app/yad/internetvideo.png --width=300 --height=200 \
--text " Обработка видеоссылки:" \
)
#Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$choice" == *\| ]]; then
choice=${choice::-1}
fi
if [[ $choice == "Воспроизвести в MPV плейере" ]]; then
#Выбор качества видео
quality=$(yad --list \
--column="":tip "Авто" "360p" "720p" \
--title "" \
--window-icon=/usr/local/icons/app/yad/quality.png --width=300 --height=200 \
--text " Выбор качества видео:" \
)
if [ $? -ne 0 ]; then
exit
fi
#Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$quality" == *\| ]]; then
quality=${quality::-1}
fi
if [ $quality == "360p" ]; then
quality="18"
fi
if [ $quality == "720p" ]; then
quality="22"
fi
#Функция "Индикация с помощью прогресс-бара Yad"
indicate(){
yad --progress \
--title="Запуск видеоссылки в MPV.." \
--auto-close \
--pulsate \
--button=Отмена:35 \
--progress-text="ждём.." \
--window-icon=/usr/local/icons/app/yad/empty.png \
--image=/usr/local/icons/app/yad/internetvideo.png \
--geometry=400x70 &
sleep 1
t=0
#цикл, пока не запустится mpv(процесс $pid1)
while ! wmctrl -l | grep -e '- mpv'
do
sleep 0.5
#если принудительно закрыть окно Yad (кнопка "Отмена"), то
if ! wmctrl -l | grep -e 'Запуск видеоссылки в MPV..' ;then
kill -15 $pid1
break
fi
#если примерно через 40 сек. не запустится mpv, то произойдёт выход из скрипта.
if [ $t -eq 80 ]; then
#Закрытие окна Yad
wmctrl -F -c 'Запуск видеоссылки в MPV..'
yad --skip-taskbar \
--title="" \
--text "\n Неудачно! \n" \
--window-icon=/usr/local/icons/app/yad/empty.png \
--image=/usr/local/icons/app/yad/warning.png \
--geometry=200x20 \
--button=Выход:0
break
fi
(( t++ ))
done
#Закрытие окна Yad
wmctrl -F -c 'Запуск видеоссылки в MPV..'
}
#Запуск mvp
if [ $quality == "Авто" ]; then
mpv --ytdl-format=best "$url" &
pid1=$!
indicate
else
mpv --ytdl-format=$quality "$url" &
pid1=$!
indicate
fi
fi
if [[ $choice == "Создать ссылку в ~/Видео/Разное/" ]]; then
#создаём пустой файл URL.desktop в /home/$USER/Видео/Разное/
touch /home/$USER/Видео/Разное/URL.desktop
#наполняем файл URL.desktop необходимыми строками
echo -e [Desktop Entry] > /home/$USER/Видео/Разное/URL.desktop
echo -e Version=1.0 >> /home/$USER/Видео/Разное/URL.desktop
echo -e Type=Link >> /home/$USER/Видео/Разное/URL.desktop
if [[ $url == *"youtu"* ]]; then
echo -e Icon=%Commander_path%/icons/net/youtube.png >> /home/$USER/Видео/Разное/URL.desktop
else
echo -e Icon=%Commander_path%/icons/url_stream.png >> /home/$USER/Видео/Разное/URL.desktop
fi
echo -e URL="$url" >> /home/$USER/Видео/Разное/URL.desktop
echo -e Comment=Stream:yes >> /home/$USER/Видео/Разное/URL.desktop
#переименовываем файл URL.desktop
mv /home/$USER/Видео/Разное/URL.desktop /home/$USER/Видео/Разное/$c.desktop
#Изменяем права ./$c.desktop
chmod 775 /home/$USER/Видео/Разное/$c.desktop
yad --skip-taskbar \
--window-icon=/usr/local/icons/app/yad/empty.png \
--title="Инфо" \
--button="gtk-ok:0" \
--image=/usr/local/icons/app/yad/ok.png \
--text="Готово! \nСсылка лежит в ~/Видео/Разное/ "
fi
if [[ $choice == "Скачать видео в ~/Видео/Разное/" ]]; then
#Выбор качества видео
quality=$(yad --list \
--column="":tip "Авто" "360p" "720p" \
--title "" \
--window-icon=/usr/local/icons/app/yad/quality.png --width=250 --height 190 \
--text " Выбор качества видео:" \
)
if [ $? -ne 0 ]; then
exit
fi
#Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$quality" == *\| ]]; then
quality=${quality::-1}
fi
#запуск терминала с параметром -e
if [ $quality == "Авто" ]; then
x-terminal-emulator -e sh -c 'echo ""
url=$(xsel --clipboard --output)
yt-dlp -f best -o "~/Видео/Разное/%(title)s-%(id)s.%(ext)s" $url
echo ""
echo ""
echo "Готово! \nСкаченное видео лежит в ~/Видео/Разное/"
echo ""
echo -n "\033[37;1;41m "Нажмите [ENTER] для выхода.." \033[0m" ; read a'
fi
if [ $quality == "360p" ]; then
x-terminal-emulator -e sh -c 'echo ""
url=$(xsel --clipboard --output)
yt-dlp -f 18 -o "~/Видео/Разное/%(title)s-%(id)s.%(ext)s" $url
echo ""
echo ""
echo "Готово! \nСкаченное видео лежит в ~/Видео/Разное/"
echo -n "\033[37;1;41m "Нажмите [ENTER] для выхода.." \033[0m" ; read a'
fi
if [ $quality == "720p" ]; then
x-terminal-emulator -e sh -c 'echo ""
url=$(xsel --clipboard --output)
yt-dlp -f 22 -o "~/Видео/Разное/%(title)s-%(id)s.%(ext)s" $url
echo ""
echo ""
echo "Готово! \nСкаченное видео лежит в ~/Видео/Разное/"
echo -n "\033[37;1;41m "Нажмите [ENTER] для выхода.." \033[0m" ; read a'
fi
fi
В этом скрипте поправьте пути к своим картинкам, если они будут лежать в других местах.
И наконец, делаем значок запуска:
[Desktop Entry]
Name=Запуск видеоссылок в MPV
Comment=Запуск видеоссылок в MPV
Exec=/usr/local/bin/link_youtube.sh
Type=Application
Categories=Network
Icon=/usr/local/icons/internetvideo.png
Terminal=false
Ложим его либо в /usr/share/applications/ либо в ~/.local/share/applications/ для того,чтобы он появился в whisker-меню.
Ну и для удобства назначим горячие клавиши на /usr/local/bin/link_youtube.sh. У меня это Alt+Y (Все настройки - Клавиатура - Комбинации клавиш).
Готово!
Если будут вопросы, то задавайте в телеграмм-группу Xubuntu-ru.net, а то сюда пока нет доступа ((
Было дело, el guahiro среди 100500 своих скриптов показал как извлекать текст из картинок.
Взяв его скрипт за основу представляю свой вариант, главным отличием в котором является использование утилиты scrot. В результате можно извлекать не только весь текст из картинки, а ещё и отдельные фрагменты. Опять, сначала смотрим кино:
Спойлер
https://zen.yandex.ru/video/watch/62dc35f9770bcd19c60d3445
Устанавливаем необходимые утилиты, если их нет:
sudo apt install scrot yad tesseract-ocr tesseract-ocr-rus
В /usr/local/bin/ ложим скрипт ocr.sh:
#!/bin/bash
# ИЗВЛЕЧЕНИЕ ТЕКСТА ИЗ ИЗОБРАЖЕНИЯ
sleep 1
name=$(date '+%d-%m-%Y_%H:%M:%S')
scrot -sf '/tmp/0.png' -e 'xclip -selection clipboard -target image/png -i'
mogrify -resize 400% -modulate 110,110,100 -median 1 -blur 0x0.4 -unsharp 0x12+2+0 -density 300 /tmp/0.png
tesseract /tmp/0.png /tmp/0 -l eng+rus --psm 6 &> /dev/null &
pid1=$!
while true
do
printf "$i\n"
sleep 0.5
if ! [[ $(ps | grep "$pid1") ]]; then
break
fi
done | (yad --skip-taskbar --progress --title="Извлечение текста.." --auto-close --no-cancel --pulsate --button=Отмена:35 --progress-text=" " --window-icon=/usr/local/icons/app/yad/empty.png --geometry=300x90)
if [ $? = 35 ]; then
kill -9 $pid1
fi
mv /tmp/0.txt ~/Документы/ocr/$name.txt
#Удаление последней строки с кракозяброй
sed -i '$ d' ~/Документы/ocr/$name.txt
rm -f /tmp/0.png
yad --skip-taskbar --window-icon=/usr/local/icons/app/yad/empty.png --title="Инфо" --button="gtk-ok:0" --image=/usr/local/icons/app/yad/ok.png --text="Готово! \nИзвлечённый текст лежит в ~/Документы/ocr/ "
В /usr/share/applications/ или в ~/.local/share/applications/ ложим значок запуска:
[Desktop Entry]
Name=OCR
Comment=Распознавание текста на картинках
Exec=/usr/local/bin/ocr.sh
Type=Application
Categories=Graphics
Icon=/usr/local/icons/ocr.png
Terminal=false
Заходим в "Все настройки" - "Клавиатура" - "Комбинации клвиш" и устанавливаем удобный хоткей на /usr/local/bin/ocr.sh. У меня Alt+O.
Готово!
Ох до чего же лень матушка довела!! Неохота залазить в меню настроек, чтобы сменить тему оформления системы )) Как обычно, сначала смотрим кино:
Спойлер
https://zen.yandex.ru/video/watch/62dc47ff77825969564c7a1a?t=6
Устанавливаем необходимые утилиты, если их нет:
sudo apt install yad wmctrl
В /usr/local/bin/ ложим 2 скрипта.
change_theme.sh:
#!/bin/bash
# Закрытие DC если был открыт
if wmctrl -l | grep -q 'Double Commander'; then
killall -s 15 doublecmd
fi
theme=$(yad --list --column=" Выбор темы системы":tip "Flat-Remix-GTK-Grey-Dark (тёмная)" "Greybird-m (светлая)" "Shades-of-gray (тёмная)" "PingGuo-white (светлая)" \
--title "" \
--skip-taskbar --window-icon=/usr/local/icons/app/yad/theme.png --width=350 --height 170 \
)
if [ $? -ne 0 ]; then
exit
fi
if [[ $theme == "Flat-Remix-GTK-Grey-Dark (тёмная)|" ]]; then
#Изменение темы
xfconf-query -c xsettings -p /Net/ThemeName -s Flat-Remix-GTK-Grey-Dark
#Изменение темы заголовков окон
xfconf-query -c xfwm4 -p /general/theme -s Flat-Remix-GTK-Grey-Dark
fi
if [[ $theme == "Greybird-m (светлая)|" ]]; then
#Изменение темы
xfconf-query -c xsettings -p /Net/ThemeName -s Greybird-m
#Изменение темы заголовков окон
xfconf-query -c xfwm4 -p /general/theme -s Greybird-m
fi
if [[ $theme == "Shades-of-gray (тёмная)|" ]]; then
#Изменение темы
xfconf-query -c xsettings -p /Net/ThemeName -s Shades-of-gray
#Изменение темы заголовков окон
xfconf-query -c xfwm4 -p /general/theme -s Shades-of-gray
fi
if [[ $theme == "PingGuo-white (светлая)|" ]]; then
#Изменение темы
xfconf-query -c xsettings -p /Net/ThemeName -s PingGuo-white
#Изменение темы заголовков окон
xfconf-query -c xfwm4 -p /general/theme -s PingGuo-white
fi
change_b-w.sh:
#!/bin/bash
# ИЗМЕНЕНИЕ ТЕМЫ НА ПРОТИВОПОЛОЖНУЮ (ТЁМНАЯ/СВЕТЛАЯ) В ОДИН КЛИК
# Закрытие DC если был открыт
if wmctrl -l | grep -q 'Double Commander'; then
killall -s 15 doublecmd
fi
grep "Flat-Remix-GTK-Grey-Dark" ~/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml && t="black"
grep "Shades-of-gray" ~/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml && t="black"
grep "Greybird-m" ~/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml && t="white"
grep "PingGuo-white" ~/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml && t="white"
if [[ $t == "black" ]]; then
#Изменение темы
xfconf-query -c xsettings -p /Net/ThemeName -s Greybird-m
#Изменение темы заголовков окон
xfconf-query -c xfwm4 -p /general/theme -s Greybird-m
else
#Изменение темы
xfconf-query -c xsettings -p /Net/ThemeName -s Flat-Remix-GTK-Grey-Dark
#Изменение темы заголовков окон
xfconf-query -c xfwm4 -p /general/theme -s Flat-Remix-GTK-Grey-Dark
fi
Само собой в этих скриптах поменяйте названия тем и пути к иконкам на свои.
В /usr/share/applications/ или в ~/.local/share/applications/ ложим значок запуска change_theme.desktop:
[Desktop Entry]
Name=Выбор темы системы
Comment=
Exec=/usr/local/bin/change_b-w.sh
Type=Application
Categories=System;
Icon=/usr/local/icons/themes/theme.png
Terminal=false
Задаем хоткей на /usr/local/change_b-w.sh. У меня SUPER+T. Тут есть нюанс. Нажали SUPER+T - произошло переключение на противоположную тему (например с темной на светлую). И теперь, чтобы обратно переключиться на темную тему нужно выдержать паузу секунды 3-4. Иначе ничего не произойдёт. Эта пауза нужна чтобы успел перезаписаться конфиг ~/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml.
На этом у меня всё! Надеюсь, что эта причуда может пригодиться любителям поиграться с темами.
Во многих ОС, и Xubuntu не исключение, порой не хватает штатного таймера выключения ПК. Через консоль это делается запросто. Например, shutdown -h +40 выключит комп через 40 минут. Ну нет же, нам как говорится gui подавай ))
Делаем такой скрипт shutdown_time.sh:
#!/bin/bash
# ВЫКЛЮЧЕНИЕ КОМПЬЮТЕРА ПО ТАЙМЕРУ (в минутах)
# Создание переменной TIME, в которую будет сохраняться вывод команды yad
TIME=$(yad --skip-taskbar --entry --title="Выключение компьютера" --text="\nЧерез сколько минут выключить компьютер?" --window-icon=/usr/local/icons/app/yad/question.png --geometry=380x50 --button=Отмена:35 --button=OK:0)
# Если нажата кнопка "Отмена", то завершение скрипта
if [ $? = 35 ]; then
exit
fi
# Присваиваем переменной m значение TIME умноженное на 60 (перевод в секунды)
m=$(($TIME*60))
#Отработка установленного значения таймера
sleep $m
yad --skip-taskbar --title="Выключение компьютера" --text="\nЧерез 20 секунд компьютер будет выключен! \n Отменить выключение?.." --window-icon=/usr/local/icons/app/yad/warning.png --geometry=380x50 --button=Да:35 --timeout=20
# Если нажата кнопка "Да", то завершение скрипта
if [ $? = 35 ]; then
exit
fi
# Выключение компьютера
shutdown -h now
Значок запуска shutdown_time.desktop:
[Desktop Entry]
Name=Выключение ПК по таймеру
Comment=
Exec=/usr/local/bin/scripts/shutdown_time.sh
Type=Application
Categories=System
Icon=/usr/local/icons/shutdown_time.png
Terminal=false
(https://i.ibb.co/4KgW1ZW/1.png) (https://ibb.co/4KgW1ZW)
А если после запуска таймера обстоятельства изменились и выключать ПК не нужно? Не проблема.
Скрипт shutdown_time_off.sh:
#!/bin/bash
# ---Отмена выключение компьютера по таймеру---
yad --skip-taskbar --title="Отмена выключение компьютера по таймеру" --text="\nВы действительно хотите отменить выключение компьютера по таймеру?" --window-icon=/usr/local/icons/app/yad/warning.png --geometry=400x50 --button=Да:0 --button=Нет:35 --timeout=20
# Если нажата кнопка "Нет", то завершение скрипта
if [ $? = 35 ]; then
exit
fi
killall -s 15 shutdown_time.sh
killall -s 15 sleep
Значок запуска shutdown_time_off.desktop:
[Desktop Entry]
Name=Отмена выключения ПК по таймеру
Comment=
Exec=/usr/local/bin/scripts/shutdown_time_off.sh
Type=Application
Categories=System
Icon=/usr/local/icons/shutdown_time_off.png
Terminal=false
(https://i.ibb.co/crPDW3x/2.png) (https://ibb.co/crPDW3x)
А если запустили таймер, потом захотели отменить его, но не отменили (ну мало ли - отвлекли вас например), то непосредственно перед выключением компа будет дан 20-ти секундный шанс отменить всё-таки выключение.
(https://i.ibb.co/dQ3g3Wr/3.png) (https://ibb.co/dQ3g3Wr)
Ну и чтобы всё это работало само собой должен быть установлен yad (sudo apt install yad), либо zenity, кто пользуется им.
и как вам с элем хватает терпения разбираться во всем этом... :laugh:
Цитата: butjapka от июля 31, 2022, 13:47:17и как вам с элем хватает терпения разбираться во всем этом... :laugh:
Ну, видимо особая привязанность к xfce :). Пробовал различные дистрибутивы, но неизменно возвращался на xubuntu. А что касается эля, то мне до него далеко с его тоннами скриптов. Я в линухе с 2018, а он значительно раньше. :smile:
Цитата: danwer от июля 24, 2022, 00:35:34можно извлекать не только весь текст из картинки
У меня есть на форуме описание, как извлекать текст с фрагмента картинки https://forum.xubuntu-ru.net/index.php?topic=1117.msg13073;topicseen#msg13073
Цитата: butjapka от июля 31, 2022, 13:47:17и как вам с элем хватает терпения разбираться во всем этом
Так лень же! Когда лень, то хватает духу что-то запилить и потом только на хоткейчики щёлкать.
Сегодня поговорим о телеграм-мессенджере. Эта тема будет интересна в первую очередь тем, кто устанавливает телегу не из убунтовских репп по причине несвежести версии, а путём скачивания бинарника с офф.сайта телеги. В общем проблема в следующем. В настройках телеги стоит автообновление. Но работает оно как то странно. Раньше когда то вообще не обновлялось автоматом. Сейчас вроде бы и обновляется, но тоже не всегда. Короче, приходится самому лезть на сайт, скачивать, распаковывать и т.д. и т.п. Естественно я как добропорядочный лентяй решил избавиться от этих утомительных манипуляций. В результате появился скрипт telegram_update.sh:
#!/bin/bash
--Обновление telegram--
# Закрытие telegram на случай если был открыт
killall -s 15 Telegram
cd ~/.local/bin/t
wget https://telegram.org/dl/desktop/linux -O linux.tar.xz &
pid1=$!
while true
do
printf "$i\n"
sleep 0.5
if ! [[ $(ps | grep "$pid1") ]]; then
break
fi
done | (yad --skip-taskbar --progress --title="Обновление Telegram" --auto-close --no-cancel --pulsate --button=Отмена:35 --progress-text="Идёт скачивание.." --window-icon=/usr/local/icons/app/yad/info.png --geometry=300x70)
tar -xpf linux.tar.xz -C ./ &
pid2=$!
while true
do
printf "$i\n"
sleep 0.5
if ! [[ $(ps | grep "$pid2") ]]; then
break
fi
done | (yad --skip-taskbar --progress --title="Обновление Telegram" --auto-close --no-cancel --pulsate --button=Отмена:35 --progress-text="Идёт обновление.." --window-icon=/usr/local/icons/app/yad/info.png --geometry=300x70)
# Перемещение обновлённого бинарника Telegram в ~/.local/bin/t/
mkdir ~/.local/bin/t/temp
mv ~/.local/bin/t/Telegram/Telegram ~/.local/bin/t/temp
rm -rf ./Telegram
mv ~/.local/bin/t/temp/Telegram ~/.local/bin/t && rm -rf ./temp
rm -rf ./linux.tar.xz
# Создание симлинка на ~/.local/bin/t/Telegram в ~/.local/bin/
ln -s ~/.local/bin/t/Telegram ~/.local/bin/Telegram
yad --skip-taskbar --title="" --geometry=200x20 --text=" \n Готово!" --window-icon=/usr/local/icons/app/yad/info.png --button=OK:0
У меня телега лежит в ~/.local/bin/t/ и скрипт там же. Если надо чтобы лежала где-то в другом месте, то нужно поправить пути в скрипте.
Значок запуска telegram_update.desktop:
[Desktop Entry]
Name=Обновление Telegram
Comment=
Exec=bash -c '~/.local/bin/t/telegram_update.sh'
Type=Application
Categories=Network;
Icon=/usr/local/icons/telegram_update.png
Terminal=false
Работу скрипта иллюстрирует пульсирующий прогресс-бар:
(https://i.ibb.co/y5bxZqw/Telegram.png) (https://imgbb.com/)
Когда лень запускать телегу для отправки какого-нибудь сообщения самому себе, на помощь приходит способ, показанный в различных интернетах. Например отсюда:
Спойлер
https://darkfess.ru/%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%BA%D0%B0-%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B8-%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2-telegram/
Придумываем своего телеграм-бота. Узнаём его токен и id чата. Кидаем в ~/.local/bin такой скрипт:
#!/bin/bash
# ОТПРАВКА ТЕКСТА, PASTEBINIT-ССЫЛКИ В TELEGRAM (Alt + T)
BOT_TOKEN=<токен>
ID_CHAT=<чат>
# Присвоение переменной buff значения из буфера обмена
buff=$(xsel --clipboard --output)
# Выбор действия
choice=$(yad --list --column=" Что отправить?":tip "Скопированный текст" "Pastebinit-ссылку на скопированный текст" \
--title "" \
--skip-taskbar --window-icon=/usr/local/icons/app/yad/rbox.png --width=350 --height=190 \
--text " Отправка в Telegram:" \
)
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$choice" == *\| ]]; then
choice=${choice::-1}
fi
if [[ $choice == "Скопированный текст" ]]; then
curl https://api.telegram.org/bot$BOT_TOKEN/sendMessage -F chat_id=$ID_CHAT -F text="$buff" &
pid1=$!
while true
do
printf "$i\n"
sleep 0.5
if ! [[ $(ps | grep "$pid1") ]]; then
break
fi
done | (yad --skip-taskbar --progress --title="Текст" --auto-close --no-cancel --pulsate --button=Отмена:35 --progress-text="Идёт отправка в Telegram.." --window-icon=/usr/local/icons/app/yad/rbox.png --geometry=300x70)
notify-send -t 7000 -i /usr/local/icons/rbox.png 'Отправлен текст' \ "$buff"
fi
if [[ $choice == "Pastebinit-ссылку на скопированный текст" ]]; then
buff2=$(echo "$buff"|pastebinit -b http://dpaste.com)
curl https://api.telegram.org/bot$BOT_TOKEN/sendMessage -F chat_id=$ID_CHAT -F text="$buff2" &
pid2=$!
while true
do
printf "$i\n"
sleep 0.5
if ! [[ $(ps | grep "$pid2") ]]; then
break
fi
done | (yad --skip-taskbar --progress --title="Pastebinit-ссылка" --auto-close --no-cancel --pulsate --button=Отмена:35 --progress-text="Идёт отправка в Telegram.." --window-icon=/usr/local/icons/app/yad/rbox.png --geometry=300x70)
notify-send -t 7000 -i /usr/local/icons/rbox.png 'Отправлена ссылка' \ "$buff2"
fi
В этом скрипте вместо <токен> и <чат> прописываем реальный токен своего бота и id чата.
Задаём удобные хоткеи для скрипта (у меня Alt + T).
Должны быть установлены: xsel pastebinit yad
sudo apt install xsel pastebinit yad
Работает это так. Копирую заинтересовавший меня текст из любого источника (браузер, редактор, вьювер и т.д.), нажимаю Alt+T. Выскакивает окно:
(https://i.ibb.co/j89kYv0/ksnip-20220825-121256.png) (https://ibb.co/fXVdWY6)
Жму Enter и скопированный текст улетает ко мне в телегу. По окончании отправки выскакивает notify уведомление. Если текст довольно большой и в дальнейшем его планируется переслать ещё кому-нибудь, то выбираю пункт "Pastebinit-ссылку на скопированный текст".
Хотел добавить ещё один пункт "Файл" для отравки скопированного в тунаре файла, и передумал, потому, что гораздо логичнее отправку файла запилить на ПКM Thunar. Но во-первых я практически не использую thunar. Я фанат Double Commander (для DC я конечно же реализовал отравку файла). Ну а во-вторых ПКM Thunar - это поле деятельности уважаемого el guahiro и я думаю ему будет интересно запилить эту тему. А может у него уже и был подобный скрипт и я просто не заметил его.
На этом всё! Надеюсь многим пригодится эта фишка ))
А это до кучи ещё пара скриптов на случай если нужно выхлоп терминала скинуть себе в телегу.
Скрипт text:
#!/bin/bash
BOT_TOKEN=<токен>
ID_CHAT=<чат>
xsel -b -i && curl https://api.telegram.org/bot$BOT_TOKEN/sendMessage -F chat_id=$ID_CHAT -F text="$(xsel --clipboard --output)" >&/dev/null && echo -e "Готово! Выхлоп команды отправлен в Telegram"
Срипт dpaste:
#!/bin/bash
BOT_TOKEN=<токен>
ID_CHAT=<чат>
pastebinit -b http://dpaste.com | xsel -b -i && curl https://api.telegram.org/bot$BOT_TOKEN/sendMessage -F chat_id=$ID_CHAT -F text=$(xsel --clipboard --output) >& /dev/null && echo -e "Готово! Ссылка $(xsel --clipboard --output) отправлена в Telegram"
Закинуть их как обычно в ~/.local/bin/ , ну или в другое место, главное, чтобы в $PATH было прописано.
Как пользоваться?
Например, если просто посмотреть системную информацию, то:
inxi -Fxz
А чтобы скинуть в телегу добавляем в конвейер text:
inxi -Fxz | text
Или если нужно ссылку, то
inxi -Fxz | dpaste
Есть юзеры, которые используют проприетарные видеодрайвера и юзеры, использующие свободные драйверы из ядра. Я отношусь ко вторым, поскольку я не особо геймер и мне вполне хватает возможностей свободных дров. Но тут как бы до сих пор нерешенная до конца проблема - это тиринг в XFCE. Все конечно знают, что это за зверь такой, а кто не знает смотрите сюда:
Спойлер
https://tehnojam.ru/category/software/category-software-kak-ubrat-razryvy-jekrana-tiring-v-linux.html
Начиная с версии Xubuntu-20.04 тиринг вроде бы победили используя встроенный композитор xfwm и действительно я лично в этом убедился сначала. Но потом мне всё равно попадались компы 20.04 с тирингом. Самый лучший способ избавиться от тиринга это установить композитор compton, а ещё лучше его форк - picom с его красивыми плюшками при открытии, закрытии, сворачивании окон. К чему я всё это говорю?...
А к тому, что установка того же пикома это не sudo apt install picom, а вбивание в терминале такого количества команд, что ЛЕНЬ снова побеждает)) Не дадим ей окончательно нас победить и процесс установки оформим в виде такого простенького скрипта picom_install.sh:
#!/bin/bash
# запуск терминала с параметром -e
x-terminal-emulator -e sh -c 'echo " " ;
sudo apt install -y libxext-dev libxcb1-dev libxcb-damage0-dev libxcb-xfixes0-dev libxcb-shape0-dev libxcb-render-util0-dev libxcb-render0-dev libxcb-randr0-dev libxcb-composite0-dev libxcb-image0-dev libxcb-present-dev libxcb-xinerama0-dev libxcb-glx0-dev libpixman-1-dev libdbus-1-dev libconfig-dev libgl1-mesa-dev libpcre2-dev libpcre3-dev libevdev-dev uthash-dev libev-dev libx11-xcb-dev git python3-pip
sudo pip3 install meson ninja
cd /opt
sudo git clone https://github.com/yshui/picom.git && cd /opt/picom
sleep 1
sudo git submodule update --init --recursive
sudo meson --buildtype=release . build
sudo ninja -C build
sudo ninja -C build install
sudo rm -rf /opt/picom
echo ""
echo " Готово!"
echo " "
echo -n "\033[37;1;41m "Нажмите [ENTER] для выхода.." \033[0m" ; read a'
Запускаем picom_install.sh и picom установлен! Чтобы им пользоваться нужен конфиг. Он у каждого свой в зависимости от того какие дополнительные свистоперделки хочется получить. Мой конфиг my-config.conf такой:
#################################
# Shadows #
#################################
# Enabled client-side shadows on windows. Note desktop windows
# (windows with '_NET_WM_WINDOW_TYPE_DESKTOP') never get shadow,
# unless explicitly requested using the wintypes option.
#
#shadow = false
shadow = true;
# The blur radius for shadows, in pixels. (defaults to 12)
# shadow-radius = 12
shadow-radius = 7;
# The opacity of shadows. (0.0 - 1.0, defaults to 0.75)
# shadow-opacity = .75
# The left offset for shadows, in pixels. (defaults to -15)
# shadow-offset-x = -15
shadow-offset-x = -7;
# The top offset for shadows, in pixels. (defaults to -15)
# shadow-offset-y = -15
shadow-offset-y = -7;
# Red color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-red = 0
# Green color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-green = 0
# Blue color value of shadow (0.0 - 1.0, defaults to 0).
# shadow-blue = 0
# Hex string color value of shadow (#000000 - #FFFFFF, defaults to #000000). This option will override options set shadow-(red/green/blue)
# shadow-color = "#000000"
# Specify a list of conditions of windows that should have no shadow.
#
# examples:
# shadow-exclude = "n:e:Notification";
#
# shadow-exclude = []
shadow-exclude = [
"name = 'Notification'",
"class_g = 'Conky'",
"class_g ?= 'Notify-osd'",
"class_g = 'Cairo-clock'",
"name = 'Digital Clock'",
"_GTK_FRAME_EXTENTS@:c"
];
# Specify a list of conditions of windows that should have no shadow painted over, such as a dock window.
# clip-shadow-above = []
# Specify a X geometry that describes the region in which shadow should not
# be painted in, such as a dock window region. Use
# shadow-exclude-reg = "x10+0+0"
# for example, if the 10 pixels on the bottom of the screen should not have shadows painted on.
#
# shadow-exclude-reg = ""
# Crop shadow of a window fully on a particular Xinerama screen to the screen.
# xinerama-shadow-crop = false
#################################
# Fading #
#################################
# Fade windows in/out when opening/closing and when opacity changes,
# unless no-fading-openclose is used.
# fading = false
fading = true;
# Opacity change between steps while fading in. (0.01 - 1.0, defaults to 0.028)
# fade-in-step = 0.028
fade-in-step = 0.03;
# Opacity change between steps while fading out. (0.01 - 1.0, defaults to 0.03)
# fade-out-step = 0.03
fade-out-step = 0.03;
# The time between steps in fade step, in milliseconds. (> 0, defaults to 10)
# fade-delta = 10
# Specify a list of conditions of windows that should not be faded.
# fade-exclude = []
# Do not fade on window open/close.
# no-fading-openclose = false
# Do not fade destroyed ARGB windows with WM frame. Workaround of bugs in Openbox, Fluxbox, etc.
# no-fading-destroyed-argb = false
#################################
# Transparency / Opacity #
#################################
# Opacity of inactive windows. (0.1 - 1.0, defaults to 1.0)
# inactive-opacity = 1
inactive-opacity = 0.6;
# Opacity of window titlebars and borders. (0.1 - 1.0, disabled by default)
# frame-opacity = 1.0
frame-opacity = 0.9;
# Let inactive opacity set by -i override the '_NET_WM_OPACITY' values of windows.
#inactive-opacity-override = true;
inactive-opacity-override = false;
# Default opacity for active windows. (0.0 - 1.0, defaults to 1.0)
active-opacity = 1.0
# Dim inactive windows. (0.0 - 1.0, defaults to 0.0)
# inactive-dim = 0.0
# Specify a list of conditions of windows that should never be considered focused.
# focus-exclude = []
focus-exclude = [ "class_g = 'Cairo-clock'" ];
# Use fixed inactive dim value, instead of adjusting according to window opacity.
# inactive-dim-fixed = 1.0
# Specify a list of opacity rules, in the format `PERCENT:PATTERN`,
# like `50:name *= "Firefox"`. picom-trans is recommended over this.
# Note we don't make any guarantee about possible conflicts with other
# programs that set '_NET_WM_WINDOW_OPACITY' on frame or client windows.
# example:
# opacity-rule = [ "80:class_g = 'URxvt'" ];
#
opacity-rule = [ "90:name = 'Digital Clock'" ];
# opacity-rule = []
#################################
# Corners #
#################################
# Sets the radius of rounded window corners. When > 0, the compositor will
# round the corners of windows. Does not interact well with
# `transparent-clipping`.
corner-radius = 4
# Exclude conditions for rounded corners.
rounded-corners-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'"
];
#################################
# Background-Blurring #
#################################
# Parameters for background blurring, see the *BLUR* section for more information.
blur-method = "kawase"
blur-size = 12
#
# blur-deviation = false
#
# blur-strength = 1
# Blur background of semi-transparent / ARGB windows.
# Bad in performance, with driver-dependent behavior.
# The name of the switch may change without prior notifications.
#
blur-background = true
# Blur background of windows when the window frame is not opaque.
# Implies:
# blur-background
# Bad in performance, with driver-dependent behavior. The name may change.
#
#blur-background-frame = false
# Use fixed blur strength rather than adjusting according to window opacity.
# blur-background-fixed = false
# Specify the blur convolution kernel, with the following format:
# example:
# blur-kern = "5,5,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1";
#
# blur-kern = ""
blur-kern = "3x3box";
# Exclude conditions for background blur.
# blur-background-exclude = []
blur-background-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'",
"name = 'ksnip'",
"_GTK_FRAME_EXTENTS@:c"
];
#################################
# General Settings #
#################################
# Daemonize process. Fork to background after initialization. Causes issues with certain (badly-written) drivers.
# daemon = false
# Specify the backend to use: `xrender`, `glx`, or `xr_glx_hybrid`.
# `xrender` is the default one.
#
# backend = "glx"
backend = "xrender";
# Enable/disable VSync.
# vsync = false
vsync = true;
# Enable remote control via D-Bus. See the *D-BUS API* section below for more details.
# dbus = false
# Try to detect WM windows (a non-override-redirect window with no
# child that has 'WM_STATE') and mark them as active.
#
# mark-wmwin-focused = false
mark-wmwin-focused = true;
# Mark override-redirect windows that doesn't have a child window with 'WM_STATE' focused.
# mark-ovredir-focused = false
mark-ovredir-focused = true;
# Try to detect windows with rounded corners and don't consider them
# shaped windows. The accuracy is not very high, unfortunately.
#
# detect-rounded-corners = false
detect-rounded-corners = true;
# Detect '_NET_WM_OPACITY' on client windows, useful for window managers
# not passing '_NET_WM_OPACITY' of client windows to frame windows.
#
# detect-client-opacity = false
detect-client-opacity = true;
# Specify refresh rate of the screen. If not specified or 0, picom will
# try detecting this with X RandR extension.
#
# refresh-rate = 60
refresh-rate = 0;
# Use EWMH '_NET_ACTIVE_WINDOW' to determine currently focused window,
# rather than listening to 'FocusIn'/'FocusOut' event. Might have more accuracy,
# provided that the WM supports it.
#
# use-ewmh-active-win = false
# Unredirect all windows if a full-screen opaque window is detected,
# to maximize performance for full-screen windows. Known to cause flickering
# when redirecting/unredirecting windows.
#
# unredir-if-possible = false
# Delay before unredirecting the window, in milliseconds. Defaults to 0.
# unredir-if-possible-delay = 0
# Conditions of windows that shouldn't be considered full-screen for unredirecting screen.
# unredir-if-possible-exclude = []
# Use 'WM_TRANSIENT_FOR' to group windows, and consider windows
# in the same group focused at the same time.
#
# detect-transient = false
detect-transient = true;
# Use 'WM_CLIENT_LEADER' to group windows, and consider windows in the same
# group focused at the same time. 'WM_TRANSIENT_FOR' has higher priority if
# detect-transient is enabled, too.
#
# detect-client-leader = false
detect-client-leader = true;
# Resize damaged region by a specific number of pixels.
# A positive value enlarges it while a negative one shrinks it.
# If the value is positive, those additional pixels will not be actually painted
# to screen, only used in blur calculation, and such. (Due to technical limitations,
# with use-damage, those pixels will still be incorrectly painted to screen.)
# Primarily used to fix the line corruption issues of blur,
# in which case you should use the blur radius value here
# (e.g. with a 3x3 kernel, you should use `--resize-damage 1`,
# with a 5x5 one you use `--resize-damage 2`, and so on).
# May or may not work with *--glx-no-stencil*. Shrinking doesn't function correctly.
#
# resize-damage = 1
# Specify a list of conditions of windows that should be painted with inverted color.
# Resource-hogging, and is not well tested.
#
# invert-color-include = []
# GLX backend: Avoid using stencil buffer, useful if you don't have a stencil buffer.
# Might cause incorrect opacity when rendering transparent content (but never
# practically happened) and may not work with blur-background.
# My tests show a 15% performance boost. Recommended.
#
# glx-no-stencil = false
# GLX backend: Avoid rebinding pixmap on window damage.
# Probably could improve performance on rapid window content changes,
# but is known to break things on some drivers (LLVMpipe, xf86-video-intel, etc.).
# Recommended if it works.
#
# glx-no-rebind-pixmap = false
# Disable the use of damage information.
# This cause the whole screen to be redrawn everytime, instead of the part of the screen
# has actually changed. Potentially degrades the performance, but might fix some artifacts.
# The opposing option is use-damage
#
# no-use-damage = false
use-damage = true;
# Use X Sync fence to sync clients' draw calls, to make sure all draw
# calls are finished before picom starts drawing. Needed on nvidia-drivers
# with GLX backend for some users.
#
# xrender-sync-fence = false
# GLX backend: Use specified GLSL fragment shader for rendering window contents.
# See `compton-default-fshader-win.glsl` and `compton-fake-transparency-fshader-win.glsl`
# in the source tree for examples.
#
# glx-fshader-win = ""
# Force all windows to be painted with blending. Useful if you
# have a glx-fshader-win that could turn opaque pixels transparent.
#
# force-win-blend = false
# Do not use EWMH to detect fullscreen windows.
# Reverts to checking if a window is fullscreen based only on its size and coordinates.
#
# no-ewmh-fullscreen = false
# Dimming bright windows so their brightness doesn't exceed this set value.
# Brightness of a window is estimated by averaging all pixels in the window,
# so this could comes with a performance hit.
# Setting this to 1.0 disables this behaviour. Requires --use-damage to be disabled. (default: 1.0)
#
# max-brightness = 1.0
# Make transparent windows clip other windows like non-transparent windows do,
# instead of blending on top of them.
#
# transparent-clipping = false
# Set the log level. Possible values are:
# "trace", "debug", "info", "warn", "error"
# in increasing level of importance. Case doesn't matter.
# If using the "TRACE" log level, it's better to log into a file
# using *--log-file*, since it can generate a huge stream of logs.
#
# log-level = "debug"
log-level = "warn";
# Set the log file.
# If *--log-file* is never specified, logs will be written to stderr.
# Otherwise, logs will to written to the given file, though some of the early
# logs might still be written to the stderr.
# When setting this option from the config file, it is recommended to use an absolute path.
#
# log-file = "/path/to/your/log/file"
# Show all X errors (for debugging)
# show-all-xerrors = false
# Write process ID to a file.
# write-pid-path = "/path/to/your/log/file"
# Window type settings
#
# 'WINDOW_TYPE' is one of the 15 window types defined in EWMH standard:
# "unknown", "desktop", "dock", "toolbar", "menu", "utility",
# "splash", "dialog", "normal", "dropdown_menu", "popup_menu",
# "tooltip", "notification", "combo", and "dnd".
#
# Following per window-type options are available: ::
#
# fade, shadow:::
# Controls window-type-specific shadow and fade settings.
#
# opacity:::
# Controls default opacity of the window type.
#
# focus:::
# Controls whether the window of this type is to be always considered focused.
# (By default, all window types except "normal" and "dialog" has this on.)
#
# full-shadow:::
# Controls whether shadow is drawn under the parts of the window that you
# normally won't be able to see. Useful when the window has parts of it
# transparent, and you want shadows in those areas.
#
# clip-shadow-above:::
# Controls wether shadows that would have been drawn above the window should
# be clipped. Useful for dock windows that should have no shadow painted on top.
#
# redir-ignore:::
# Controls whether this type of windows should cause screen to become
# redirected again after been unredirected. If you have unredir-if-possible
# set, and doesn't want certain window to cause unnecessary screen redirection,
# you can set this to `true`.
#
wintypes:
{
tooltip = { fade = true; shadow = true; opacity = 0.75; focus = true; full-shadow = false; };
dock = { shadow = false; clip-shadow-above = true; }
dnd = { shadow = false; }
popup_menu = { opacity = 1.0; }
dropdown_menu = { opacity = 1.0; }
};
Лежит my-config.conf в /etc/xdg/picom/
И теперь, чтобы при загрузке системы вместо штатного композитора xfwm включался picom нужно в автозапуске прописать такой скрипт autostart_picom.sh:
#!/bin/bash
# Выкл. композитора xfwm
xfconf-query -c xfwm4 -p /general/use_compositing -t bool -s false
sleep 1
# Вкл. композитора picom
picom --backend glx --config /etc/xdg/picom/my-config.conf &
Всем удачи!
Есть некоторые установленные приложения, значки запуска которых в whisker-меню выглядят не так как хотелось бы. И поэтому хотелось бы их изменить. Ну например иконка синаптика у меня заменяна на другую, более бросающуюся в глаза. Или ещё пример. Возьмём GIMP. Я до сих пор не привыкну, что в названии значка не GIMP, а Gnu image manipulation program. Вроде бы и пустяк, но хочется, чтобы система была максимально удобно заточена под себя. Таким образом, для изменения иконок, названий и других параметров нужно отредактировать соответствующие desktop-файлы в /usr/share/applications. И здесь всё просто. Но проблема в том, что при очередном обновлении значки снова примут первоначальный вид. Чтобы этого избежать, создаём каталог ~.local/appexchange и ложим в него изменённые desktop-файлы приложений. И теперь после обновления с помощью команд sudo apt update и sudo apt dist-upgrade нужно скопировать содержимое ~.local/appexchange в /usr/share/applications. Ну и здесь уже понятно, для того чтобы процесс обновления не превращался каждый раз в небольшую, но всё же рутину, всё это дело можно оформить в виде скрипта:
#!/bin/bash
# ---ОБНОВЛЕНИЕ СИСТЕМЫ---
# запуск терминала с параметром -e
x-terminal-emulator -e sh -c 'echo " "
tput setaf 39; tput smul
echo "Сейчас будет выполнено обновление системы!"
tput sgr0
sudo apt update && sudo apt dist-upgrade
echo " "
# Замена некоторых desktop-файлов после обновления
sudo cp -R ~/.local/appexchange/* /usr/share/applications
echo "Готово!"
echo -n "\033[37;1;41m "Нажмите [ENTER] для выхода.." \033[0m" ; read a'
Существует замечательная консольная утилита fsArchiver для сохранения/восстановления бэкапов системы. Очень удобно с её помощью переносить настроенную систему на другие компы. Также она есть и в GUI-обёртке под названием Qt5-fsarchiver. Но не всем хочется её устанавливать с притягиванием всяких Qt-шных зависимостей. В таком случае предлагаю свой вариант в GTK-шном виде. К тому же и выглядит всё это более нативно для Xubuntu.
Итак, должны быть установлены утилиты fsArchiver , yad и wmctrl. Если нет, то:
sudo apt install fsarchiver yad wmctrl
Создаём в /opt каталог fsaBackup. Закидываем туда иконку fsaBackup.png для значка запуска(кому какая нравится) и скрипт fsaBackup.sh:
#!/bin/bash
# --СОХРАНЕНИЕ/ВОССТАНОВЛЕНИЕ БЭКАПА СИСТЕМЫ--
#Проверка установлен ли yad
dpkg --status "yad" 2>/dev/null | grep "ok installed"
if ! [ $? == 0 ]; then
notify-send -t 7000 -i /usr/local/icons/app/yad/error.png 'Не установлена утилита Yad !'
exit
fi
#Проверка установлен ли fsarchiver
dpkg --status "fsarchiver" 2>/dev/null | grep "ok installed"
if ! [ $? == 0 ]; then
notify-send -t 7000 -i /usr/local/icons/app/yad/error.png 'Не установлена утилита FSArchiver !'
exit
fi
#Проверка установлен ли wmctrl
dpkg --status "wmctrl" 2>/dev/null | grep "ok installed"
if ! [ $? == 0 ]; then
notify-send -t 7000 -i /usr/local/icons/app/yad/error.png 'Не установлена утилита wmctrl !'
exit
fi
#Сохранение в переменную списка всех устройств /dev/sd*
dev=( $(ls /dev/sd* -1 | cut -c6-) ) \
#Функция "Выбор системного раздела"
select_systemdrive(){
systemdrive=$(yad --list --column="":tip "${dev[@]}" \
--title "fsaBackup" \
--text "\n Выбор системного раздела:" \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--geometry=300x500 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$systemdrive" == *\| ]]; then
systemdrive=${systemdrive::-1}
fi
}
#Функция "Выбор домашнего раздела"
select_homedrive(){
homedrive=$(yad --list --column="":tip "${dev[@]}" \
--title "fsaBackup" \
--text "\n Выбор домашнего раздела:" \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--geometry=300x500 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$homedrive" == *\| ]]; then
homedrive=${homedrive::-1}
fi
}
#Функция "Выбор каталога сохранения бэкапа"
select_dir(){
dirplace=$(yad --file --directory \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--title "Выбор пустого каталога для сохранения бэкапа" \
--geometry=900x600 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
if ! [ -z "$(ls -A "$dirplace")" ]; then
yad --skip-taskbar --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/error.png --title="" --geometry=300x100 --text="\nВыбранный каталог не пустой!" --button=Выход:0
exit
fi
}
#Функция "Выбор сохранённого файла бэкапа"
select_file(){
filebackup=$(yad --file \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--title "Выбор сохранённого файла бэкапа" \
--geometry=900x600 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
}
#Функция "Выбор типа бэкапа"
select_option_backup(){
option=$(yad --list --column=" Какой бэкап?":tip "Бэкап полный" "Бэкап системного раздела" "Бэкап домашнего раздела" \
--title "fsaBackup" \
--text "" \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--geometry=300x300 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$option" == *\| ]]; then
option=${option::-1}
fi
}
#Функция "Индикация сохранения бэкапа с помощью прогресс-бара Yad"
indicate_savebackup(){
yad --progress --title=" Идёт сохранение бэкапа.." --auto-close --pulsate --button=Отмена:35 --progress-text="ждём.." --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=400x70 &
sleep 1
# цикл, пока не завершится распаковка(процесс $pid1)
while test -d /proc/$pid1/
do
sleep 0.5
if ! wmctrl -l | grep -e ' Идёт сохранение бэкапа..' ;then #если принудительно закрыть окно Yad (кнопка "Отмена"), то
kill -15 $pid1
break
fi
done
#Закрытие окна Yad
wmctrl -F -c ' Идёт сохранение бэкапа..'
}
#Функция "Индикация восстановления бэкапа с помощью прогресс-бара Yad"
indicate_restorebackup(){
yad --progress --title=" Идёт восстановление бэкапа.." --auto-close --pulsate --button=Отмена:35 --progress-text="ждём.." --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=400x70 &
sleep 1
# цикл, пока не завершится распаковка(процесс $pid1)
while test -d /proc/$pid1/
do
sleep 0.5
if ! wmctrl -l | grep -e ' Идёт восстановление бэкапа..' ;then #если принудительно закрыть окно Yad (кнопка "Отмена"), то
kill -15 $pid1
break
fi
done
#Закрытие окна Yad
wmctrl -F -c ' Идёт восстановление бэкапа..'
}
backup=$(yad --list --column=" Что сделать?":tip "Сохранить бэкап" "Восстановить бэкап" \
--title "fsaBackup" \
--text "" \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--geometry=300x300 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$backup" == *\| ]]; then
backup=${backup::-1}
fi
if [[ $backup == "Сохранить бэкап" ]]; then
#вызов функции
select_option_backup
if [[ $option == "Бэкап полный" ]]; then
#вызов функций
select_systemdrive
select_homedrive
#Отмонтирование смонтированных дисков
if mount|grep /dev/"$systemdrive" ;then
umount /dev/"$systemdrive"
fi
if mount|grep /dev/"$homedrive" ;then
umount /dev/"$homedrive"
fi
#вызов функции
select_dir
#Проверка
yad --title="fsaBackup" --text="\n\nСистемный каталог: /dev/"$systemdrive" \n\nДомашний каталог: /dev/"$homedrive" \n\nКаталог для сохранения бэкапа: "$dirplace" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Сохранение полного бэкапа (индикация процесса с помощью yad)
fsarchiver savefs "$dirplace"/full-backup.fsa /dev/"$systemdrive" /dev/"$homedrive" &
pid1=$!
#вызов функции
indicate_savebackup
yad --title="fsaBackup" --text="\n Сохранение полного бэкапа \n успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
if [[ $option == "Бэкап системного раздела" ]]; then
#вызов функции
select_systemdrive
#Отмонтирование смонтированного диска
if mount|grep /dev/"$systemdrive" ;then
umount /dev/"$systemdrive"
fi
#вызов функции
select_dir
#Проверка
yad --title="fsaBackup" --text="\n\nСистемный каталог: /dev/"$systemdrive" \n\nКаталог для сохранения бэкапа: "$dirplace" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Сохранение бэкапа системного раздела (индикация процесса с помощью yad)
fsarchiver savefs "$dirplace"/system-backup.fsa /dev/"$systemdrive" &
pid1=$!
#вызов функции
indicate_savebackup
yad --title="fsaBackup" --text="\n Сохранение бэкапа системного \n раздела успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
if [[ $option == "Бэкап домашнего раздела" ]]; then
#вызов функции
select_homedrive
#Отмонтирование смонтированного диска
if mount|grep /dev/"$homedrive" ;then
umount /dev/"$homedrive"
fi
#вызов функции
select_dir
#Проверка
yad --title="fsaBackup" --text="\n\nДомашний каталог: /dev/"$homedrive" \n\nКаталог для сохранения бэкапа: "$dirplace" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Сохранение бэкапа домашнего раздела (индикация процесса с помощью yad)
fsarchiver savefs "$dirplace"/home-backup.fsa /dev/"$homedrive" &
pid1=$!
#вызов функции
indicate_savebackup
yad --title="fsaBackup" --text="\n Сохранение бэкапа домашнего \n раздела успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
fi
if [[ $backup == "Восстановить бэкап" ]]; then
#вызов функции
select_option_backup
if [[ $option == "Бэкап полный" ]]; then
#вызов функций
select_systemdrive
select_homedrive
#Отмонтирование смонтированных дисков
if mount|grep /dev/"$systemdrive" ;then
umount /dev/"$systemdrive"
fi
if mount|grep /dev/"$homedrive" ;then
umount /dev/"$homedrive"
fi
#вызов функции
select_file
#Проверка
yad --title="fsaBackup" --text="\n\nСистемный каталог: /dev/"$systemdrive" \n\nДомашний каталог: /dev/"$homedrive" \n\nФайл бэкапа: "$filebackup" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Восстановление полного бэкапа (индикация процесса с помощью yad)
fsarchiver restfs "$filebackup" id=0,dest=/dev/"$systemdrive" id=1,dest=/dev/"$homedrive" &
pid1=$!
#вызов функции
indicate_restorebackup
yad --title="fsaBackup" --text="\n Восстановление полного бэкапа \n успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
if [[ $option == "Бэкап системного раздела" ]]; then
#вызов функции
select_systemdrive
#Отмонтирование смонтированного диска
if mount|grep /dev/"$systemdrive" ;then
umount /dev/"$systemdrive"
fi
#вызов функции
select_file
#Проверка
yad --title="fsaBackup" --text="\n\nСистемный каталог: /dev/"$systemdrive" \n\nФайл бэкапа: "$filebackup" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Восстановление бэкапа системного раздела (индикация процесса с помощью yad)
fsarchiver restfs "$filebackup" id=0,dest=/dev/"$systemdrive" &
pid1=$!
#вызов функции
indicate_restorebackup
yad --title="fsaBackup" --text="\n Восстановление бэкапа системного \n раздела успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
if [[ $option == "Бэкап домашнего раздела" ]]; then
#вызов функции
select_homedrive
#Отмонтирование смонтированного диска
if mount|grep /dev/"$homedrive" ;then
umount /dev/"$homedrive"
fi
#вызов функции
select_file
#Проверка
yad --title="fsaBackup" --text="\n\nДомашний каталог: /dev/"$homedrive" \n\nФайл бэкапа: "$filebackup" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Восстановление бэкапа домашнего раздела (индикация процесса с помощью yad)
fsarchiver restfs "$filebackup" id=0,dest=/dev/"$homedrive" &
pid1=$!
#вызов функции
indicate_restorebackup
yad --title="fsaBackup" --text="\n Восстановление бэкапа домашнего \n раздела успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
fi
Ложим в /usr/share/applications/ или в ~/.local/share/applications/ значок запуска fsaBackup.desktop:
[Desktop Entry]
Name=fsaBackup
Comment=Резервное копирование и восстановление системы
Exec=bash -c 'pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY /opt/fsaBackup/fsaBackup.sh'
Type=Application
Categories=System
Icon=/opt/fsaBackup/fsaBackup.png
Не забываем дать права на исполнение /opt/fsaBackup/fsaBackup.sh
Ну в общем-то и всё! В меню whisker находим fsaBackup и запускаем его. Дальше всё интуитивно понятно.
Ах да, чуть не забыл. Т.к. бэкапить нужно действующую систему, то запускать всё это хозяйство необходимо из под live-системы, чтобы архивируемые диски были отмонтированы. Варианты как делать настроенную live-систему были представлены здесь на форуме. Я предлагал wasta-remastersys, а уважаемый el guahiro с помощью systemback. На крайняк можно загрузиться и с голой live-USB (изкоропки), по-быстрому установить fsarchiver и yad, и запустить скрипт:
sudo /путь/к/fsaBackup.sh
(https://i.ibb.co/ysD2sZ8/1.png) (https://ibb.co/ysD2sZ8)
(https://i.ibb.co/SRxkq4j/2.png) (https://ibb.co/SRxkq4j)
(https://i.ibb.co/HTHspq3/3.png) (https://ibb.co/HTHspq3)
(https://i.ibb.co/bzJrhhF/4.png) (https://ibb.co/bzJrhhF)
Цитата: danwer от января 05, 2023, 13:27:47скрипт fsaBackup.sh (//fsaBackup.sh):
а если в этот скрипт, в случае отсутствия необходимых пакетов добавить команду по установке их и после установки продолжить выполнение скрипта
Цитата: butjapka от января 05, 2023, 22:53:24Цитата: danwer от января 05, 2023, 13:27:47скрипт fsaBackup.sh (//fsaBackup.sh):
а если в этот скрипт, в случае отсутствия необходимых пакетов добавить команду по установке их и после установки продолжить выполнение скрипта
Отличное предложение! :smile:
Поправил скрипт fsaBackup.sh:
#!/bin/bash
# --СОХРАНЕНИЕ/ВОССТАНОВЛЕНИЕ БЭКАПА СИСТЕМЫ--
#Проверка установки дополнительных пакетов
yad=$(dpkg --status "yad" 2>/dev/null | grep "ok installed")
fsarchiver=$(dpkg --status "fsarchiver" 2>/dev/null | grep "ok installed")
wmctrl=$(dpkg --status "wmctrl" 2>/dev/null | grep "ok installed");
if ! [[ $yad = "Status: install ok installed" && $fsarchiver = "Status: install ok installed" && $wmctrl = "Status: install ok installed" ]]
then
# запуск терминала с параметром -e
x-terminal-emulator -e sh -c 'apt update && apt install -y yad fsarchiver wmctrl'
fi
bootrepair=$(dpkg --status "boot-repair" 2>/dev/null | grep "ok installed")
if ! [[ $bootrepair = "Status: install ok installed" ]]
then
# запуск терминала с параметром -e
x-terminal-emulator -e sh -c 'add-apt-repository -y ppa:yannubuntu/boot-repair && apt update && apt install -y boot-repair'
fi
#Сохранение в переменную списка всех устройств /dev/sd*
dev=( $(ls /dev/sd* -1 | cut -c6-) ) \
#Функция "Выбор системного раздела"
select_systemdrive(){
systemdrive=$(yad --list --column="":tip "${dev[@]}" \
--title "fsaBackup" \
--text "\n Выбор системного раздела:" \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--geometry=300x500 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$systemdrive" == *\| ]]; then
systemdrive=${systemdrive::-1}
fi
}
#Функция "Выбор домашнего раздела"
select_homedrive(){
homedrive=$(yad --list --column="":tip "${dev[@]}" \
--title "fsaBackup" \
--text "\n Выбор домашнего раздела:" \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--geometry=300x500 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$homedrive" == *\| ]]; then
homedrive=${homedrive::-1}
fi
}
#Функция "Выбор каталога сохранения бэкапа"
select_dir(){
dirplace=$(yad --file --directory \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--title "Выбор пустого каталога для сохранения бэкапа" \
--geometry=900x600 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
if ! [ -z "$(ls -A "$dirplace")" ]; then
yad --skip-taskbar --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/error.png --title="" --geometry=300x100 --text="\nВыбранный каталог не пустой!" --button=Выход:0
exit
fi
}
#Функция "Выбор сохранённого файла бэкапа"
select_file(){
filebackup=$(yad --file \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--title "Выбор сохранённого файла бэкапа" \
--geometry=900x600 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
}
#Функция "Выбор типа бэкапа"
select_option_backup(){
option=$(yad --list --column=" Какой бэкап?":tip "Бэкап полный" "Бэкап системного раздела" "Бэкап домашнего раздела" \
--title "fsaBackup" \
--text "" \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--geometry=300x300 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$option" == *\| ]]; then
option=${option::-1}
fi
}
#Функция "Индикация сохранения бэкапа с помощью прогресс-бара Yad"
indicate_savebackup(){
yad --progress --title=" Идёт сохранение бэкапа.." --auto-close --pulsate --button=Отмена:35 --progress-text="ждём.." --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=400x70 &
sleep 1
# цикл, пока не завершится распаковка(процесс $pid1)
while test -d /proc/$pid1/
do
sleep 0.5
if ! wmctrl -l | grep -e ' Идёт сохранение бэкапа..' ;then #если принудительно закрыть окно Yad (кнопка "Отмена"), то
kill -15 $pid1
break
fi
done
#Закрытие окна Yad
wmctrl -F -c ' Идёт сохранение бэкапа..'
}
#Функция "Индикация восстановления бэкапа с помощью прогресс-бара Yad"
indicate_restorebackup(){
yad --progress --title=" Идёт восстановление бэкапа.." --auto-close --pulsate --button=Отмена:35 --progress-text="ждём.." --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=400x70 &
sleep 1
# цикл, пока не завершится распаковка(процесс $pid1)
while test -d /proc/$pid1/
do
sleep 0.5
if ! wmctrl -l | grep -e ' Идёт восстановление бэкапа..' ;then #если принудительно закрыть окно Yad (кнопка "Отмена"), то
kill -15 $pid1
break
fi
done
#Закрытие окна Yad
wmctrl -F -c ' Идёт восстановление бэкапа..'
}
backup=$(yad --list --column=" Что сделать?":tip "Сохранить бэкап" "Восстановить бэкап" \
--title "fsaBackup" \
--text "" \
--window-icon=/usr/local/icons/app/yad/fsaBackup.png \
--geometry=300x300 \
--button="gtk-cancel:35" --button="gtk-ok:0" \
)
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
# Удаление последнего символа | , т.к yad косячно добавляет его в конце
if [[ "$backup" == *\| ]]; then
backup=${backup::-1}
fi
if [[ $backup == "Сохранить бэкап" ]]; then
#вызов функции
select_option_backup
if [[ $option == "Бэкап полный" ]]; then
#вызов функций
select_systemdrive
select_homedrive
#Отмонтирование смонтированных дисков
if mount|grep /dev/"$systemdrive" ;then
umount /dev/"$systemdrive"
fi
if mount|grep /dev/"$homedrive" ;then
umount /dev/"$homedrive"
fi
#вызов функции
select_dir
#Проверка
yad --title="fsaBackup" --text="\n\nСистемный каталог: /dev/"$systemdrive" \n\nДомашний каталог: /dev/"$homedrive" \n\nКаталог для сохранения бэкапа: "$dirplace" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Сохранение полного бэкапа (индикация процесса с помощью yad)
fsarchiver savefs "$dirplace"/full-backup.fsa /dev/"$systemdrive" /dev/"$homedrive" &
pid1=$!
#вызов функции
indicate_savebackup
yad --title="fsaBackup" --text="\n Сохранение полного бэкапа \n успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
if [[ $option == "Бэкап системного раздела" ]]; then
#вызов функции
select_systemdrive
#Отмонтирование смонтированного диска
if mount|grep /dev/"$systemdrive" ;then
umount /dev/"$systemdrive"
fi
#вызов функции
select_dir
#Проверка
yad --title="fsaBackup" --text="\n\nСистемный каталог: /dev/"$systemdrive" \n\nКаталог для сохранения бэкапа: "$dirplace" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Сохранение бэкапа системного раздела (индикация процесса с помощью yad)
fsarchiver savefs "$dirplace"/system-backup.fsa /dev/"$systemdrive" &
pid1=$!
#вызов функции
indicate_savebackup
yad --title="fsaBackup" --text="\n Сохранение бэкапа системного \n раздела успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
if [[ $option == "Бэкап домашнего раздела" ]]; then
#вызов функции
select_homedrive
#Отмонтирование смонтированного диска
if mount|grep /dev/"$homedrive" ;then
umount /dev/"$homedrive"
fi
#вызов функции
select_dir
#Проверка
yad --title="fsaBackup" --text="\n\nДомашний каталог: /dev/"$homedrive" \n\nКаталог для сохранения бэкапа: "$dirplace" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Сохранение бэкапа домашнего раздела (индикация процесса с помощью yad)
fsarchiver savefs "$dirplace"/home-backup.fsa /dev/"$homedrive" &
pid1=$!
#вызов функции
indicate_savebackup
yad --title="fsaBackup" --text="\n Сохранение бэкапа домашнего \n раздела успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
fi
if [[ $backup == "Восстановить бэкап" ]]; then
#вызов функции
select_option_backup
if [[ $option == "Бэкап полный" ]]; then
#вызов функций
select_systemdrive
select_homedrive
#Отмонтирование смонтированных дисков
if mount|grep /dev/"$systemdrive" ;then
umount /dev/"$systemdrive"
fi
if mount|grep /dev/"$homedrive" ;then
umount /dev/"$homedrive"
fi
#вызов функции
select_file
#Проверка
yad --title="fsaBackup" --text="\n\nСистемный каталог: /dev/"$systemdrive" \n\nДомашний каталог: /dev/"$homedrive" \n\nФайл бэкапа: "$filebackup" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Восстановление полного бэкапа (индикация процесса с помощью yad)
fsarchiver restfs "$filebackup" id=0,dest=/dev/"$systemdrive" id=1,dest=/dev/"$homedrive" &
pid1=$!
#вызов функции
indicate_restorebackup
yad --title="fsaBackup" --text="\n Восстановление полного бэкапа \n успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
if [[ $option == "Бэкап системного раздела" ]]; then
#вызов функции
select_systemdrive
#Отмонтирование смонтированного диска
if mount|grep /dev/"$systemdrive" ;then
umount /dev/"$systemdrive"
fi
#вызов функции
select_file
#Проверка
yad --title="fsaBackup" --text="\n\nСистемный каталог: /dev/"$systemdrive" \n\nФайл бэкапа: "$filebackup" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Восстановление бэкапа системного раздела (индикация процесса с помощью yad)
fsarchiver restfs "$filebackup" id=0,dest=/dev/"$systemdrive" &
pid1=$!
#вызов функции
indicate_restorebackup
yad --title="fsaBackup" --text="\n Восстановление бэкапа системного \n раздела успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
if [[ $option == "Бэкап домашнего раздела" ]]; then
#вызов функции
select_homedrive
#Отмонтирование смонтированного диска
if mount|grep /dev/"$homedrive" ;then
umount /dev/"$homedrive"
fi
#вызов функции
select_file
#Проверка
yad --title="fsaBackup" --text="\n\nДомашний каталог: /dev/"$homedrive" \n\nФайл бэкапа: "$filebackup" \n\n\nЕсли всё правильно выбрано, то жмём ОК. " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=600x300 --button="gtk-cancel:35" --button="gtk-ok:0"
if [[ $? = 35 || $? = 252 ]]; then
exit
fi
#Восстановление бэкапа домашнего раздела (индикация процесса с помощью yad)
fsarchiver restfs "$filebackup" id=0,dest=/dev/"$homedrive" &
pid1=$!
#вызов функции
indicate_restorebackup
yad --title="fsaBackup" --text="\n Восстановление бэкапа домашнего \n раздела успешно завершено! " --window-icon=/usr/local/icons/app/yad/empty.png --image=/usr/local/icons/app/yad/fsaBackup.png --geometry=300x100 --button="gtk-ok:0"
exit
fi
fi
С подачи el guahiro с его командой на ПКМ Thunar для записи скринкастов родился такой скрипт screencast.sh:
#!/bin/bash
# ЗАПИСЬ ЭКРАНА
#Если существует временный файл .tmp1, то
if [ -f .tmp1 ]; then
#Закрытие индикатора записи в трее
pid2=$(<.tmp2)
kill -15 $pid2
exit
else
#Узнаём разрешение экрана
r=$(xdpyinfo -display :0.0 | grep dimensions | egrep -o "[0-9]+x[0-9]+ pixels" | egrep -o "[0-9]+x[0-9]+")
#Запись
ffmpeg -f alsa -ac 2 -i pulse -f x11grab -r 25 -s $r -i :0.0 -vcodec libx264 -pix_fmt yuv420p -crf 26 -threads 0 -acodec pcm_s16le -y ~/Видео/ScreenCasts/screencast_$(date +%d-%m-%Y_%H:%M:%S).mkv &
pid1=$!
echo "$pid1" > .tmp1
#Индикация записи в трее
yad --notification --image=/usr/local/icons/app/yad/screencast.png --text='Идёт запись экрана' &
pid2=$!
echo "$pid2" > .tmp2
#Пока присутствует индикатор записи в трее
while test -d /proc/$pid2/
do
sleep 0.1
done
#Стоп записи и удаление временных файлов
kill -15 $pid1 && rm -f .tmp1 .tmp2
sleep 0.5
notify-send -t 7000 -i /usr/local/icons/app/yad/screencast-2.png 'Готово! Скринкаст лежит в ~/Видео/ScreenCasts/'
fi
Должны быть установлены ffmpeg и yad.
Задаём хоткей на screencast.sh (у меня Ctrl+R). Жмём Ctrl+R - запись пошла. В трее появился индикатор. Снова жмём Ctrl+R - запись остановилась с извещением notify-send. Индикатор исчез. Всё просто. До этого я пользовался неплохой утилитой SimpleScreenRecorder. Но в ней всё-таки больше телодвижений, чтобы начать и остановить запись экрана.
Утилита yt-dlp для скачивания контента с различных видеохостингов относится к утилитам МАСТ ХЭВ ! Её также удобно использовать в связке с плейером mpv, о чём я писал раннее. В интернетах рассказывается о различных способах установки yt-dlp, причём для различных версий xubuntu да и вообще для других дистрибутивов могут возникнуть нюансы во время установки и во время использования. Связано это с наличием питоновских зависимостей, а как известно в различных дистрибутивах и версии питона различные. Короче хотелось бы какой-то универсальный способ установки yt-dlp для любого дистрибутива. И такой способ есть !
Ложим в /usr/local/bin/ скрипт yt-dlp_upgrade.sh:
#!/bin/bash
# ------------------Установка/Обновление yt-dlp-----------------------
wget https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp_linux -O /usr/local/bin/yt-dlp &
pid1=$!
yad --progress \
--title=" Идёт обновление yt-dlp.." \
--auto-close \
--pulsate \
--button=Отмена:35 \
--progress-text="ждём.." \
--window-icon=/usr/local/icons/app/yad/empty.png \
--image=/usr/local/icons/app/yad/yt-dlp_upgrade.png \
--geometry=400x70 &
sleep 1
#цикл, пока не завершится обновление(процесс $pid1)
while test -d /proc/$pid1/
do
sleep 0.5
if ! wmctrl -l | grep -e " Идёт обновление yt-dlp.." ;then
kill -15 $pid1
rm -f /usr/local/bin/yt-dlp
sleep 1
yad --title="" \
--text "\nОбновление отменено! \nНедокачаный файл /usr/local/bin/yt-dlp удалён!" \
--window-icon=/usr/local/icons/app/yad/empty.png \
--image=/usr/local/icons/app/yad/warning.png \
--button=Выход:0
exit
fi
done
#Закрытие окна Yad
wmctrl -F -c " Идёт обновление yt-dlp.."
chmod 755 /usr/local/bin/yt-dlp
yad --skip-taskbar \
--title="" \
--text "\n Готово! " \
--window-icon=/usr/local/icons/app/yad/empty.png \
--image=/usr/local/icons/app/yad/info.png \
--button=OK:0
Делаем значок запуска yt-dlp_upgrade.desktop и ложим его в ~/.local/share/applications/ или в /usr/share/applications/
[Desktop Entry]
Name=
Comment= Установка/Обновление yt-dlp
Exec=bash -c 'pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORITY /usr/local/bin/yt-dlp_upgrade.sh'
Type=Application
Categories=AudioVideo;
Icon=/path/to/icon
Terminal=false
Должны быть предварительно установлены wget, yad, wmctrl.
В меню whisker кликаем по значку "Установка/Обновление yt-dlp". В результате в /usr/local/bin/ появится бинарник yt-dlp, содержащий в себе все необходимые библиотеки для успешного применения на любых дистрибутивах. Этакий а-ля appimage. Всё будет работать независимо от используемого дистра. Тем не менее через какое-то время yt-dlp перестаёт корректно работать. Например во время просмотра в mpv онлайн-видео кэш прогружается только на 2-4 сек. В результате просмотр превращается в слайд-шоу. Или же вообще не запускается видео в mpv, выдавая какие-то ошибки в терминале. В этом случае запустив тот же скрипт yt-dlp_upgrade.sh, произойдёт обновление yt-dlp и всё заработает как прежде. Всё просто ))
Настройкой xfce-панелей каждый занимается в силу своих личных предпочтений. Одним из популярных вариантов компоновки элементов на панеле является вариант когда слева значок меню Whisker, посередине часы с датой, а справа всё остальное (значки часто используемых приложений, элементы трея, системная информация и т.д.). Погуглив можно найти информацию как расположить часы именно посередине панели. В основном рекомендации сводятся к тому, чтобы с обоих сторон от часов с датой поместить разделители с функцией расширения. Есть даже видео на ютубе где юзер показывает как он это сделал. Действительно, часы с датой у него посередине панели. Лично у меня не получилось сделать чётко посередине. Но дело даже не в этом. Часы с датой не зафиксированы, а смещаются если справа в трее появляются новые значки. Чего-то я не догоняю как он реализовал без смещения. В результате экспериментов у меня всё-таки появился рабочий способ решения проблемы. Вместо одной панели нужно делать три. И да, кстати по поводу трёх панелей вместо одной тоже информация мелькала где-то в сети. 1-я панель - основная (та, где трей, системные значки и т.д.), 2-я - часы с датой, 3-я - whisker. Таким образом нужно, чтобы 1-я панель была прижата к правому краю, 3-я - к левому, а 2-я по центру. Основная идея в том, что расширяемые разделители нужно поместить не во 2-ю панель с обоих краёв, а в 1-ю и 3-ю. В 1-й панеле помещаем разделитель до всех значков, а в 3-й панеле после значка whisker. И теперь часы с датой чётко зафиксированы в центре и никуда не смещаются.
(https://i.ibb.co/F7tLMzF/2.png) (https://ibb.co/F7tLMzF)
(https://i.ibb.co/p14zjJ7/3.png) (https://ibb.co/p14zjJ7)
Важный нюанс. В настройках всех 3 панелей должна отсутствовать галка на "Автоматически увеличивать длину". Иначе через некоторое время становятся видны стыки на границах панелей.
Раз уж пошёл разговор о xfce-панелях, то добавлю ещё один момент. В xfce 4.18 толи баг толи непонятно что, вобщем имеется проблема с прозрачностью панели. Суть в том, что если для панели настроена какая-то прозрачность, то иногда сразу же после загрузки системы и появления панели эта прозрачность слетает и фон панели становится чёрным. В этом случае нужно перезапустить панель с помощью команды в терминале xfce4-panel -r. А чтобы не делать это вручную лучше прописать в автозапуске:
bash -c "sleep 5 && xfce4-panel -r"