mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-02-11 08:23:49 +00:00
This reduces the number of writes to the disk improving disk longevity and IO performance. Note that systemd-journald is already very reasonable with how often it writes to the disk. It's flush interval is 5 minutes. Most users of FreedomBox are not expected to see logs. Those that see the logs do so for debugging purposes. Debugging can still be done if reboot does not occur. Users can change the logging mode to 'persistent' before debugging issues that require reboot. This makes debugging harder for non-reproducible bugs, but is, at present, considered an acceptable compromise. Tests: - On a fresh container, with the patch applied, config page shows 'volatile' as the logging mode. - On an container with changes not applied, start freedombox service. Then apply the patch and restart service. config app setup will be run. Config page shows 'volatile' as the logging mode. Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org> Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
226 lines
7.0 KiB
Python
226 lines
7.0 KiB
Python
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
"""
|
|
FreedomBox app for basic system configuration.
|
|
"""
|
|
|
|
import os
|
|
import socket
|
|
|
|
import augeas
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from plinth import actions
|
|
from plinth import app as app_module
|
|
from plinth import frontpage, menu
|
|
from plinth.daemon import RelatedDaemon
|
|
from plinth.modules.apache import (get_users_with_website, user_of_uws_url,
|
|
uws_url_of_user)
|
|
from plinth.modules.names.components import DomainType
|
|
from plinth.package import Packages
|
|
from plinth.signals import domain_added
|
|
|
|
from . import privileged
|
|
|
|
_description = [
|
|
_('Here you can set some general configuration options '
|
|
'like hostname, domain name, webserver home page etc.')
|
|
]
|
|
|
|
APACHE_CONF_ENABLED_DIR = '/etc/apache2/conf-enabled'
|
|
APACHE_HOMEPAGE_CONF_FILE_NAME = 'freedombox-apache-homepage.conf'
|
|
APACHE_HOMEPAGE_CONFIG = os.path.join(APACHE_CONF_ENABLED_DIR,
|
|
APACHE_HOMEPAGE_CONF_FILE_NAME)
|
|
FREEDOMBOX_APACHE_CONFIG = os.path.join(APACHE_CONF_ENABLED_DIR,
|
|
'freedombox.conf')
|
|
ADVANCED_MODE_KEY = 'advanced_mode'
|
|
|
|
app = None
|
|
|
|
|
|
class ConfigApp(app_module.App):
|
|
"""FreedomBox app for basic system configuration."""
|
|
|
|
app_id = 'config'
|
|
|
|
_version = 4
|
|
|
|
can_be_disabled = False
|
|
|
|
def __init__(self):
|
|
"""Create components for the app."""
|
|
super().__init__()
|
|
info = app_module.Info(app_id=self.app_id, version=self._version,
|
|
is_essential=True,
|
|
depends=['apache', 'firewall', 'names'
|
|
], name=_('General Configuration'),
|
|
icon='fa-cog', description=_description,
|
|
manual_page='Configure')
|
|
self.add(info)
|
|
|
|
menu_item = menu.Menu('menu-config', _('Configure'), None, info.icon,
|
|
'config:index', parent_url_name='system')
|
|
self.add(menu_item)
|
|
|
|
packages = Packages('packages-config', ['zram-tools'])
|
|
self.add(packages)
|
|
|
|
daemon1 = RelatedDaemon('related-daemon-config1', 'systemd-journald')
|
|
self.add(daemon1)
|
|
|
|
daemon2 = RelatedDaemon('related-daemon-config2', 'rsyslog')
|
|
self.add(daemon2)
|
|
|
|
domain_type = DomainType('domain-type-static', _('Domain Name'),
|
|
'config:index', can_have_certificate=True)
|
|
self.add(domain_type)
|
|
|
|
@staticmethod
|
|
def post_init():
|
|
"""Perform post initialization operations."""
|
|
# Register domain with Name Services module.
|
|
domainname = get_domainname()
|
|
if domainname:
|
|
domain_added.send_robust(sender='config',
|
|
domain_type='domain-type-static',
|
|
name=domainname, services='__all__')
|
|
|
|
|
|
def get_domainname():
|
|
"""Return the domainname"""
|
|
fqdn = socket.getfqdn()
|
|
return '.'.join(fqdn.split('.')[1:])
|
|
|
|
|
|
def get_hostname():
|
|
"""Return the hostname"""
|
|
return socket.gethostname()
|
|
|
|
|
|
def home_page_url2scid(url):
|
|
"""Returns the shortcut ID of the given home page url."""
|
|
|
|
if url in ('/plinth/', '/plinth', 'plinth'):
|
|
return 'plinth'
|
|
|
|
if url == '/index.html':
|
|
return 'apache-default'
|
|
|
|
if url and url.startswith('/~'):
|
|
return 'uws-{}'.format(user_of_uws_url(url))
|
|
|
|
shortcuts = frontpage.Shortcut.list()
|
|
for shortcut in shortcuts:
|
|
if shortcut.url == url:
|
|
return shortcut.component_id
|
|
|
|
return None
|
|
|
|
|
|
def _home_page_scid2url(shortcut_id):
|
|
"""Returns the url for the given home page shortcut ID."""
|
|
if shortcut_id is None:
|
|
url = None
|
|
elif shortcut_id == 'plinth':
|
|
url = '/plinth/'
|
|
elif shortcut_id == 'apache-default':
|
|
url = '/index.html'
|
|
elif shortcut_id.startswith('uws-'):
|
|
user = shortcut_id[4:]
|
|
if user in get_users_with_website():
|
|
url = uws_url_of_user(user)
|
|
else:
|
|
url = None
|
|
else:
|
|
shortcuts = frontpage.Shortcut.list()
|
|
aux = [
|
|
shortcut.url for shortcut in shortcuts
|
|
if shortcut_id == shortcut.component_id
|
|
]
|
|
url = aux[0] if 1 == len(aux) else None
|
|
|
|
return url
|
|
|
|
|
|
def _get_home_page_url(conf_file):
|
|
"""Get the default application for the domain."""
|
|
aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD +
|
|
augeas.Augeas.NO_MODL_AUTOLOAD)
|
|
aug.set('/augeas/load/Httpd/lens', 'Httpd.lns')
|
|
aug.set('/augeas/load/Httpd/incl[last() + 1]', conf_file)
|
|
aug.load()
|
|
|
|
aug.defvar('conf', '/files' + conf_file)
|
|
|
|
for match in aug.match('/files' + conf_file +
|
|
'/directive["RedirectMatch"]'):
|
|
if aug.get(match + "/arg[1]") == '''"^/$"''':
|
|
return aug.get(match + "/arg[2]").strip('"')
|
|
|
|
return None
|
|
|
|
|
|
def get_home_page():
|
|
"""Return the shortcut ID that is set as current home page."""
|
|
CONF_FILE = APACHE_HOMEPAGE_CONFIG if os.path.exists(
|
|
APACHE_HOMEPAGE_CONFIG) else FREEDOMBOX_APACHE_CONFIG
|
|
|
|
url = _get_home_page_url(CONF_FILE)
|
|
return home_page_url2scid(url)
|
|
|
|
|
|
def change_home_page(shortcut_id):
|
|
"""Change the FreedomBox's default redirect to URL of the shortcut
|
|
specified.
|
|
"""
|
|
url = _home_page_scid2url(shortcut_id)
|
|
if url is None:
|
|
url = '/plinth/' # fall back to default url if scid is unknown.
|
|
|
|
# URL may be a reverse_lazy() proxy
|
|
actions.superuser_run('config', ['set-home-page', str(url)])
|
|
|
|
|
|
def get_advanced_mode():
|
|
"""Get whether option is enabled."""
|
|
from plinth import kvstore
|
|
return kvstore.get_default(ADVANCED_MODE_KEY, False)
|
|
|
|
|
|
def set_advanced_mode(advanced_mode):
|
|
"""Turn on/off advanced mode."""
|
|
from plinth import kvstore
|
|
kvstore.set(ADVANCED_MODE_KEY, advanced_mode)
|
|
|
|
|
|
def setup(helper, old_version=None):
|
|
"""Install and configure the module."""
|
|
app.setup(old_version)
|
|
_migrate_home_page_config()
|
|
|
|
if old_version <= 3:
|
|
privileged.set_logging_mode('volatile')
|
|
|
|
# systemd-journald is socket activated, it may not be running and it does
|
|
# not support reload.
|
|
actions.superuser_run('service', ['try-restart', 'systemd-journald'])
|
|
# rsyslog when enabled, is activated by syslog.socket (shipped by systemd).
|
|
# See: https://www.freedesktop.org/wiki/Software/systemd/syslog/ .
|
|
actions.superuser_run('service', ['disable', 'rsyslog'])
|
|
# Ensure that rsyslog is not started by something else as it is installed
|
|
# by default on Debian systems.
|
|
actions.superuser_run('service', ['mask', 'rsyslog'])
|
|
|
|
|
|
def _migrate_home_page_config():
|
|
"""Move the home page configuration to an external file."""
|
|
|
|
# Hold the current home page in a variable
|
|
home_page = get_home_page()
|
|
|
|
# Reset the home page to plinth in freedombox.conf
|
|
actions.superuser_run('config', ['reset-home-page'])
|
|
|
|
# Write the home page setting into the new conf file
|
|
# This step is run at the end because it reloads the Apache server
|
|
change_home_page(home_page)
|