декабря 08, 2024, 05:43:10

Новости:

Перейти на сайт https://xubuntu-ru.net


Лень-двигатель прогресса

Автор danwer, июля 17, 2022, 16:06:34

« предыдущая - следующая »

danwer

июля 17, 2022, 16:06:34 Последнее редактирование: ноября 05, 2023, 12:20:38 от danwer Причина: Неверная ссылка на видео
    Всем большой привет! Вношу свою лепту в продолжение темы "Руководство по допиливанию.. " на примере el guahiro с его полезными  ПКМ Thunar скриптами. На данный момент уважаемый el выкладывает свои наработки не сюда на форум, а в телеграмм-канал  Xubuntu-ru.net и это понятно - сейчас обратной связи нет с форумчанами. Но я всё-таки решил написать сюда дабы малёха оживить уснувший форум. А речь пойдёт об обработке видеоссылок (youtube, rutube, OK, VK, и т.д.). Во многих случаях гораздо удобнее просматривать видео не в браузере, а во внешнем плейере, а т.к. при этом хочется вдобавок ещё и gui-удобств, то и возникла у меня идея своять скрипт. Как говорится лучше один раз увидеть, чем читать бредни разработчика, коим я не очень то и являюсь 😂. Поэтому смотрим кино:
Спойлер
videolinks
[свернуть]

Итак, по-порядку. Должны быть установлены некоторые утилиты.
Устанавливаем 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, а то сюда пока нет доступа ((

danwer

Было дело, el guahiro среди 100500 своих скриптов показал как извлекать текст из картинок.
Взяв его скрипт за основу представляю свой вариант, главным отличием в котором является использование утилиты scrot. В результате можно извлекать не только весь текст из картинки, а ещё и отдельные фрагменты. Опять, сначала смотрим кино:
Спойлер

Устанавливаем необходимые утилиты, если их нет:
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.

Готово!


danwer

Ох до чего же лень матушка довела!! Неохота залазить в меню настроек, чтобы сменить тему оформления системы ))  Как обычно, сначала смотрим кино:
Спойлер

Устанавливаем необходимые утилиты, если их нет:
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.
    На этом у меня всё! Надеюсь, что эта причуда может пригодиться любителям поиграться с темами.







danwer

Во многих ОС, и 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


А если после запуска таймера обстоятельства изменились и выключать ПК не нужно? Не проблема.
Скрипт 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


А если запустили таймер, потом захотели отменить его, но не отменили (ну мало ли - отвлекли вас например), то непосредственно перед выключением компа будет дан 20-ти секундный шанс отменить всё-таки выключение.


Ну и чтобы всё это работало само собой должен быть установлен yad (sudo apt install yad), либо zenity, кто пользуется им.

butjapka

и как вам с элем хватает терпения разбираться во всем этом... :laugh:

danwer

Цитата: butjapka от июля 31, 2022, 13:47:17и как вам с элем хватает терпения разбираться во всем этом... :laugh:
Ну, видимо особая привязанность к xfce :). Пробовал различные дистрибутивы, но неизменно возвращался на xubuntu. А что касается эля, то мне до него далеко с его тоннами скриптов. Я в линухе с 2018, а он значительно раньше.  :smile:

el guahiro

Цитата: danwer от июля 24, 2022, 00:35:34можно извлекать не только весь текст из картинки
У меня есть на форуме описание, как извлекать текст с фрагмента картинки https://forum.xubuntu-ru.net/index.php?topic=1117.msg13073;topicseen#msg13073
Искренне ваш
См. скрипты для ПКМ Thunar здесь https://github.com/el-guahiro/thunar_custom_actions
Рекомендации для граждан у условиях гуманитарной катастрофы https://goo-gl.me/abV3X

el guahiro

Цитата: butjapka от июля 31, 2022, 13:47:17и как вам с элем хватает терпения разбираться во всем этом
Так лень же! Когда лень, то хватает духу что-то запилить и потом только на хоткейчики щёлкать.
Искренне ваш
См. скрипты для ПКМ Thunar здесь https://github.com/el-guahiro/thunar_custom_actions
Рекомендации для граждан у условиях гуманитарной катастрофы https://goo-gl.me/abV3X

danwer

Сегодня поговорим о телеграм-мессенджере. Эта тема будет интересна в первую очередь тем, кто устанавливает телегу не из убунтовских репп по причине несвежести версии, а путём скачивания бинарника с офф.сайта телеги. В общем проблема в следующем. В настройках телеги стоит автообновление. Но работает оно как то  странно.  Раньше когда то  вообще не обновлялось автоматом. Сейчас вроде бы и обновляется, но тоже не всегда. Короче,  приходится самому лезть на сайт, скачивать, распаковывать и т.д. и т.п.  Естественно я как добропорядочный лентяй решил избавиться от этих утомительных манипуляций. В результате появился скрипт 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

Работу скрипта иллюстрирует пульсирующий прогресс-бар:


danwer

Когда лень запускать телегу для отправки какого-нибудь сообщения самому себе, на помощь приходит способ, показанный в различных интернетах. Например отсюда:
Спойлер
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. Выскакивает окно:


Жму Enter и скопированный текст улетает ко мне в телегу. По окончании отправки выскакивает notify уведомление. Если текст довольно большой и в дальнейшем его планируется переслать ещё кому-нибудь, то выбираю пункт "Pastebinit-ссылку на скопированный текст".
   Хотел добавить ещё один пункт "Файл" для отравки скопированного в тунаре файла, и передумал, потому, что гораздо логичнее отправку файла запилить на ПКM Thunar. Но во-первых я практически не использую thunar. Я фанат Double Commander (для DC я конечно же реализовал отравку файла). Ну а во-вторых ПКM Thunar - это поле деятельности уважаемого el guahiro и я думаю ему будет интересно запилить эту тему. А может у него уже и был подобный скрипт и я просто не заметил его.
   На этом всё! Надеюсь многим пригодится эта фишка ))

danwer

А это до кучи ещё пара скриптов на случай если нужно выхлоп терминала скинуть себе в телегу.
Скрипт 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

danwer

Есть юзеры, которые используют проприетарные видеодрайвера и юзеры, использующие свободные драйверы из ядра. Я отношусь ко вторым, поскольку я не особо геймер и мне вполне хватает возможностей свободных дров. Но тут как бы до сих пор нерешенная до конца проблема - это тиринг в XFCE. Все конечно знают, что это за зверь такой, а кто не знает смотрите сюда:
Спойлер

Начиная с версии 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 &

Всем удачи!





danwer

    Есть некоторые установленные приложения, значки запуска которых в 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'

danwer

января 05, 2023, 13:27:47 #13 Последнее редактирование: января 08, 2023, 23:49:00 от danwer
Существует замечательная консольная утилита 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











butjapka

Цитата: danwer от января 05, 2023, 13:27:47скрипт fsaBackup.sh:
а если в этот скрипт, в случае отсутствия необходимых пакетов добавить команду по установке их и после установки продолжить выполнение скрипта