diagnostics: Use new component based API for all diagnostic tests

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
This commit is contained in:
Sunil Mohan Adapa 2019-12-12 00:00:35 -05:00 committed by James Valleroy
parent 1f14c42af5
commit 2ebb565c92
No known key found for this signature in database
GPG Key ID: 77C0C75E7B650808
43 changed files with 334 additions and 616 deletions

View File

@ -14,21 +14,6 @@ are loaded. The ``init()`` call order guarantees that other applications that
this application depends on will be initialized before this application is
initialized.
<app-module>.diagnose()
^^^^^^^^^^^^^^^^^^^^^^^
Optional. Called when the user invokes system-wide diagnostics by visiting
**System -> Diagnositcs**. This method must return an array of diagnostic
results. Each diagnostic result must be a two-tuple with first element as a
string that is shown to the user as name of the test and second element is the
result of the test. It must be one of ``passed``, ``failed``, ``error``. Example
return value:
.. code-block:: python3
[('Check http://localhost/app is reachable', 'passed'),
('Check configuration is sane', 'passed')]
<app-module>.depends
^^^^^^^^^^^^^^^^^^^^

View File

@ -102,57 +102,38 @@ daemons should be stopped during the backup process. In ``__init__.py``, add:
Creating diagnostics
^^^^^^^^^^^^^^^^^^^^
When the app does not work as expected, the user should known what is happening
with the app. The FreedomBox framework provides an API for running and showing
diagnostics results. The app has to implement a method for actually running the
diagnostics and return the results as a list. FreedomBox then takes care of
When the app does not work as expected, the user should know what is happening
with the app. FreedomBox framework provides an API for running and showing
diagnostics results. Most of the common diagnostic tests are implemented by the
framework as part of the components used by an app. FreedomBox takes care of
calling the diagnostics method and displaying the list in a formatted manner.
To implement the diagnostics, a method called ``diagnose()`` has to be available
as ``<app-module>.diagnose()``. It must return a list in which each item is the
result of a test performed. The item itself is a two-tuple containing the
display name of the test followed by the result as ``passed``, ``failed`` or
``error``.
To implement additional diagnostic tests on top of those provided by the
framework, the method :meth:`plinth.app.App.diagnose` has to be overridden or in
a component that belongs to the app, the method
:meth:`plinth.app.Component.diagnose` has to be overridden. The methods must
return a list in which each item is the result of a test performed. The item
itself is a two-tuple containing the display name of the test followed by the
result as ``passed``, ``failed`` or ``error``.
.. code-block:: python3
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(action_utils.diagnose_url_on_all(
'https://{host}/transmission', extra_options=['--no-check-certificate']))
return results
Now that we have implemented diagnostics, we also need to show a diagnostics
button in the App's page. Adding an attribute to the
:class:`~plinth.views.AppView` will take care of this.
.. code-block:: python3
class TransmissionView(views.AppView):
class TransmissionAppView(views.AppView):
...
diagnostics_module_name = 'transmission'
def diagnose():
"""Run diagnostics and return the results."""
results = super().diagnose()
There are several helpers available to implement some of the common diagnostic
tests. For our application we wish to implement a test to check whether the
``/transmission`` URL is accessible. Since this is a commonly performed test,
there is a helper method available and we have used it in the above code. The
``{host}`` tag replaced with various IP addresses, hostnames and domain names by
the helper to produce different kinds of URLs and they are all tested. Results
for all tests are returned which we then pass on to the framework.
results.append(['Example test', 'passed'])
return results
The user can trigger the diagnostics test by going to **System -> Diagnostics**
page. This runs diagnostics for all the applications. Users can also run
diagnostics specifically for this app from the app's page. A diagnostics button
is shown by the `app.html` template automatically when
``diagnostics_module_name`` attribute is set in the app's ``AppView`` derived
from :obj:`plinth.views.AppView`.
.. code-block:: django
{% include "diagnostics_button.html" with module="ttrss" enabled=True %}
diagnostics specifically for this app from the app's page. A diagnostics menu
item is shown by the :class:`plinth.views.AppView` and `app.html` template
automatically when ``diagnose()`` method is overridden in the app or a
component.
Logging
^^^^^^^

View File

@ -22,7 +22,7 @@ import re
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, menu
from plinth.daemon import Daemon
@ -102,7 +102,11 @@ class BindApp(app_module.App):
is_external=False)
self.add(firewall)
daemon = Daemon('daemon-bind', managed_services[0])
daemon = Daemon(
'daemon-bind', managed_services[0], listen_ports=[(53, 'tcp6'),
(53, 'udp6'),
(53, 'tcp4'),
(53, 'udp4')])
self.add(daemon)
@ -129,18 +133,6 @@ def force_upgrade(helper, _packages):
return True
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(53, 'tcp6'))
results.append(action_utils.diagnose_port_listening(53, 'udp6'))
results.append(action_utils.diagnose_port_listening(53, 'tcp4'))
results.append(action_utils.diagnose_port_listening(53, 'udp4'))
return results
def get_config():
"""Get current configuration"""
data = [line.strip() for line in open(CONFIG_FILE, 'r')]

View File

@ -21,7 +21,7 @@ FreedomBox app to configure Cockpit.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -93,7 +93,8 @@ class CockpitApp(app_module.App):
is_external=True)
self.add(firewall)
webserver = Webserver('webserver-cockpit', 'cockpit-freedombox')
webserver = Webserver('webserver-cockpit', 'cockpit-freedombox',
urls=['https://{host}/_cockpit/'])
self.add(webserver)
daemon = Daemon('daemon-cockpit', managed_services[0])
@ -122,17 +123,6 @@ def setup(helper, old_version=None):
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/_cockpit/',
check_certificate=False))
return results
def on_domain_added(sender, domain_type, name, description='', services=None,
**kwargs):
"""Handle addition of a new domain."""

View File

@ -20,7 +20,7 @@ Plinth module to configure coquelicot.
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
@ -79,7 +79,8 @@ class CoquelicotApp(app_module.App):
ports=['http', 'https'], is_external=True)
self.add(firewall)
webserver = Webserver('webserver-coquelicot', 'coquelicot-freedombox')
webserver = Webserver('webserver-coquelicot', 'coquelicot-freedombox',
urls=['https://{host}/coquelicot'])
self.add(webserver)
daemon = Daemon('daemon-coquelicot', managed_services[0])
@ -107,14 +108,3 @@ def get_current_max_file_size():
"""Get the current value of maximum file size."""
size = actions.superuser_run('coquelicot', ['get-max-file-size'])
return int(size.strip())
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/coquelicot',
check_certificate=False))
return results

View File

@ -63,6 +63,12 @@ class DateTimeApp(app_module.App):
daemon = Daemon('daemon-datetime', managed_services[0])
self.add(daemon)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
results.append(_diagnose_time_synchronized())
return results
def init():
"""Initialize the date/time module."""
@ -77,14 +83,6 @@ def setup(helper, old_version=None):
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(_diagnose_time_synchronized())
return results
def _diagnose_time_synchronized():
"""Check whether time is synchronized to NTP server."""
result = 'failed'

View File

@ -20,7 +20,7 @@ FreedomBox app to configure a Deluge web client.
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
@ -82,10 +82,12 @@ class DelugeApp(app_module.App):
is_external=True)
self.add(firewall)
webserver = Webserver('webserver-deluge', 'deluge-plinth')
webserver = Webserver('webserver-deluge', 'deluge-plinth',
urls=['https://{host}/deluge'])
self.add(webserver)
daemon = Daemon('daemon-deluge', managed_services[0])
daemon = Daemon('daemon-deluge', managed_services[0],
listen_ports=[(8112, 'tcp4')])
self.add(daemon)
@ -105,15 +107,3 @@ def setup(helper, old_version=None):
helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'deluge', ['setup'])
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(8112, 'tcp4'))
results.extend(
action_utils.diagnose_url_on_all('https://{host}/deluge',
check_certificate=False))
return results

View File

@ -55,20 +55,19 @@ class DiagnosticsApp(app_module.App):
'diagnostics:index', parent_url_name='system')
self.add(menu_item)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
results.append(action_utils.diagnose_port_listening(8000, 'tcp4'))
results.extend(
action_utils.diagnose_url_on_all('http://{host}/plinth/',
check_certificate=False))
return results
def init():
"""Initialize the module"""
global app
app = DiagnosticsApp()
app.set_enabled(True)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(8000, 'tcp4'))
results.extend(
action_utils.diagnose_url_on_all('http://{host}/plinth/',
check_certificate=False))
return results

View File

@ -19,6 +19,7 @@ FreedomBox app for running diagnostics.
"""
import collections
import importlib
import logging
import threading
@ -27,7 +28,7 @@ from django.template.response import TemplateResponse
from django.utils.translation import ugettext_lazy as _
from django.views.decorators.http import require_POST
from plinth import module_loader
from plinth.app import App
from plinth.modules import diagnostics
logger = logging.Logger(__name__)
@ -53,23 +54,18 @@ def index(request):
@require_POST
def module(request, module_name):
"""Return diagnostics for a particular module."""
def diagnose_app(request, app_id):
"""Return diagnostics for a particular app."""
try:
module = module_loader.loaded_modules[module_name]
app = App.get(app_id)
except KeyError:
raise Http404('Module does not exist or not loaded')
raise Http404('App does not exist')
results = []
if hasattr(module, 'diagnose'):
results = module.diagnose()
return TemplateResponse(
request, 'diagnostics_module.html', {
'title': _('Diagnostic Test'),
'module_name': module_name,
'results': results
})
return TemplateResponse(request, 'diagnostics_app.html', {
'title': _('Diagnostic Test'),
'app_id': app_id,
'results': app.diagnose()
})
def _start_task():
@ -99,29 +95,28 @@ def run_on_all_enabled_modules():
"""Run diagnostics on all the enabled modules and store the result."""
global current_results
current_results = {
'modules': [],
'apps': [],
'results': collections.OrderedDict(),
'progress_percentage': 0
}
modules = []
for module_name, module in module_loader.loaded_modules.items():
if not hasattr(module, 'diagnose'):
continue
# Don't run setup on modules have not been setup yet.
# However, run on modules that need an upgrade.
apps = []
for app in App.list():
# XXX: Implement more cleanly.
# Don't run diagnostics on apps have not been setup yet.
# However, run on apps that need an upgrade.
module = importlib.import_module(app.__class__.__module__)
if module.setup_helper.get_state() == 'needs-setup':
continue
if not module.app.is_enabled():
if not app.is_enabled():
continue
modules.append((module_name, module))
current_results['results'][module_name] = None
apps.append((app.app_id, app))
current_results['results'][app.app_id] = None
current_results['modules'] = modules
for current_index, (module_name, module) in enumerate(modules):
current_results['results'][module_name] = module.diagnose()
current_results['apps'] = apps
for current_index, (app_id, app) in enumerate(apps):
current_results['results'][app_id] = app.diagnose()
current_results['progress_percentage'] = \
int((current_index + 1) * 100 / len(modules))
int((current_index + 1) * 100 / len(apps))

View File

@ -63,11 +63,11 @@
{{ results.error }}
</div>
{% else %}
{% for module, module_results in results.results.items %}
<h4>{% blocktrans %}Module: {{ module }}{% endblocktrans %}</h4>
{% for app_id, app_results in results.results.items %}
<h4>{% blocktrans %}App: {{ app_id }}{% endblocktrans %}</h4>
{% if module_results %}
{% include "diagnostics_results.html" with results=module_results %}
{% if app_results %}
{% include "diagnostics_results.html" with results=app_results %}
{% else %}
<p><span class="fa fa-hourglass-o"></span></p>
{% endif %}

View File

@ -24,12 +24,12 @@
<h2>{% trans "Diagnostic Results" %}</h2>
<h3>{% blocktrans %}Module: {{ module_name }}{% endblocktrans %}</h3>
<h3>{% blocktrans %}App: {{ app_id }}{% endblocktrans %}</h3>
{% if results %}
{% include "diagnostics_results.html" with results=results %}
{% else %}
<p>{% trans "This module does not support diagnostics" %}</p>
<p>{% trans "This app does not support diagnostics" %}</p>
{% endif %}
{% endblock %}

View File

@ -20,7 +20,7 @@
{% load i18n %}
<form class="form form-diagnostics-button" method="post"
action="{% url 'diagnostics:module' module %}">
action="{% url 'diagnostics:app' app_id %}">
{% csrf_token %}
{% if enabled %}

View File

@ -24,6 +24,6 @@ from . import diagnostics as views
urlpatterns = [
url(r'^sys/diagnostics/$', views.index, name='index'),
url(r'^sys/diagnostics/(?P<module_name>[1-9a-z\-]+)/$', views.module,
name='module'),
url(r'^sys/diagnostics/(?P<app_id>[1-9a-z\-]+)/$', views.diagnose_app,
name='app'),
]

View File

@ -105,6 +105,23 @@ class DiasporaApp(app_module.App):
daemon = Daemon('daemon-diaspora', managed_services[0])
self.add(daemon)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
results.append(
action_utils.diagnose_url('http://diaspora.localhost', kind='4',
check_certificate=False))
results.append(
action_utils.diagnose_url('http://diaspora.localhost', kind='6',
check_certificate=False))
results.append(
action_utils.diagnose_url(
'http://diaspora.{}'.format(get_configured_domain_name()),
kind='4', check_certificate=False))
return results
class Shortcut(frontpage.Shortcut):
"""Frontpage shortcut to use configured domain name for URL."""
@ -155,24 +172,6 @@ def disable_user_registrations():
actions.superuser_run('diaspora', ['disable-user-registrations'])
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(
action_utils.diagnose_url('http://diaspora.localhost', kind='4',
check_certificate=False))
results.append(
action_utils.diagnose_url('http://diaspora.localhost', kind='6',
check_certificate=False))
results.append(
action_utils.diagnose_url(
'http://diaspora.{}'.format(get_configured_domain_name()),
kind='4', check_certificate=False))
return results
def generate_apache_configuration(conf_file, domain_name):
"""Generate Diaspora's apache configuration with the given domain name"""
open(conf_file, 'w').close()

View File

@ -25,7 +25,7 @@ import pathlib
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -108,7 +108,8 @@ class EjabberdApp(app_module.App):
'xmpp-bosh'], is_external=True)
self.add(firewall)
webserver = Webserver('webserver-ejabberd', 'jwchat-plinth')
webserver = Webserver('webserver-ejabberd', 'jwchat-plinth',
urls=['http://{host}/bosh/'])
self.add(webserver)
letsencrypt = LetsEncrypt(
@ -120,7 +121,10 @@ class EjabberdApp(app_module.App):
managing_app='ejabberd')
self.add(letsencrypt)
daemon = Daemon('daemon-ejabberd', managed_services[0])
daemon = Daemon(
'daemon-ejabberd', managed_services[0],
listen_ports=[(5222, 'tcp4'), (5222, 'tcp6'), (5269, 'tcp4'),
(5269, 'tcp6'), (5443, 'tcp4'), (5443, 'tcp6')])
self.add(daemon)
@ -214,18 +218,3 @@ def on_domain_added(sender, domain_type, name, description='', services=None,
if name not in conf['domains']:
actions.superuser_run('ejabberd', ['add-domain', '--domainname', name])
app.get_component('letsencrypt-ejabberd').setup_certificates()
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(5222, 'tcp4'))
results.append(action_utils.diagnose_port_listening(5222, 'tcp6'))
results.append(action_utils.diagnose_port_listening(5269, 'tcp4'))
results.append(action_utils.diagnose_port_listening(5269, 'tcp6'))
results.append(action_utils.diagnose_port_listening(5443, 'tcp4'))
results.append(action_utils.diagnose_port_listening(5443, 'tcp6'))
results.extend(action_utils.diagnose_url_on_all('http://{host}/bosh/'))
return results

View File

@ -23,7 +23,7 @@ import os
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.errors import ActionError
@ -32,7 +32,8 @@ from plinth.modules.firewall.components import Firewall
from plinth.modules.users import register_group
from .forms import is_repo_url
from .manifest import GIT_REPO_PATH, backup, clients # noqa, pylint: disable=unused-import
from .manifest import (GIT_REPO_PATH, # noqa, pylint: disable=unused-import
backup, clients)
clients = clients
@ -89,7 +90,8 @@ class GitwebApp(app_module.App):
is_external=True)
self.add(firewall)
webserver = Webserver('webserver-gitweb', 'gitweb-freedombox')
webserver = Webserver('webserver-gitweb', 'gitweb-freedombox',
urls=['https://{host}/gitweb/'])
self.add(webserver)
self.auth_webserver = GitwebWebserverAuth('webserver-gitweb-auth',
@ -191,16 +193,6 @@ def setup(helper, old_version=None):
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/gitweb/',
check_certificate=False))
return results
def restore_post(packet):
"""Update access after restoration of backups."""
app.update_service_access()

View File

@ -20,7 +20,7 @@ FreedomBox app to configure I2P.
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
@ -105,10 +105,12 @@ class I2PApp(app_module.App):
is_external=False)
self.add(firewall)
webserver = Webserver('webserver-i2p', 'i2p-freedombox')
webserver = Webserver('webserver-i2p', 'i2p-freedombox',
urls=['https://{host}/i2p/'])
self.add(webserver)
daemon = Daemon('daemon-i2p', managed_services[0])
daemon = Daemon('daemon-i2p', managed_services[0],
listen_ports=[(7657, 'tcp6')])
self.add(daemon)
@ -152,15 +154,3 @@ def setup(helper, old_version=None):
'--value', '0.0.0.0'
])
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(7657, 'tcp6'))
results.extend(
action_utils.diagnose_url_on_all('https://{host}/i2p/',
check_certificate=False))
return results

View File

@ -21,7 +21,7 @@ FreedomBox app to configure ikiwiki.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.modules.apache.components import Webserver
@ -85,7 +85,8 @@ class IkiwikiApp(app_module.App):
is_external=True)
self.add(firewall)
webserver = Webserver('webserver-ikiwiki', 'ikiwiki-plinth')
webserver = Webserver('webserver-ikiwiki', 'ikiwiki-plinth',
urls=['https://{host}/ikiwiki'])
self.add(webserver)
def add_shortcut(self, site, title):
@ -129,14 +130,3 @@ def setup(helper, old_version=None):
helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'ikiwiki', ['setup'])
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/ikiwiki',
check_certificate=False))
return results

View File

@ -21,7 +21,7 @@ FreedomBox app for infinoted.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -85,7 +85,8 @@ class InfinotedApp(app_module.App):
ports=['infinoted-plinth'], is_external=True)
self.add(firewall)
daemon = Daemon('daemon-infinoted', managed_services[0])
daemon = Daemon('daemon-infinoted', managed_services[0],
listen_ports=[(6523, 'tcp4'), (6523, 'tcp6')])
self.add(daemon)
@ -114,13 +115,3 @@ def setup(helper, old_version=None):
helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'infinoted', ['setup'])
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(6523, 'tcp4'))
results.append(action_utils.diagnose_port_listening(6523, 'tcp6'))
return results

View File

@ -85,6 +85,17 @@ class LetsEncryptApp(app_module.App):
parent_url_name='system')
self.add(menu_item)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
for domain in names.components.DomainName.list():
if domain.domain_type.can_have_certificate:
results.append(
action_utils.diagnose_url('https://' + domain.name))
return results
def init():
"""Initialize the module."""
@ -106,17 +117,6 @@ def setup(helper, old_version=None):
['setup', '--old-version', str(old_version)])
def diagnose():
"""Run diagnostics and return the results."""
results = []
for domain in names.components.DomainName.list():
if domain.domain_type.can_have_certificate:
results.append(action_utils.diagnose_url('https://' + domain.name))
return results
def certificate_obtain(domain):
"""Obtain a certificate for a domain and notify handlers."""
actions.superuser_run('letsencrypt', ['obtain', '--domain', domain])

View File

@ -26,7 +26,7 @@ from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from ruamel.yaml.util import load_yaml_guess_indent
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
@ -104,7 +104,8 @@ class MatrixSynapseApp(app_module.App):
self.add(firewall)
webserver = Webserver('webserver-matrixsynapse',
'matrix-synapse-plinth')
'matrix-synapse-plinth',
urls=['https://{host}/_matrix/client/versions'])
self.add(webserver)
letsencrypt = LetsEncrypt(
@ -116,7 +117,8 @@ class MatrixSynapseApp(app_module.App):
managing_app='matrixsynapse')
self.add(letsencrypt)
daemon = Daemon('daemon-matrixsynapse', managed_services[0])
daemon = Daemon('daemon-matrixsynapse', managed_services[0],
listen_ports=[(8008, 'tcp4'), (8448, 'tcp4')])
self.add(daemon)
@ -152,19 +154,6 @@ def is_setup():
return os.path.exists(SERVER_NAME_PATH)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(8008, 'tcp4'))
results.append(action_utils.diagnose_port_listening(8448, 'tcp4'))
results.extend(
action_utils.diagnose_url_on_all(
'https://{host}/_matrix/client/versions', check_certificate=False))
return results
def get_domains():
"""Return a list of domains this app is interested in."""
domain = get_configured_domain_name()

View File

@ -20,7 +20,7 @@ FreedomBox app to configure MediaWiki.
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
@ -88,7 +88,8 @@ class MediaWikiApp(app_module.App):
ports=['http', 'https'], is_external=True)
self.add(firewall)
webserver = Webserver('webserver-mediawiki', 'mediawiki')
webserver = Webserver('webserver-mediawiki', 'mediawiki',
urls=['https://{host}/mediawiki'])
self.add(webserver)
webserver = Webserver('webserver-mediawiki-freedombox',
@ -125,16 +126,6 @@ def setup(helper, old_version=None):
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/mediawiki',
check_certificate=False))
return results
def is_public_registration_enabled():
"""Return whether public registration is enabled."""
output = actions.superuser_run('mediawiki',

View File

@ -22,7 +22,6 @@ import augeas
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -101,7 +100,8 @@ class MinetestApp(app_module.App):
ports=['minetest-plinth'], is_external=True)
self.add(firewall)
daemon = Daemon('daemon-minetest', managed_services[0])
daemon = Daemon('daemon-minetest', managed_services[0],
listen_ports=[(30000, 'udp4')])
self.add(daemon)
@ -121,15 +121,6 @@ def setup(helper, old_version=None):
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(30000, 'udp4'))
return results
def load_augeas():
"""Initialize Augeas."""
aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +

View File

@ -19,14 +19,12 @@ FreedomBox app to configure minidlna.
"""
from django.utils.translation import ugettext_lazy as _
from plinth import actions
import plinth.app as app_module
from plinth import frontpage, menu
from plinth import actions, frontpage, menu
from plinth.daemon import Daemon
from plinth.modules.apache.components import Webserver
from plinth.modules.firewall.components import Firewall
from plinth.modules.users import register_group
from plinth.action_utils import diagnose_url
from .manifest import backup, clients # noqa
@ -77,7 +75,8 @@ class MiniDLNAApp(app_module.App):
)
firewall = Firewall('firewall-minidlna', name, ports=['minidlna'],
is_external=False)
webserver = Webserver('webserver-minidlna', 'minidlna-freedombox')
webserver = Webserver('webserver-minidlna', 'minidlna-freedombox',
urls=['http://localhost:8200/'])
shortcut = frontpage.Shortcut(
'shortcut-minidlna',
name,
@ -113,11 +112,3 @@ def setup(helper, old_version=None):
helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'minidlna', ['setup'])
helper.call('post', app.enable)
def diagnose():
"""Check if the http page listening on 8200 is accessible"""
results = []
results.append(diagnose_url('http://localhost:8200/'))
return results

View File

@ -20,7 +20,7 @@ FreedomBox app for mldonkey.
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -91,10 +91,12 @@ class MLDonkeyApp(app_module.App):
is_external=True)
self.add(firewall)
webserver = Webserver('webserver-mldonkey', 'mldonkey-freedombox')
webserver = Webserver('webserver-mldonkey', 'mldonkey-freedombox',
urls=['https://{host}/mldonkey/'])
self.add(webserver)
daemon = Daemon('daemon-mldonkey', managed_services[0])
daemon = Daemon('daemon-mldonkey', managed_services[0],
listen_ports=[(4080, 'tcp4')])
self.add(daemon)
@ -114,15 +116,3 @@ def setup(helper, old_version=None):
helper.call('pre', actions.superuser_run, 'mldonkey', ['pre-install'])
helper.install(managed_packages)
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(4080, 'tcp4'))
results.extend(
action_utils.diagnose_url_on_all('https://{host}/mldonkey/',
check_certificate=False))
return results

View File

@ -21,7 +21,6 @@ FreedomBox app to configure Mumble server.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
@ -85,7 +84,10 @@ class MumbleApp(app_module.App):
is_external=True)
self.add(firewall)
daemon = Daemon('daemon-mumble', managed_services[0])
daemon = Daemon(
'daemon-mumble', managed_services[0],
listen_ports=[(64738, 'tcp4'), (64738, 'tcp6'), (64738, 'udp4'),
(64738, 'udp6')])
self.add(daemon)
@ -103,15 +105,3 @@ def setup(helper, old_version=None):
"""Install and configure the module."""
helper.install(managed_packages)
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(64738, 'tcp4'))
results.append(action_utils.diagnose_port_listening(64738, 'tcp6'))
results.append(action_utils.diagnose_port_listening(64738, 'udp4'))
results.append(action_utils.diagnose_port_listening(64738, 'udp6'))
return results

View File

@ -61,6 +61,24 @@ class NetworksApp(app_module.App):
'networks:index', parent_url_name='system')
self.add(menu_item)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
interfaces = _get_shared_interfaces()
addresses = _get_interface_addresses(interfaces)
for address in addresses:
results.append(
action_utils.diagnose_port_listening(53, 'tcp', address))
results.append(
action_utils.diagnose_port_listening(53, 'udp', address))
results.append(_diagnose_dnssec('4'))
results.append(_diagnose_dnssec('6'))
return results
def init():
"""Initialize the Networks module."""
@ -76,25 +94,6 @@ def setup(helper, old_version=None):
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
interfaces = _get_shared_interfaces()
addresses = _get_interface_addresses(interfaces)
for address in addresses:
results.append(action_utils.diagnose_port_listening(
53, 'tcp', address))
results.append(action_utils.diagnose_port_listening(
53, 'udp', address))
results.append(_diagnose_dnssec('4'))
results.append(_diagnose_dnssec('6'))
return results
def _get_shared_interfaces():
"""Get active network interfaces in shared mode."""
shared_interfaces = []

View File

@ -21,7 +21,7 @@ FreedomBox app to configure OpenVPN server.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -89,7 +89,8 @@ class OpenVPNApp(app_module.App):
is_external=True)
self.add(firewall)
daemon = Daemon('daemon-openvpn', managed_services[0])
daemon = Daemon('daemon-openvpn', managed_services[0],
listen_ports=[(1194, 'udp4')])
self.add(daemon)
@ -115,8 +116,3 @@ def setup(helper, old_version=None):
def is_setup():
"""Return whether the service is running."""
return actions.superuser_run('openvpn', ['is-setup']).strip() == 'true'
def diagnose():
"""Run diagnostics and return the results."""
return [action_utils.diagnose_port_listening(1194, 'udp4')]

View File

@ -90,9 +90,17 @@ class PrivoxyApp(app_module.App):
is_external=False)
self.add(firewall)
daemon = Daemon('daemon-privoxy', managed_services[0])
daemon = Daemon('daemon-privoxy', managed_services[0],
listen_ports=[(8118, 'tcp4'), (8118, 'tcp6')])
self.add(daemon)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
results.append(action_utils.diagnose_url('https://www.debian.org'))
results.extend(diagnose_url_with_proxy())
return results
def init():
"""Initialize the module."""
@ -120,18 +128,6 @@ class PrivoxyAppView(AppView):
icon_filename = icon_filename
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(8118, 'tcp4'))
results.append(action_utils.diagnose_port_listening(8118, 'tcp6'))
results.append(action_utils.diagnose_url('https://www.debian.org'))
results.extend(diagnose_url_with_proxy())
return results
def diagnose_url_with_proxy():
"""Run a diagnostic on a URL with a proxy."""
url = 'https://debian.org/' # Gives a simple redirect to www.

View File

@ -23,7 +23,7 @@ import pathlib
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -108,7 +108,8 @@ class QuasselApp(app_module.App):
managing_app='quassel')
self.add(letsencrypt)
daemon = Daemon('daemon-quassel', managed_services[0])
daemon = Daemon('daemon-quassel', managed_services[0],
listen_ports=[(4242, 'tcp4'), (4242, 'tcp6')])
self.add(daemon)
@ -129,16 +130,6 @@ def setup(helper, old_version=None):
app.get_component('letsencrypt-quassel').setup_certificates()
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(4242, 'tcp4'))
results.append(action_utils.diagnose_port_listening(4242, 'tcp6'))
return results
def get_available_domains():
"""Return an iterator with all domains able to have a certificate."""
return (domain.name for domain in names.components.DomainName.list()

View File

@ -26,7 +26,7 @@ import augeas
from apt.cache import Cache
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -98,7 +98,8 @@ class RadicaleApp(app_module.App):
is_external=True)
self.add(firewall)
webserver = RadicaleWebserver('webserver-radicale', None)
webserver = RadicaleWebserver('webserver-radicale', None,
urls=['https://{host}/radicale'])
self.add(webserver)
uwsgi = RadicaleUwsgi('uwsgi-radicale', 'radicale')
@ -271,14 +272,3 @@ def get_rights_value():
value = 'owner_only'
return value
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/radicale',
check_certificate=False))
return results

View File

@ -21,7 +21,7 @@ FreedomBox app for repro.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
@ -98,7 +98,13 @@ class ReproApp(app_module.App):
webserver = Webserver('webserver-repro', 'repro-plinth')
self.add(webserver)
daemon = Daemon('daemon-repro', managed_services[0])
daemon = Daemon(
'daemon-repro', managed_services[0], listen_ports=[(5060, 'udp4'),
(5060, 'udp6'),
(5060, 'tcp4'),
(5060, 'tcp6'),
(5061, 'tcp4'),
(5061, 'tcp6')])
self.add(daemon)
@ -127,17 +133,3 @@ def setup(helper, old_version=None):
helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'repro', ['setup'])
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(5060, 'udp4'))
results.append(action_utils.diagnose_port_listening(5060, 'udp6'))
results.append(action_utils.diagnose_port_listening(5060, 'tcp4'))
results.append(action_utils.diagnose_port_listening(5060, 'tcp6'))
results.append(action_utils.diagnose_port_listening(5061, 'tcp4'))
results.append(action_utils.diagnose_port_listening(5061, 'tcp6'))
return results

View File

@ -20,7 +20,7 @@ FreedomBox app to configure Roundcube.
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.modules.apache.components import Webserver
@ -88,7 +88,8 @@ class RoundcubeApp(app_module.App):
ports=['http', 'https'], is_external=True)
self.add(firewall)
webserver = Webserver('webserver-roundcube', 'roundcube')
webserver = Webserver('webserver-roundcube', 'roundcube',
urls=['https://{host}/roundcube'])
self.add(webserver)
@ -108,14 +109,3 @@ def setup(helper, old_version=None):
helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'roundcube', ['setup'])
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/roundcube',
check_certificate=False))
return results

View File

@ -27,12 +27,12 @@ import socket
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
from plinth.modules.users import register_group
from plinth.modules.firewall.components import Firewall
from plinth.modules.users import register_group
from plinth.utils import format_lazy
from .manifest import backup, clients # noqa, pylint: disable=unused-import
@ -94,10 +94,16 @@ class SambaApp(app_module.App):
firewall = Firewall('firewall-samba', name, ports=['samba'])
self.add(firewall)
daemon = Daemon('daemon-samba', managed_services[0])
daemon = Daemon(
'daemon-samba', managed_services[0], listen_ports=[(139, 'tcp4'),
(139, 'tcp6'),
(445, 'tcp4'),
(445, 'tcp6')])
self.add(daemon)
daemon_nmbd = Daemon('daemon-samba-nmbd', managed_services[1])
daemon_nmbd = Daemon('daemon-samba-nmbd', managed_services[1],
listen_ports=[(137, 'udp4'), (138, 'udp4')])
self.add(daemon_nmbd)
@ -119,20 +125,6 @@ def setup(helper, old_version=None):
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(137, 'udp4'))
results.append(action_utils.diagnose_port_listening(138, 'udp4'))
results.append(action_utils.diagnose_port_listening(139, 'tcp4'))
results.append(action_utils.diagnose_port_listening(139, 'tcp6'))
results.append(action_utils.diagnose_port_listening(445, 'tcp4'))
results.append(action_utils.diagnose_port_listening(445, 'tcp6'))
return results
def add_share(mount_point, share_type, filesystem):
"""Add a share."""
command = [

View File

@ -22,14 +22,15 @@ import os
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.modules.apache.components import Uwsgi, Webserver
from plinth.modules.firewall.components import Firewall
from plinth.modules.users import register_group
from .manifest import PUBLIC_ACCESS_SETTING_FILE, backup, clients # noqa, pylint: disable=unused-import
from .manifest import (PUBLIC_ACCESS_SETTING_FILE, # noqa, pylint: disable=unused-import
backup, clients)
clients = clients
@ -80,7 +81,8 @@ class SearxApp(app_module.App):
is_external=True)
self.add(firewall)
webserver = Webserver('webserver-searx', 'searx-freedombox')
webserver = Webserver('webserver-searx', 'searx-freedombox',
urls=['https://{host}/searx/'])
self.add(webserver)
webserver = SearxWebserverAuth('webserver-searx-auth',
@ -142,17 +144,6 @@ def is_public_access_enabled():
return os.path.exists(PUBLIC_ACCESS_SETTING_FILE)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/searx/',
check_certificate=False))
return results
def enable_public_access():
"""Allow Searx app to be accessed by anyone with access."""
actions.superuser_run('searx', ['enable-public-access'])

View File

@ -21,7 +21,7 @@ FreedomBox app to configure Shadowsocks.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -86,7 +86,8 @@ class ShadowsocksApp(app_module.App):
is_external=False)
self.add(firewall)
daemon = Daemon('daemon-shadowsocks', managed_services[0])
daemon = Daemon('daemon-shadowsocks', managed_services[0],
listen_ports=[(1080, 'tcp4'), (1080, 'tcp6')])
self.add(daemon)
@ -105,13 +106,3 @@ def setup(helper, old_version=None):
helper.install(managed_packages)
helper.call('post', actions.superuser_run, 'shadowsocks', ['setup'])
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(1080, 'tcp4'))
results.append(action_utils.diagnose_port_listening(1080, 'tcp6'))
return results

View File

@ -20,7 +20,7 @@ FreedomBox app to configure Syncthing.
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -95,7 +95,8 @@ class SyncthingApp(app_module.App):
ports=['syncthing'], is_external=True)
self.add(firewall)
webserver = Webserver('webserver-syncthing', 'syncthing-plinth')
webserver = Webserver('webserver-syncthing', 'syncthing-plinth',
urls=['https://{host}/syncthing/'])
self.add(webserver)
daemon = Daemon('daemon-syncthing', managed_services[0])
@ -122,14 +123,3 @@ def setup(helper, old_version=None):
if old_version == 1 and app.is_enabled():
app.get_component('firewall-syncthing-ports').enable()
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/syncthing/',
check_certificate=False))
return results

View File

@ -92,6 +92,20 @@ class TahoeApp(app_module.App):
daemon = Daemon('daemon-tahoe', managed_services[0])
self.add(daemon)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
results.extend([
action_utils.diagnose_url('http://localhost:5678', kind='4',
check_certificate=False),
action_utils.diagnose_url('http://localhost:5678', kind='6',
check_certificate=False),
action_utils.diagnose_url(
'http://{}:5678'.format(get_configured_domain_name()),
kind='4', check_certificate=False)
])
return results
class Shortcut(frontpage.Shortcut):
"""Frontpage shortcut to use configured domain name for URL."""
@ -157,19 +171,6 @@ def post_setup(configured_domain_name):
app.enable()
def diagnose():
"""Run diagnostics and return the results."""
return [
action_utils.diagnose_url('http://localhost:5678', kind='4',
check_certificate=False),
action_utils.diagnose_url('http://localhost:5678', kind='6',
check_certificate=False),
action_utils.diagnose_url(
'http://{}:5678'.format(get_configured_domain_name()), kind='4',
check_certificate=False)
]
def add_introducer(introducer):
"""Add an introducer to the storage node's list of introducers.
Param introducer must be a tuple of (pet_name, furl)

View File

@ -92,9 +92,65 @@ class TorApp(app_module.App):
'tor-obfs4'], is_external=True)
self.add(firewall)
daemon = Daemon('daemon-tor', managed_services[0], strict_check=True)
daemon = Daemon(
'daemon-tor', managed_services[0], strict_check=True,
listen_ports=[(9050, 'tcp4'), (9050, 'tcp6'), (9040, 'tcp4'),
(9040, 'tcp6'), (9053, 'udp4'), (9053, 'udp6')])
self.add(daemon)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
results.extend(_diagnose_control_port())
output = actions.superuser_run('tor', ['get-status'])
ports = json.loads(output)['ports']
results.append([
_('Tor relay port available'),
'passed' if 'orport' in ports else 'failed'
])
if 'orport' in ports:
results.append(
action_utils.diagnose_port_listening(int(ports['orport']),
'tcp4'))
results.append(
action_utils.diagnose_port_listening(int(ports['orport']),
'tcp6'))
results.append([
_('Obfs3 transport registered'),
'passed' if 'obfs3' in ports else 'failed'
])
if 'obfs3' in ports:
results.append(
action_utils.diagnose_port_listening(int(ports['obfs3']),
'tcp4'))
results.append(
action_utils.diagnose_port_listening(int(ports['obfs3']),
'tcp6'))
results.append([
_('Obfs4 transport registered'),
'passed' if 'obfs4' in ports else 'failed'
])
if 'obfs4' in ports:
results.append(
action_utils.diagnose_port_listening(int(ports['obfs4']),
'tcp4'))
results.append(
action_utils.diagnose_port_listening(int(ports['obfs4']),
'tcp6'))
results.append(_diagnose_url_via_tor('http://www.debian.org', '4'))
results.append(_diagnose_url_via_tor('http://www.debian.org', '6'))
results.append(_diagnose_tor_use('https://check.torproject.org', '4'))
results.append(_diagnose_tor_use('https://check.torproject.org', '6'))
return results
def init():
"""Initialize the module."""
@ -148,60 +204,6 @@ def update_hidden_service_domain(status=None):
name=status['hs_hostname'], services=services)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(9050, 'tcp4'))
results.append(action_utils.diagnose_port_listening(9050, 'tcp6'))
results.append(action_utils.diagnose_port_listening(9040, 'tcp4'))
results.append(action_utils.diagnose_port_listening(9040, 'tcp6'))
results.append(action_utils.diagnose_port_listening(9053, 'udp4'))
results.append(action_utils.diagnose_port_listening(9053, 'udp6'))
results.extend(_diagnose_control_port())
output = actions.superuser_run('tor', ['get-status'])
ports = json.loads(output)['ports']
results.append([
_('Tor relay port available'),
'passed' if 'orport' in ports else 'failed'
])
if 'orport' in ports:
results.append(
action_utils.diagnose_port_listening(int(ports['orport']), 'tcp4'))
results.append(
action_utils.diagnose_port_listening(int(ports['orport']), 'tcp6'))
results.append([
_('Obfs3 transport registered'),
'passed' if 'obfs3' in ports else 'failed'
])
if 'obfs3' in ports:
results.append(
action_utils.diagnose_port_listening(int(ports['obfs3']), 'tcp4'))
results.append(
action_utils.diagnose_port_listening(int(ports['obfs3']), 'tcp6'))
results.append([
_('Obfs4 transport registered'),
'passed' if 'obfs4' in ports else 'failed'
])
if 'obfs4' in ports:
results.append(
action_utils.diagnose_port_listening(int(ports['obfs4']), 'tcp4'))
results.append(
action_utils.diagnose_port_listening(int(ports['obfs4']), 'tcp6'))
results.append(_diagnose_url_via_tor('http://www.debian.org', '4'))
results.append(_diagnose_url_via_tor('http://www.debian.org', '6'))
results.append(_diagnose_tor_use('https://check.torproject.org', '4'))
results.append(_diagnose_tor_use('https://check.torproject.org', '6'))
return results
def _diagnose_control_port():
"""Diagnose whether Tor control port is open on 127.0.0.1 only."""
results = []

View File

@ -22,13 +22,13 @@ import json
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import frontpage, menu
from plinth.daemon import Daemon
from plinth.modules.apache.components import Webserver
from plinth.modules.firewall.components import Firewall
from plinth.modules.users import register_group, add_user_to_share_group
from plinth.modules.users import add_user_to_share_group, register_group
from .manifest import backup, clients # noqa, pylint: disable=unused-import
@ -74,20 +74,23 @@ class TransmissionApp(app_module.App):
parent_url_name='apps')
self.add(menu_item)
shortcut = frontpage.Shortcut(
'shortcut-transmission', name, short_description=short_description,
icon=icon_filename, url='/transmission', clients=clients,
login_required=True, allowed_groups=[group[0]])
shortcut = frontpage.Shortcut('shortcut-transmission', name,
short_description=short_description,
icon=icon_filename, url='/transmission',
clients=clients, login_required=True,
allowed_groups=[group[0]])
self.add(shortcut)
firewall = Firewall('firewall-transmission', name,
ports=['http', 'https'], is_external=True)
self.add(firewall)
webserver = Webserver('webserver-transmission', 'transmission-plinth')
webserver = Webserver('webserver-transmission', 'transmission-plinth',
urls=['https://{host}/transmission'])
self.add(webserver)
daemon = Daemon('daemon-transmission', managed_services[0])
daemon = Daemon('daemon-transmission', managed_services[0],
listen_ports=[(9091, 'tcp4')])
self.add(daemon)
@ -115,15 +118,3 @@ def setup(helper, old_version=None):
input=json.dumps(new_configuration).encode())
add_user_to_share_group(reserved_usernames[0], managed_services[0])
helper.call('post', app.enable)
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(9091, 'tcp4'))
results.extend(
action_utils.diagnose_url_on_all('https://{host}/transmission',
check_certificate=False))
return results

View File

@ -21,7 +21,7 @@ FreedomBox app to configure Tiny Tiny RSS.
from django.urls import reverse_lazy
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, frontpage, menu
from plinth.daemon import Daemon
@ -92,7 +92,8 @@ class TTRSSApp(app_module.App):
is_external=True)
self.add(firewall)
webserver = Webserver('webserver-ttrss', 'tt-rss-plinth')
webserver = Webserver('webserver-ttrss', 'tt-rss-plinth',
urls=['https://{host}/tt-rss'])
self.add(webserver)
daemon = Daemon('daemon-ttrss', managed_services[0])
@ -138,17 +139,6 @@ def force_upgrade(helper, packages):
return True
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.extend(
action_utils.diagnose_url_on_all('https://{host}/tt-rss',
check_certificate=False))
return results
def backup_pre(packet):
"""Save database contents."""
actions.superuser_run('ttrss', ['dump-database'])

View File

@ -23,9 +23,10 @@ import subprocess
from django.utils.translation import ugettext_lazy as _
from plinth import action_utils, actions
from plinth import actions
from plinth import app as app_module
from plinth import cfg, menu
from plinth.daemon import Daemon
from plinth.utils import format_lazy
version = 3
@ -37,6 +38,8 @@ managed_packages = [
'nslcd', 'samba-common-bin', 'slapd', 'tdb-tools'
]
managed_services = ['slapd']
first_boot_steps = [
{
'id': 'users_firstboot',
@ -79,6 +82,20 @@ class UsersApp(app_module.App):
'users:index', parent_url_name='system')
self.add(menu_item)
daemon = Daemon('daemon-users', managed_services[0],
listen_ports=[(389, 'tcp4'), (389, 'tcp6')])
self.add(daemon)
def diagnose(self):
"""Run diagnostics and return the results."""
results = super().diagnose()
results.append(_diagnose_ldap_entry('dc=thisbox'))
results.append(_diagnose_ldap_entry('ou=people'))
results.append(_diagnose_ldap_entry('ou=groups'))
return results
def init():
"""Initialize the user module."""
@ -96,20 +113,6 @@ def setup(helper, old_version=None):
create_group('freedombox-share')
def diagnose():
"""Run diagnostics and return the results."""
results = []
results.append(action_utils.diagnose_port_listening(389, 'tcp4'))
results.append(action_utils.diagnose_port_listening(389, 'tcp6'))
results.append(_diagnose_ldap_entry('dc=thisbox'))
results.append(_diagnose_ldap_entry('ou=people'))
results.append(_diagnose_ldap_entry('ou=groups'))
return results
def _diagnose_ldap_entry(search_item):
"""Diagnose that an LDAP entry exists."""
result = 'failed'

View File

@ -61,7 +61,7 @@
</button>
<ul class="dropdown-menu">
<li>
{% include "diagnostics_button.html" with module=diagnostics_module_name enabled=is_enabled %}
{% include "diagnostics_button.html" with app_id=diagnostics_module_name enabled=is_enabled %}
</li>
</ul>
</div>