diff --git a/actions/i2p b/actions/i2p index e120bc96b..5ac069fd1 100755 --- a/actions/i2p +++ b/actions/i2p @@ -44,10 +44,11 @@ def parse_arguments(): subparser.add_argument('--name', help='Name of the entry', required=True) subparser.add_argument('--url', help='URL of the entry', required=True) - subparser = subparsers.add_parser( - 'set-tunnel-property', help='Modify configuration of a tunnel') + subparser = subparsers.add_parser('set-tunnel-property', + help='Modify configuration of a tunnel') subparser.add_argument('--name', help='Name of the tunnel', required=True) - subparser.add_argument('--property', help='Property to modify', required=True) + subparser.add_argument('--property', help='Property to modify', + required=True) subparser.add_argument('--value', help='Value to assign', required=True) subparsers.required = True @@ -67,10 +68,7 @@ def subcommand_disable(_): def subcommand_set_tunnel_property(arguments): - """ - Modifies the configuration for a certain tunnel - """ - + """Modify the configuration file for a certain tunnel.""" editor = TunnelEditor() editor \ .read_conf() \ @@ -79,9 +77,7 @@ def subcommand_set_tunnel_property(arguments): .write_conf() print('Updated "{property}" of {filename} to {value}'.format( property=editor.calc_prop_path(arguments.property), - filename=editor.conf_filename, - value=arguments.value - )) + filename=editor.conf_filename, value=arguments.value)) def subcommand_add_favorite(arguments): diff --git a/plinth/modules/i2p/__init__.py b/plinth/modules/i2p/__init__.py index 0765c8870..d9b6435f4 100644 --- a/plinth/modules/i2p/__init__.py +++ b/plinth/modules/i2p/__init__.py @@ -24,6 +24,7 @@ from plinth import action_utils, actions, frontpage from plinth import service as service_module from plinth.menu import main_menu from plinth.modules.users import register_group + from .manifest import backup, clients version = 1 @@ -70,9 +71,7 @@ tunnels_to_manage = { 'Irc2P': 'i2p_irc-freedombox' } -service_ports = [ - 'http', 'https' - ] + list(tunnels_to_manage.values()) +service_ports = ['http', 'https'] + list(tunnels_to_manage.values()) def init(): @@ -84,10 +83,10 @@ def init(): global service setup_helper = globals()['setup_helper'] if setup_helper.get_state() != 'needs-setup': - service = service_module.Service(managed_services[0], name, ports=service_ports, - is_external=True, is_enabled=is_enabled, enable=enable, - disable=disable, - is_running=is_running) + service = service_module.Service( + managed_services[0], name, ports=service_ports, is_external=True, + is_enabled=is_enabled, enable=enable, disable=disable, + is_running=is_running) if is_enabled(): add_shortcut() @@ -108,21 +107,19 @@ def setup(helper, old_version=None): ]) # Tunnels to all interfaces - for tunnel in tunnels_to_manage.keys(): + for tunnel in tunnels_to_manage: helper.call('post', actions.superuser_run, 'i2p', [ - 'set-tunnel-property', - '--name', tunnel, - '--property', 'interface', + 'set-tunnel-property', '--name', tunnel, '--property', 'interface', '--value', '0.0.0.0' ]) helper.call('post', disable) helper.call('post', enable) global service if service is None: - service = service_module.Service(managed_services[0], name, ports=service_ports, - is_external=True, is_enabled=is_enabled, enable=enable, - disable=disable, - is_running=is_running) + service = service_module.Service( + managed_services[0], name, ports=service_ports, is_external=True, + is_enabled=is_enabled, enable=enable, disable=disable, + is_running=is_running) helper.call('post', service.notify_enabled, None, True) helper.call('post', add_shortcut) diff --git a/plinth/modules/i2p/helpers.py b/plinth/modules/i2p/helpers.py index 48703fae7..ac052e2cb 100644 --- a/plinth/modules/i2p/helpers.py +++ b/plinth/modules/i2p/helpers.py @@ -13,6 +13,10 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # +""" +Various helpers for the I2P app. +""" + import os import re @@ -23,10 +27,11 @@ FILE_TUNNEL_CONF = os.path.join(I2P_CONF_DIR, 'i2ptunnel.config') TUNNEL_IDX_REGEX = re.compile(r'tunnel.(\d+).name$') -class TunnelEditor(object): - """ +class TunnelEditor(): + """Helper to edit I2P tunnel configuration file using augeas. :type aug: augeas.Augeas + """ def __init__(self, conf_filename=None, idx=None): @@ -36,62 +41,70 @@ class TunnelEditor(object): @property def lines(self): + """Return lines from configuration file.""" if self.aug: return self.aug.match('/files{}/*'.format(self.conf_filename)) - else: - return [] + + return [] def read_conf(self): - """Return an instance of Augeaus for processing APT configuration.""" - self.aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + - augeas.Augeas.NO_MODL_AUTOLOAD) + """Load an instance of Augeaus for processing APT configuration. + + Chainable method. + + """ + self.aug = augeas.Augeas( + flags=augeas.Augeas.NO_LOAD + augeas.Augeas.NO_MODL_AUTOLOAD) self.aug.set('/augeas/load/Properties/lens', 'Properties.lns') - self.aug.set('/augeas/load/Properties/incl[last() + 1]', self.conf_filename) + self.aug.set('/augeas/load/Properties/incl[last() + 1]', + self.conf_filename) self.aug.load() return self def write_conf(self): + """Write changes to the configuration file to disk. + + Chainable method. + + """ self.aug.save() return self def set_tunnel_idx(self, name): - - """ - Finds the index of the tunnel with the given name. + """Finds the index of the tunnel with the given name. Chainable method. :type name: basestring - """ + """ for prop in self.aug.match('/files{}/*'.format(self.conf_filename)): match = TUNNEL_IDX_REGEX.search(prop) - if match and self.aug.get(prop) == name: self.idx = int(match.group(1)) return self + raise ValueError('No tunnel called {}'.format(name)) def calc_prop_path(self, tunnel_prop): - """ - Calculates the property name as found in the properties files + """Calculates the property name as found in the properties files. + :type tunnel_prop: str :rtype: basestring + """ calced_prop_path = '/files{filepath}/tunnel.{idx}.{tunnel_prop}'.format( - idx=self.idx, tunnel_prop=tunnel_prop, - filepath=self.conf_filename - ) + idx=self.idx, tunnel_prop=tunnel_prop, filepath=self.conf_filename) return calced_prop_path def set_tunnel_prop(self, tunnel_prop, value): - """ - Updates a tunnel's property. + """Updates a tunnel's property. - The idx has to be set and the property has to exist in the config file and belong to the tunnel's properties. + The idx has to be set and the property has to exist in the config file + and belong to the tunnel's properties. - see calc_prop_path + See calc_prop_path. Chainable method. @@ -101,9 +114,11 @@ class TunnelEditor(object): :type value: basestring | int :return: :rtype: + """ if self.idx is None: - raise ValueError('Please init the tunnel index before calling this method') + raise ValueError( + 'Please init the tunnel index before calling this method') calc_prop_path = self.calc_prop_path(tunnel_prop) self.aug.set(calc_prop_path, value) @@ -113,6 +128,7 @@ class TunnelEditor(object): ret = self.aug.get(self.calc_prop_path(tunnel_prop)) if ret is None: raise KeyError('Unknown property {}'.format(tunnel_prop)) + return ret def __setitem__(self, tunnel_prop, value): diff --git a/plinth/modules/i2p/tests/__init__.py b/plinth/modules/i2p/tests/__init__.py index 019e3bfd7..e69de29bb 100644 --- a/plinth/modules/i2p/tests/__init__.py +++ b/plinth/modules/i2p/tests/__init__.py @@ -1,16 +0,0 @@ -# This file is part of FreedomBox. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -