Вопрос или проблема
Я не уверен, как это назвать, но в основном я ищу совет о том, как лучше всего реализовать следующее. Специфику я могу найти в интернете, но не знаю, как это всё соединить.
Я пытаюсь написать файл .desktop
, который будет вызывать команду uxplay
(сервер зеркалирования AirPlay на Unix) и размещать значок в системном трей с пунктом меню Выйти
. uxplay
требует, чтобы несколько портов были открыты, кроме того, ему нужен “DNS-SD сервер”. Я не знаком с этим термином, но, похоже, что-то вроде avahi
— это то, что мне нужно.
Итак, в целом, вот что я представляю:
- Запустить файл с рабочего стола через
Krunner
илиRofi
. - В
Exec
файла .desktop вызывается скрипт, который делает две вещи:- Запускает службу пользователя
systemd
. - Запускает
yad
(Yet Another Dialogue) с пунктом менюВыйти
, который затем останавливает эту службу пользователя.
- Запускает службу пользователя
Require
иAfter
службы пользователя запустят службуavahi
.- Служба пользователя затем как-то откроет необходимые порты, возможно, в своём
ExecStart
. В этой части я не уверен, потому что, думаю, это потребуетroot
, может быть, можно как-то использовать policy kit, чтобы отобразить этот диалог на рабочем столе, который предоставляет привилегии? uxplay -p
наконец вызывается черезExec
.
Когда мы выходим:
ExecStop
закрывает порты (могу ли я как-то сохранить те же привилегии, чтобы не использовать policy kit снова?)- Из-за условия
PartOf
службыavahi
, когда останавливаетсяuxplay.service
, останавливается иavahi.service
Если есть лучшие способы, я рад отказатся от всего этого, это просто лучшее, что я смог придумать, хотя, опять же, я даже не уверен, что секция портов может быть реализована внутри юнитов службы пользователя.
Ответ или решение
Организация служб, зависимых служб, файлов рабочего стола и портов как пользователь
Ваша задача по интеграции службы uxplay
(сервера AirPlay для Unix) с графическим интерфейсом и управлением службами может показаться сложной, но с правильным подходом это вполне осуществимо. Давайте рассмотрим каждый аспект вашего запроса.
1. Создание файла рабочего стола (.desktop)
Для начала создайте файл рабочего стола, который будет запускаться через Krunner
или Rofi
. Структура файла .desktop
может выглядеть следующим образом:
[Desktop Entry]
Version=1.0
Type=Application
Name=UXPlay
Exec=/path/to/script.sh
Icon=path/to/icon.png
Terminal=false
Categories=Utility;
2. Скрипт для управления службами
На данном этапе вам нужно создать скрипт (script.sh
), который будет запускать системную службу и отображать диалоговое окно с кнопкой «Quit».
Пример скрипта:
#!/bin/bash
# Запуск службы пользователя
systemctl --user start uxplay.service
# Запуск YAD с меню Quit
yad --title="UXPlay" --button="Quit:1"
# Остановка службы
systemctl --user stop uxplay.service
Не забудьте установить права на выполнение для вашего скрипта:
chmod +x /path/to/script.sh
3. Настройка системной службы
Теперь вам необходимо создать файл службы для uxplay
, который будет управлять зависимостями и открывать нужные порты. Создайте файл службы:
# /etc/systemd/user/uxplay.service
[Unit]
Description=UXPlay Service
Requires=avahi-daemon.service
After=avahi-daemon.service
[Service]
ExecStart=/usr/bin/uxplay -p
ExecStop=/usr/bin/killall uxplay
Restart=always
PartOf=avahi-daemon.service
[Install]
WantedBy=default.target
4. Работа с Avahi
Avahi
является реализацией DNS-SD, и её нужно запустить как службу. Обязательно установите и активируйте Avahi
с помощью следующей команды:
systemctl --user enable avahi-daemon.service
systemctl --user start avahi-daemon.service
5. Открытие портов
Ваша задача по открытию портов может потребовать специальных прав, что означает, что вы можете использовать PolicyKit для получения привилегий при запуске службы. Однако, запуск непосредственно в пользовательском пространстве имеет свои ограничения. Рассмотрите возможность предварительной настройки iptables с правами суперпользователя или использования firewalld
. Это необходимо сделать один раз, а не в каждой сессии:
sudo iptables -A INPUT -p tcp --dport YOUR_PORT -j ACCEPT
6. Завершение работы программы
Когда служба uxplay
останавливается, avahi
автоматически останавливается из-за директивы PartOf
. Убедитесь, что все необходимые порты закрываются при завершении работы:
ExecStopPost=/usr/bin/iptables -D INPUT -p tcp --dport YOUR_PORT -j ACCEPT
Заключение
Эта архитектура позволит вам успешно интегрировать и управлять uxplay
и зависимостями от avahi
, а также открывать и закрывать порты, необходимые для корректной работы. С помощью такого решения вы сможете эффективно использовать службы и соглашения для упрощения взаимодействия с системой.
Если у вас есть дополнительные вопросы или потребности в настройке, не стесняйтесь обращаться за помощью!