diff --git a/actions/deluge b/actions/deluge index c35750d05..e27afcb07 100755 --- a/actions/deluge +++ b/actions/deluge @@ -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(): diff --git a/functional_tests/support/site.py b/functional_tests/support/site.py index dbdca1810..d0d744583 100644 --- a/functional_tests/support/site.py +++ b/functional_tests/support/site.py @@ -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']) diff --git a/plinth/modules/deluge/__init__.py b/plinth/modules/deluge/__init__.py index 59c8f6e4c..320e46c0d 100644 --- a/plinth/modules/deluge/__init__.py +++ b/plinth/modules/deluge/__init__.py @@ -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.""" diff --git a/plinth/modules/deluge/manifest.py b/plinth/modules/deluge/manifest.py index 2adfadc1f..28857e553 100644 --- a/plinth/modules/deluge/manifest.py +++ b/plinth/modules/deluge/manifest.py @@ -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'] })