deluge: Manage starting/stoping deluged

- run deluged daemon with default configuration location
- deluge-web: autoconnect to the deluged daemon
- functional tests: assert deluge-web is connected to the deluged daemon

Signed-off-by: Veiko Aasa <veiko17@disroot.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Veiko Aasa 2020-01-05 13:13:44 +02:00 committed by James Valleroy
parent 7d2c57bbf5
commit ff27f1d21b
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
4 changed files with 76 additions and 43 deletions

View File

@ -20,10 +20,18 @@ Configuration helper for BitTorrent web client.
"""
import argparse
import fileinput
import subprocess
import time
SYSTEMD_SERVICE_PATH = '/etc/systemd/system/deluge-web.service'
SYSTEMD_SERVICE = '''
import augeas
from plinth import action_utils
DELUGED_DEFAULT_FILE = '/etc/default/deluged'
DELUGE_WEB_CONFIG_FILE = '/var/lib/deluged/.config/deluge/web.conf'
DELUGE_WEB_SYSTEMD_SERVICE_PATH = '/etc/systemd/system/deluge-web.service'
DELUGE_WEB_SYSTEMD_SERVICE = '''
#
# This file is managed and overwritten by Plinth. If you wish to edit
# it, disable Deluge in Plinth, remove this file and manage it manually.
@ -69,12 +77,61 @@ def parse_arguments():
return parser.parse_args()
def _set_configuration(filename, parameter, value):
"""Set the configuration parameter."""
deluged_is_running = action_utils.service_is_running('deluged')
if deluged_is_running:
action_utils.service_stop('deluged')
deluge_web_is_running = action_utils.service_is_running('deluge-web')
if deluge_web_is_running:
action_utils.service_stop('deluge-web')
for line in fileinput.FileInput(filename, inplace=True):
if '"{0}"'.format(parameter) in line:
print(' "{0}": "{1}", '.format(parameter, value))
else:
print(line, end='')
if deluged_is_running:
action_utils.service_start('deluged')
if deluge_web_is_running:
action_utils.service_start('deluge-web')
def _set_deluged_daemon_options():
"""Set deluged daemon options."""
aug = augeas.Augeas(
flags=augeas.Augeas.NO_LOAD + augeas.Augeas.NO_MODL_AUTOLOAD)
aug.set('/augeas/load/Shellvars/lens', 'Shellvars.lns')
aug.set('/augeas/load/Shellvars/incl[last() + 1]', DELUGED_DEFAULT_FILE)
aug.load()
aug.set('/files' + DELUGED_DEFAULT_FILE + '/ENABLE_DELUGED', '1')
# overwrite daemon args, use default config directory (same as deluge-web)
aug.set('/files' + DELUGED_DEFAULT_FILE + '/DAEMON_ARGS',
'"-d -l /var/log/deluged/daemon.log -L info"')
aug.save()
def subcommand_setup(_):
"""Perform initial setup for deluge-web."""
with open(SYSTEMD_SERVICE_PATH, 'w') as file_handle:
file_handle.write(SYSTEMD_SERVICE)
"""Perform initial setup for deluge."""
with open(DELUGE_WEB_SYSTEMD_SERVICE_PATH, 'w') as file_handle:
file_handle.write(DELUGE_WEB_SYSTEMD_SERVICE)
_set_deluged_daemon_options()
subprocess.check_call(['systemctl', 'daemon-reload'])
# restarting deluge-web service stops also possible deluged process
# that was started from the web interface
action_utils.service_restart('deluge-web')
action_utils.service_restart('deluged')
# wait processes to start
time.sleep(5)
# configure deluge-web to autoconnect to the default deluged daemon, also
# restarts deluged and deluge-web services again to create config files
_set_configuration(DELUGE_WEB_CONFIG_FILE, 'default_daemon',
'127.0.0.1:58846')
def main():

View File

@ -346,22 +346,6 @@ def _deluge_open_connection_manager(browser):
eventually(lambda: _deluge_get_active_window_title(browser) == title)
def _deluge_ensure_daemon_started(browser):
"""Start the deluge daemon if it is not started."""
_deluge_open_connection_manager(browser)
browser.find_by_xpath(
'//em[contains(text(),"127.0.0.1:58846")]').first.click()
if browser.is_element_present_by_xpath('//button[text()="Stop Daemon"]'):
return
browser.find_by_xpath('//button[text()="Start Daemon"]').first.click()
assert eventually(browser.is_element_present_by_xpath,
args=['//button[text()="Stop Daemon"]'])
def _deluge_ensure_connected(browser):
"""Type the connection password if required and start Deluge daemon."""
_deluge_ensure_logged_in(browser)
@ -370,17 +354,6 @@ def _deluge_ensure_connected(browser):
if _deluge_get_active_window_title(browser) == 'Change Default Password':
_deluge_click_active_window_button(browser, 'No')
# If the add button is enabled, we are already connected
if not browser.is_element_present_by_css('#add.x-item-disabled'):
return
_deluge_ensure_daemon_started(browser)
if browser.is_element_present_by_xpath('//button[text()="Disconnect"]'):
_deluge_click_active_window_button(browser, 'Close')
else:
_deluge_click_active_window_button(browser, 'Connect')
assert eventually(browser.is_element_not_present_by_css,
args=['#add.x-item-disabled'])

View File

@ -30,9 +30,9 @@ from plinth.modules.users import register_group
from .manifest import backup, clients # noqa, pylint: disable=unused-import
version = 4
version = 5
managed_services = ['deluge-web']
managed_services = ['deluged', 'deluge-web']
managed_packages = ['deluged', 'deluge-web']
@ -71,11 +71,10 @@ class DelugeApp(app_module.App):
'deluge:index', parent_url_name='apps')
self.add(menu_item)
shortcut = frontpage.Shortcut('shortcut-deluge', name,
short_description=short_description,
url='/deluge', icon=icon_filename,
clients=clients, login_required=True,
allowed_groups=[group[0]])
shortcut = frontpage.Shortcut(
'shortcut-deluge', name, short_description=short_description,
url='/deluge', icon=icon_filename, clients=clients,
login_required=True, allowed_groups=[group[0]])
self.add(shortcut)
firewall = Firewall('firewall-deluge', name, ports=['http', 'https'],
@ -86,10 +85,14 @@ class DelugeApp(app_module.App):
urls=['https://{host}/deluge'])
self.add(webserver)
daemon = Daemon('daemon-deluge', managed_services[0],
listen_ports=[(8112, 'tcp4')])
daemon = Daemon('daemon-deluged', managed_services[0],
listen_ports=[(58846, 'tcp4')])
self.add(daemon)
daemon_web = Daemon('daemon-deluge-web', managed_services[1],
listen_ports=[(8112, 'tcp4')])
self.add(daemon_web)
def init():
"""Initialize the Deluge module."""

View File

@ -31,7 +31,7 @@ clients = validate([{
backup = validate_backup({
'config': {
'directories': ['/var/lib/deluged/.config', '/var/lib/deluged/config']
'directories': ['/var/lib/deluged/.config']
},
'services': ['deluge-web']
'services': ['deluged', 'deluge-web']
})