Орchestrирующий одиночные услуги, зависимые услуги, файловые документы и порты как пользователь

Вопрос или проблема

Я не уверен, как это назвать, но в основном я ищу совет о том, как лучше всего реализовать следующее. Специфику я могу найти в интернете, но не знаю, как это всё соединить.

Я пытаюсь написать файл .desktop, который будет вызывать команду uxplay (сервер зеркалирования AirPlay на Unix) и размещать значок в системном трей с пунктом меню Выйти. uxplay требует, чтобы несколько портов были открыты, кроме того, ему нужен “DNS-SD сервер”. Я не знаком с этим термином, но, похоже, что-то вроде avahi — это то, что мне нужно.

Итак, в целом, вот что я представляю:

  1. Запустить файл с рабочего стола через Krunner или Rofi.
  2. В Exec файла .desktop вызывается скрипт, который делает две вещи:
    • Запускает службу пользователя systemd.
    • Запускает yad (Yet Another Dialogue) с пунктом меню Выйти, который затем останавливает эту службу пользователя.
  3. Require и After службы пользователя запустят службу avahi.
  4. Служба пользователя затем как-то откроет необходимые порты, возможно, в своём ExecStart. В этой части я не уверен, потому что, думаю, это потребует root, может быть, можно как-то использовать policy kit, чтобы отобразить этот диалог на рабочем столе, который предоставляет привилегии?
  5. 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, а также открывать и закрывать порты, необходимые для корректной работы. С помощью такого решения вы сможете эффективно использовать службы и соглашения для упрощения взаимодействия с системой.

Если у вас есть дополнительные вопросы или потребности в настройке, не стесняйтесь обращаться за помощью!

Оцените материал
Добавить комментарий

Капча загружается...