diff --git a/.ci/functional-tests.yml b/.ci/functional-tests.yml
index 18651dae3..1655fd651 100644
--- a/.ci/functional-tests.yml
+++ b/.ci/functional-tests.yml
@@ -34,7 +34,6 @@
- adduser tester --gecos "First Last,RoomNumber,WorkPhone,HomePhone" --disabled-password && echo "tester:password" | chpasswd
script:
- cp -r . /home/tester/freedombox && chown -R tester:tester /home/tester/freedombox
- - sudo -u tester bash -c 'pip3 install --user selenium==4.2.0 splinter==0.17.0 pytest-splinter pytest-reporter-html1'
- |
sudo FREEDOMBOX_URL="https://$APP_SERVER_IP" -u tester bash -c \
'cd /home/tester/freedombox && py.test-3 -v --durations=10 --include-functional --splinter-headless --template=html1/index.html --report=functional-tests.html'
diff --git a/HACKING.md b/HACKING.md
index 3a749a6f3..650dc7c30 100644
--- a/HACKING.md
+++ b/HACKING.md
@@ -450,12 +450,12 @@ host$ vagrant provision --provision-with tests
Follow the instructions below to run the tests on host machine. If you wish
perform the tests on host machine, the host machine must be based on Debian
-Buster (or later).
+Bookworm (or later).
```bash
-host$ pip3 install splinter
-host$ pip3 install pytest-splinter
-host$ pip3 install pytest-xdist # optional, to run tests in parallel
+host$ pip3 install --break-system-packages splinter
+host$ pip3 install --break-system-packages pytest-splinter
+host$ pip3 install --break-system-packages pytest-xdist # optional, to run tests in parallel
host$ sudo apt install firefox
host$ sudo apt install smbclient # optional, to test samba
```
diff --git a/conftest.py b/conftest.py
index 3ba2576e8..333e66fa7 100644
--- a/conftest.py
+++ b/conftest.py
@@ -13,15 +13,16 @@ import pytest
try:
importlib.import_module('splinter')
- _splinter_available = True
+ importlib.import_module('selenium')
+ _functional_libs_available = True
except ImportError:
- _splinter_available = False
+ _functional_libs_available = False
def pytest_ignore_collect(path, config):
"""Ignore functional tests when splinter is not available."""
if path.basename == 'test_functional.py':
- return not _splinter_available
+ return not _functional_libs_available
def pytest_addoption(parser):
diff --git a/container b/container
index cbb1fadc1..710fd3645 100755
--- a/container
+++ b/container
@@ -368,6 +368,7 @@ def _verify_dependencies():
'gpg': 'gpg',
'xz': 'xz-utils',
'parted': 'parted',
+ 'sgdisk': 'gdisk',
'btrfs': 'btrfs-progs',
'nmcli': 'network-manager',
'ssh': 'openssh-client',
@@ -522,6 +523,21 @@ def _download_disk_image(distribution, force=False):
return _extract_image(target_file)
+def _get_partition_info(image_file):
+ """Return the number of the final partition in the image file."""
+ process = subprocess.run(
+ ['sudo', 'parted', '--script',
+ str(image_file), 'print'], stdout=subprocess.PIPE, check=True)
+ lines = process.stdout.decode().splitlines()
+ last_partition_number = lines[-2].split()[0]
+ partition_table_type = 'msdos'
+ for line in lines:
+ if line.startswith('Partition Table:'):
+ partition_table_type = line.partition(': ')[2]
+
+ return partition_table_type, last_partition_number
+
+
def _resize_disk_image(image_file, new_size):
"""Resize the disk image if has not already been."""
if new_size[-1] != 'G':
@@ -542,14 +558,22 @@ def _resize_disk_image(image_file, new_size):
['truncate', '--size',
str(new_size_bytes),
str(image_file)], check=True)
+ partition_table_type, last_partition_number = _get_partition_info(
+ image_file)
+ if partition_table_type == 'gpt':
+ subprocess.run(
+ ['sudo', 'sgdisk', '--move-second-header',
+ str(image_file)], check=True)
+
subprocess.run([
'sudo', 'parted', '--align=optimal', '--script',
- str(image_file), 'resizepart', '1', '100%'
+ str(image_file), 'resizepart', last_partition_number, '100%'
], check=True)
process = subprocess.run(
['sudo', 'kpartx', '-avs', str(image_file)], stdout=subprocess.PIPE,
check=True)
- partition = '/dev/mapper/' + process.stdout.decode().split()[2]
+ last_line = process.stdout.decode().splitlines()[-1]
+ partition = '/dev/mapper/' + last_line.split()[2]
subprocess.run(['sudo', 'btrfstune', '-uf', partition], check=True)
with tempfile.TemporaryDirectory(
@@ -943,7 +967,7 @@ def _get_ssh_command(ip_address, distribution):
def _wait_for(method):
"""Wait until a condition is satisfied or finally give up."""
- for _ in range(10):
+ for _ in range(60):
return_value = method()
if return_value:
return return_value
diff --git a/debian/changelog b/debian/changelog
index eda9632d1..273516c0f 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,36 @@
+freedombox (23.6.1) unstable; urgency=medium
+
+ [ 109247019824 ]
+ * Translated using Weblate (Bulgarian)
+ * Translated using Weblate (Bulgarian)
+ * Translated using Weblate (Bulgarian)
+ * Translated using Weblate (Bulgarian)
+
+ [ Veiko Aasa ]
+ * container: Force pip to install packages to system environment
+ * tests: functional: Fix setting first ethernet connection as internal
+ * gitweb: Disable snapshot feature
+ * gitweb: Make globally configured features overridable per-repository
+
+ [ Sunil Mohan Adapa ]
+ * container: Fix resizing disk image containing multiple partitions
+ * container: Increase wait time to accommodate slower architectures
+ * tests: Don't error during collection if selenium is not installed
+ * tests: functional: Make install script work for Bullseye
+ * datetime: Re-implement backup/restore for timezone
+ * coturn: Prevent package removal when roundcube is uninstalled
+
+ [ James Valleroy ]
+ * HACKING: Force pip to install packages to system environment
+ * ci: Force pip install for functional tests
+ * datetime: Use unique component ID for related daemon
+ * doc: Fetch latest manual
+
+ [ Coucouf ]
+ * Translated using Weblate (French)
+
+ -- James Valleroy Mon, 10 Apr 2023 20:34:35 -0400
+
freedombox (23.6~bpo11+1) bullseye-backports; urgency=medium
* Rebuild for bullseye-backports.
diff --git a/doc/manual/en/GitWeb.raw.wiki b/doc/manual/en/GitWeb.raw.wiki
index ccc91e138..7daaa2248 100644
--- a/doc/manual/en/GitWeb.raw.wiki
+++ b/doc/manual/en/GitWeb.raw.wiki
@@ -50,6 +50,20 @@ GNOME "Passwords and Keys" utility can be used to store the username and passwor
Though your repositories are primarily hosted on your own !FreedomBox, you can
configure a repository on another Git hosting system like GitLab as a mirror.
+=== Enabling/Disabling Features ===
+
+In !FreedomBox, some of the default features of gitweb have been changed:
+ * Enabled: Blame feature to show what revision and author last modified each line of a file
+ * Enabled: Pickaxe feature to list the commits that introduced or removed a given string
+ * Enabled: Highlight feature to perform syntax highlighting on blobs
+ * Disabled: Snapshot feature that provides a download of a compressed tar file for a given revision (due to high resource usage).
+
+These features can be changed on a per-repository bases by an administrator by editing the git configuration file for the repository on !FreedomBox. See manual page for gitweb.conf(5) for more details on syntax and features. For example, to re-enable the snapshot feature on `myrepo` repository, login to a !FreedomBox terminal via SSH or web console as administrator and edit the file `/var/lib/git/myrepo/config` to contain the following section:
+
+{{{
+[gitweb]
+snapshot = tgz
+}}}
=== External links ===
diff --git a/doc/manual/en/OpenVPN.raw.wiki b/doc/manual/en/OpenVPN.raw.wiki
index 29178b110..df67dcd3f 100644
--- a/doc/manual/en/OpenVPN.raw.wiki
+++ b/doc/manual/en/OpenVPN.raw.wiki
@@ -121,7 +121,7 @@ If you get an error such as `configuration error: invalid 1th argument to “pro
=== Accessing internal services ===
-After connecting to OpenVPN, you will be able to access !FreedomBox services that are only meant to be accessed on internal networks. This is in addition to being able to access external services. This can be done by using the IP address 10.91.0.1 as the host name for these services.
+After connecting to OpenVPN, you will be able to access !FreedomBox services that are only meant to be accessed on internal networks. This is in addition to being able to access external services. This can be done by using the IP address 10.91.0.1 as the host name for these services (for example, use smb://10.91.0.1 instead of smb://freedombox.local to access Samba shares).
The following services are known to '''work''':
* [[FreedomBox/Manual/Privoxy|Privoxy]],
diff --git a/doc/manual/en/ReleaseNotes.raw.wiki b/doc/manual/en/ReleaseNotes.raw.wiki
index c457e3f59..677b443a7 100644
--- a/doc/manual/en/ReleaseNotes.raw.wiki
+++ b/doc/manual/en/ReleaseNotes.raw.wiki
@@ -8,6 +8,29 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
+== FreedomBox 23.6.1 (2023-04-10) ==
+
+ * coturn: Prevent package removal when roundcube is uninstalled
+ * datetime: Re-implement backup/restore for timezone
+ * gitweb: Disable snapshot feature
+ * gitweb: Make globally configured features overridable per-repository
+ * locale: Update translations for Bulgarian, French
+
+== FreedomBox 23.7 (2023-03-27) ==
+
+=== Highlights ===
+
+ * matrixsynapse: Add token based registration verification
+ * mediawiki: Allow setting site language code
+
+=== Other Changes ===
+
+ * container: Fix resizing disk image containing multiple partitions
+ * container: Force pip to install packages to system environment
+ * container: Increase wait time to accommodate slower architectures
+ * locale: Update translations for Bulgarian
+ * tests: functional: Fix setting first ethernet connection as internal
+
== FreedomBox 23.6 (2023-03-13) ==
* /etc/issue: Update message to reflect that all users can login
diff --git a/doc/manual/es/GitWeb.raw.wiki b/doc/manual/es/GitWeb.raw.wiki
index a87e60e8f..f0953bad3 100644
--- a/doc/manual/es/GitWeb.raw.wiki
+++ b/doc/manual/es/GitWeb.raw.wiki
@@ -36,10 +36,27 @@ Tu nombre de usuario y contraseña se cifrarán. Quien monitorize el tráfico de
'''Para usuarios de GNOME (Avanzado)'''
La utilidad "Contraseñas y claves" de GNOME se puede emplear para almacenar el usuario y su contraseña. Más detalles de cómo hacerlo en esta [[https://stackoverflow.com/questions/36585496/error-when-using-git-credential-helper-with-gnome-keyring-as-sudo/40312117#40312117|respuesta en StackOverflow]].
-=== Réplicas Espejo ===
+=== Réplicas espejo ===
Aunque tus repositorios se albergan principalmente en tu propia !FreedomBox puedes configurar un repositorio en otro servicio de alojamiento Git como GitLab a modo de copia espejo.
+=== (Des)habilitar funciones ===
+
+Algunas funciones que en gitweb vienen de serie se han cambiado en !FreedomBox:
+ * Habilitada: Funcionalidad ''blame'' para mostrar qué quién y en qué revisión modificó cada línea de un fichero.
+ * Habilitada: Funcionalidad ''pickaxe'' para listar los commits que introdujeron o eliminaron una cadena de texto dada.
+ * Habilitada: Funcionalidad de resaltado de sintaxis para los blobs.
+ * Deshabilitada: Funcionalidad de instantánea que descarga un fichero comprimido tar con una revisión dada (por su alto consumo de recursos).
+
+Un administrador puede ajustar estas selecciones editando el fichero de configuration de git de cada repositorio en !FreedomBox. Más detalles de sintaxis y funciones en la página man de gitweb.conf(5).
+Por ejemplo, para rehabilitar las instantánes en el repositorio `mirepo`, ingresa como administrador al terminal de !FreedomBox por SSH o consola web y edita el fichero `/var/lib/git/mirepo/config`
+para que contenga la sección siguiente:
+
+ {{{
+[gitweb]
+snapshot = tgz
+}}}
+
=== Enlaces externos ===
* Documentación de uso: https://git-scm.com/docs/gitweb
diff --git a/doc/manual/es/OpenVPN.raw.wiki b/doc/manual/es/OpenVPN.raw.wiki
index 40043883e..f266eb0a1 100644
--- a/doc/manual/es/OpenVPN.raw.wiki
+++ b/doc/manual/es/OpenVPN.raw.wiki
@@ -119,7 +119,7 @@ $ sudo nmcli connection import type openvpn file /ruta/a/.ovpn
=== Acceso a servicios internos ===
-Tras conectar por OpenVPN, podrás acceder a algunos servicios !FreedomBox restringidos a acceso interno, además de a los de acceso externo. Esto se puede hacer usando la dirección IP 10.91.0.1 como hostname para esos servicios.
+Tras conectar por OpenVPN, podrás acceder a algunos servicios !FreedomBox restringidos a acceso interno, además de a los de acceso externo. Esto se puede hacer usando la dirección IP 10.91.0.1 como hostname para esos servicios. (Por ejemplo, usa `smb://10.91.0.1` en vez de `smb://freedombox.local` para acceder a carpetas compartidas Samba).
Los siguientes servicios '''funcionan''' con OpenVPN:
* [[es/FreedomBox/Manual/Privoxy|Privoxy]],
diff --git a/doc/manual/es/ReleaseNotes.raw.wiki b/doc/manual/es/ReleaseNotes.raw.wiki
index c457e3f59..677b443a7 100644
--- a/doc/manual/es/ReleaseNotes.raw.wiki
+++ b/doc/manual/es/ReleaseNotes.raw.wiki
@@ -8,6 +8,29 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
+== FreedomBox 23.6.1 (2023-04-10) ==
+
+ * coturn: Prevent package removal when roundcube is uninstalled
+ * datetime: Re-implement backup/restore for timezone
+ * gitweb: Disable snapshot feature
+ * gitweb: Make globally configured features overridable per-repository
+ * locale: Update translations for Bulgarian, French
+
+== FreedomBox 23.7 (2023-03-27) ==
+
+=== Highlights ===
+
+ * matrixsynapse: Add token based registration verification
+ * mediawiki: Allow setting site language code
+
+=== Other Changes ===
+
+ * container: Fix resizing disk image containing multiple partitions
+ * container: Force pip to install packages to system environment
+ * container: Increase wait time to accommodate slower architectures
+ * locale: Update translations for Bulgarian
+ * tests: functional: Fix setting first ethernet connection as internal
+
== FreedomBox 23.6 (2023-03-13) ==
* /etc/issue: Update message to reflect that all users can login
diff --git a/plinth/__init__.py b/plinth/__init__.py
index 5420964b9..5e52acec7 100644
--- a/plinth/__init__.py
+++ b/plinth/__init__.py
@@ -3,4 +3,4 @@
Package init file.
"""
-__version__ = '23.6'
+__version__ = '23.6.1'
diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po
index 7f964b4d7..7ff09a5a5 100644
--- a/plinth/locale/bg/LC_MESSAGES/django.po
+++ b/plinth/locale/bg/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 21:32-0400\n"
-"PO-Revision-Date: 2023-02-16 19:39+0000\n"
+"PO-Revision-Date: 2023-04-11 00:02+0000\n"
"Last-Translator: 109247019824 \n"
"Language-Team: Bulgarian \n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
-"X-Generator: Weblate 4.16-dev\n"
+"X-Generator: Weblate 4.17-dev\n"
#: doc/dev/_templates/layout.html:11
msgid "Page source"
@@ -697,7 +697,7 @@ msgstr "Създадено е отдалечено хранилище с дос
#: plinth/modules/backups/views.py:379
msgid "Verify SSH hostkey"
-msgstr "Проверяване на ключа за SSH на хоста"
+msgstr "Проверяване на ключ за SSH на хост"
#: plinth/modules/backups/views.py:405
msgid "SSH host already verified."
@@ -705,7 +705,7 @@ msgstr "SSH на хоста вече е проверен."
#: plinth/modules/backups/views.py:415
msgid "SSH host verified."
-msgstr "Ключът на хоста е проверен."
+msgstr "SSH на хоста е проверен."
#: plinth/modules/backups/views.py:430
msgid "SSH host public key could not be verified."
@@ -1474,7 +1474,7 @@ msgid ""
"System is low on memory: {percent_used}% used, {memory_available} "
"{memory_available_unit} free. {advice_message}"
msgstr ""
-"Системата разполага с малко памет: използвани {percent_used} %, "
+"Системата разполага с малко памет: използвана {percent_used} %, свободна "
"{memory_available} {memory_available_unit}. {advice_message}"
#: plinth/modules/diagnostics/__init__.py:238
@@ -1484,11 +1484,11 @@ msgstr "Паметта е малко"
#: plinth/modules/diagnostics/templates/diagnostics.html:17
#: plinth/modules/diagnostics/templates/diagnostics_button.html:11
msgid "Run Diagnostics"
-msgstr "Начало на диагностиката"
+msgstr "Диагностика"
#: plinth/modules/diagnostics/templates/diagnostics.html:20
msgid "Diagnostics test is currently running"
-msgstr "Диагностичната проверка в момента се извършва"
+msgstr "Извършва се диагностика"
#: plinth/modules/diagnostics/templates/diagnostics.html:33
msgid "Results"
@@ -1657,7 +1657,7 @@ msgstr "Потребителско име"
#: plinth/modules/dynamicdns/forms.py:95 plinth/modules/networks/forms.py:215
msgid "Show password"
-msgstr ""
+msgstr "Показване на паролата"
#: plinth/modules/dynamicdns/forms.py:99
msgid "URL to look up public IP"
@@ -2334,6 +2334,7 @@ msgid ""
"There is a new %(box_name)s version available"
"a>."
msgstr ""
+"Налично е ново издание на %(box_name)s."
#: plinth/modules/help/templates/help_about.html:28
#: plinth/modules/upgrades/templates/upgrades_configure.html:37
@@ -2377,6 +2378,8 @@ msgid ""
"For more information about the %(box_name)s project, see the %(box_name)s Wiki."
msgstr ""
+"За повече информация относно проекта %(box_name)s посетете документацията на %(box_name)s."
#: plinth/modules/help/templates/help_about.html:78
msgid "Learn more"
@@ -3393,10 +3396,14 @@ msgid ""
"each type of name, it is shown whether the HTTP, HTTPS, and SSH services are "
"enabled or disabled for incoming connections through the given name."
msgstr ""
+"Услугите за имена предоставят преглед на начините, по които {box_name} може "
+"да бъде достъпен от публичния интернет: име на домейн, Tor onion service и "
+"Pagekite. За всеки тип име е показано дали услугите HTTP, HTTPS и SSH са "
+"разрешени или забранени за входящи връзки през даденото име."
#: plinth/modules/names/__init__.py:43
msgid "Name Services"
-msgstr ""
+msgstr "Услуги за имена"
#: plinth/modules/names/components.py:12
msgid "All"
@@ -3408,11 +3415,11 @@ msgstr "Всички приложения за уеб"
#: plinth/modules/names/components.py:24
msgid "Secure Shell"
-msgstr ""
+msgstr "Secure Shell"
#: plinth/modules/names/templates/names.html:17
msgid "Services"
-msgstr ""
+msgstr "Услуги"
#: plinth/modules/networks/__init__.py:34
msgid ""
@@ -3425,167 +3432,195 @@ msgid ""
"Devices administered through other methods may not be available for "
"configuration here."
msgstr ""
+"Управляваните по друг начин устройства ще бъдат недостъпни за управление от "
+"тук."
#: plinth/modules/networks/__init__.py:57
msgid "Networks"
-msgstr ""
+msgstr "Мрежи"
#: plinth/modules/networks/forms.py:16
msgid "Connection Type"
-msgstr ""
+msgstr "Вид на връзката"
#: plinth/modules/networks/forms.py:28
msgid "Connection Name"
-msgstr ""
+msgstr "Име на връзката"
#: plinth/modules/networks/forms.py:30
msgid "Network Interface"
-msgstr ""
+msgstr "Мрежов интерфейс"
#: plinth/modules/networks/forms.py:31
msgid "The network device that this connection should be bound to."
-msgstr ""
+msgstr "Мрежовото устройство, което използва тази връзка."
#: plinth/modules/networks/forms.py:34
msgid "Firewall Zone"
-msgstr ""
+msgstr "Зона на защитната стена"
#: plinth/modules/networks/forms.py:35
msgid ""
"The firewall zone will control which services are available over this "
"interfaces. Select Internal only for trusted networks."
msgstr ""
+"Зоната на защитната стена ще контролира кои услуги са достъпни през този "
+"интерфейс. Изберете „само вътрешни“ единствено за доверени мрежи."
#: plinth/modules/networks/forms.py:39
msgid "IPv4 Addressing Method"
-msgstr ""
+msgstr "Метод за адресиране на IPv4"
#: plinth/modules/networks/forms.py:41
msgid ""
"Automatic (DHCP): Configure automatically, use Internet connection from this "
"network"
msgstr ""
+"Автоматично (DHCP): Настройва се автоматично, използва се интернет връзка от "
+"тази мрежа"
#: plinth/modules/networks/forms.py:44
msgid ""
"Shared: Act as a router, provide Internet connection to other devices on "
"this network"
msgstr ""
+"Споделено: работи като маршрутизатор, осигурява интернет връзка на други "
+"устройства в тази мрежа"
#: plinth/modules/networks/forms.py:47 plinth/modules/networks/forms.py:85
msgid ""
"Manual: Use manually specified parameters, use Internet connection from this "
"network"
msgstr ""
+"Ръчно: Използвайте ръчно зададени параметри, използвайте интернет връзка от "
+"тази мрежа"
#: plinth/modules/networks/forms.py:50
msgid "Disabled: Do not configure this addressing method"
-msgstr ""
+msgstr "Изллючено: Без настройка на адресирането"
#: plinth/modules/networks/forms.py:57
msgid "Netmask"
-msgstr ""
+msgstr "Мрежова маска"
#: plinth/modules/networks/forms.py:58
msgid ""
"Optional value. If left blank, a default netmask based on the address will "
"be used."
msgstr ""
+"Незадължителна стойност. Ако бъде оставена празна, ще се използва мрежова "
+"маска по подразбиране, базирана на адреса."
#: plinth/modules/networks/forms.py:62 plinth/modules/networks/forms.py:97
#: plinth/modules/networks/templates/connection_show.html:193
#: plinth/modules/networks/templates/connection_show.html:234
msgid "Gateway"
-msgstr ""
+msgstr "Шлюз"
#: plinth/modules/networks/forms.py:62 plinth/modules/networks/forms.py:97
msgid "Optional value."
-msgstr ""
+msgstr "Незадължителна стойност."
#: plinth/modules/networks/forms.py:65 plinth/modules/networks/forms.py:100
msgid "DNS Server"
-msgstr ""
+msgstr "Сървър на DNS"
#: plinth/modules/networks/forms.py:66
msgid ""
"Optional value. If this value is given and IPv4 addressing method is "
"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored."
msgstr ""
+"Незадължителна стойност. Ако стойността е зададена и методът за адресиране "
+"на IPv4 е „Автоматичен“, сървърите на DNS, предоставени от DHCP, ще бъдат "
+"пренебрегнати."
#: plinth/modules/networks/forms.py:71 plinth/modules/networks/forms.py:106
msgid "Second DNS Server"
-msgstr ""
+msgstr "Втори сървър на DNS"
#: plinth/modules/networks/forms.py:72
msgid ""
"Optional value. If this value is given and IPv4 Addressing Method is "
"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored."
msgstr ""
+"Незадължителна стойност. Ако стойността е зададена и методът за адресиране "
+"на IPv4 е „Автоматичен“, сървърите на DNS, предоставени от DHCP, ще бъдат "
+"пренебрегнати."
#: plinth/modules/networks/forms.py:77
msgid "IPv6 Addressing Method"
-msgstr ""
+msgstr "Метод за адресиране на IPv6"
#: plinth/modules/networks/forms.py:79
msgid ""
"Automatic: Configure automatically, use Internet connection from this network"
msgstr ""
+"Автоматично: Настройва се автоматично, използва се интернет връзка от тази "
+"мрежа"
#: plinth/modules/networks/forms.py:82
msgid ""
"Automatic (DHCP only): Configure automatically, use Internet connection from "
"this network"
msgstr ""
+"Автоматично (само DHCP): Настройва се автоматично, използва се интернет "
+"връзка от тази мрежа"
#: plinth/modules/networks/forms.py:87
msgid "Ignore: Ignore this addressing method"
-msgstr ""
+msgstr "Пренебрегнато: Методът на адресиране се пренебрегва"
#: plinth/modules/networks/forms.py:92
msgid "Prefix"
-msgstr ""
+msgstr "Наставка"
#: plinth/modules/networks/forms.py:93
msgid "Value between 1 and 128."
-msgstr ""
+msgstr "Стойността е между 1 и 128."
#: plinth/modules/networks/forms.py:101
msgid ""
"Optional value. If this value is given and IPv6 addressing method is "
"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored."
msgstr ""
+"Незадължителна стойност. Ако стойността е зададена и методът за адресиране "
+"на IPv6 е „Автоматичен“, сървърите на DNS, предоставени от DHCP, ще бъдат "
+"пренебрегнати."
#: plinth/modules/networks/forms.py:107
msgid ""
"Optional value. If this value is given and IPv6 Addressing Method is "
"\"Automatic\", the DNS Servers provided by a DHCP server will be ignored."
msgstr ""
+"Незадължителна стойност. Ако стойността е зададена и методът за адресиране "
+"на IPv6 е „Автоматичен“, сървърите на DNS, предоставени от DHCP, ще бъдат "
+"пренебрегнати."
#: plinth/modules/networks/forms.py:120
msgid "-- select --"
-msgstr ""
+msgstr "— изберете —"
#: plinth/modules/networks/forms.py:247
#: plinth/modules/networks/templates/connection_show.html:135
msgid "SSID"
-msgstr ""
+msgstr "SSID"
#: plinth/modules/networks/forms.py:248
msgid "The visible name of the network."
-msgstr ""
+msgstr "Видимото име на мрежата."
#: plinth/modules/networks/forms.py:250
#: plinth/modules/networks/templates/connection_show.html:148
msgid "Mode"
-msgstr ""
+msgstr "Режим"
#: plinth/modules/networks/forms.py:250
msgid "Infrastructure"
-msgstr ""
+msgstr "Инфраструктура"
#: plinth/modules/networks/forms.py:251
msgid "Access Point"
-msgstr ""
+msgstr "Точка за достъп"
#: plinth/modules/networks/forms.py:252
msgid "Ad-hoc"
@@ -3593,34 +3628,36 @@ msgstr ""
#: plinth/modules/networks/forms.py:254
msgid "Frequency Band"
-msgstr ""
+msgstr "Честотна лента"
#: plinth/modules/networks/forms.py:254
msgid "Automatic"
-msgstr ""
+msgstr "Автоматично"
#: plinth/modules/networks/forms.py:255
msgid "A (5 GHz)"
-msgstr ""
+msgstr "A (5 ГХц)"
#: plinth/modules/networks/forms.py:256
msgid "B/G (2.4 GHz)"
-msgstr ""
+msgstr "B/G (2,4 ГХц)"
#: plinth/modules/networks/forms.py:258
#: plinth/modules/networks/templates/connection_show.html:162
msgid "Channel"
-msgstr ""
+msgstr "Канал"
#: plinth/modules/networks/forms.py:259
msgid ""
"Optional value. Wireless channel in the selected frequency band to restrict "
"to. Blank or 0 value means automatic selection."
msgstr ""
+"Незадължителна стойност. Ограничение на безжичния канал в избраната честотна "
+"лента. Празна стойност или 0 означава автоматичен избор."
#: plinth/modules/networks/forms.py:264
msgid "BSSID"
-msgstr ""
+msgstr "BSSID"
#: plinth/modules/networks/forms.py:265
msgid ""
@@ -3628,29 +3665,34 @@ msgid ""
"an access point, connect only if the BSSID of the access point matches the "
"one provided. Example: 00:11:22:aa:bb:cc."
msgstr ""
+"Незадължителна стойност. Уникален идентификатор за точката за достъп. Когато "
+"се свързвате с точка за достъп, се свързвайте само ако BSSID на точката за "
+"достъп съвпада с предоставения. Пример: 00:11:22:aa:bb:cc."
#: plinth/modules/networks/forms.py:271
msgid "Authentication Mode"
-msgstr ""
+msgstr "Режим на удостоверяване"
#: plinth/modules/networks/forms.py:272
msgid ""
"Select WPA if the wireless network is secured and requires clients to have "
"the password to connect."
msgstr ""
+"Изберете WPA, ако безжичната мрежа е защитена и изисква от клиентите да "
+"разполагат с паролата за свързване."
#: plinth/modules/networks/forms.py:274
msgid "WPA"
-msgstr ""
+msgstr "WPA"
#: plinth/modules/networks/forms.py:274
msgid "Open"
-msgstr ""
+msgstr "Отворена"
#: plinth/modules/networks/forms.py:310
#, python-brace-format
msgid "Specify how your {box_name} is connected to your network"
-msgstr ""
+msgstr "Посочете как устройството {box_name} е свързано с мрежата"
#: plinth/modules/networks/forms.py:317
#, python-brace-format
@@ -3659,6 +3701,9 @@ msgid ""
"Internet connection from your router via Wi-Fi or Ethernet cable. This is a "
"typical home setup.
"
msgstr ""
+"Свързано към маршрутизатор {box_name} получава "
+"интернет от маршрутизатор безжично или чрез кабел. Това е типичната домашна "
+"постройка.
"
#: plinth/modules/networks/forms.py:324
#, python-brace-format
@@ -4368,7 +4413,7 @@ msgstr ""
#: plinth/modules/networks/views.py:112
msgid "infrastructure"
-msgstr ""
+msgstr "инфраструктура"
#: plinth/modules/networks/views.py:113
msgid "access point"
@@ -4712,13 +4757,15 @@ msgstr "Рестартирайте или изключете системата.
#: plinth/modules/power/__init__.py:31
msgid "Power"
-msgstr ""
+msgstr "Захранване"
#: plinth/modules/power/templates/power.html:13
msgid ""
"Currently an installation or upgrade is running. Consider waiting until it's "
"finished before shutting down or restarting."
msgstr ""
+"В момента тече процес на инсталация или обновяване. Помислете дали да не "
+"изчакате, докато тя приключи, преди да рестартирате или изключите."
#: plinth/modules/power/templates/power.html:22 plinth/templates/base.html:174
#: plinth/templates/base.html:175
@@ -4734,16 +4781,16 @@ msgid ""
"Are you sure you want to restart? You will not be able to access this web "
"interface for a few minutes until the system is restarted."
msgstr ""
-"Сигурни ли сте, че искате да рестартирате? Няма да имате достъп до този "
-"интерфейс за няколко минути, докато системата не се рестартира."
+"Желаете ли да рестартирате устройството? Докато рестартът не завърши няма да "
+"има достъп до отдалечения интерфейс."
#: plinth/modules/power/templates/power_restart.html:34
msgid ""
"Currently an installation or upgrade is running. Consider waiting until it's "
"finished before restarting."
msgstr ""
-"В момента тече инсталация или обновяване. Помислете дали да не изчакате, "
-"докато тя приключи, преди да рестартирате."
+"В момента тече процес на инсталация или обновяване. Помислете дали да не "
+"изчакате, докато тя приключи, преди да рестартирате."
#: plinth/modules/power/templates/power_restart.html:48
#: plinth/modules/power/templates/power_restart.html:51
@@ -4755,14 +4802,16 @@ msgid ""
"Are you sure you want to shut down? You will not be able to access this web "
"interface after shut down."
msgstr ""
-"Сигурни ли сте, че искате да изключите устройството? Няма да имате достъп до "
-"този интерфейс."
+"Желаете ли изключите устройството? Няма да има достъп до отдалечения "
+"интерфейс."
#: plinth/modules/power/templates/power_shutdown.html:33
msgid ""
"Currently an installation or upgrade is running. Consider waiting until it's "
"finished before shutting down."
msgstr ""
+"В момента тече процес на инсталация или обновяване. Помислете дали да не "
+"изчакате, докато тя приключи, преди да изключите."
#: plinth/modules/power/templates/power_shutdown.html:47
#: plinth/modules/power/templates/power_shutdown.html:50
diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po
index b6abc3eb6..67c38daff 100644
--- a/plinth/locale/fr/LC_MESSAGES/django.po
+++ b/plinth/locale/fr/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: FreedomBox UI\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-03-13 21:32-0400\n"
-"PO-Revision-Date: 2022-10-30 11:00+0000\n"
+"PO-Revision-Date: 2023-04-07 23:10+0000\n"
"Last-Translator: Coucouf \n"
"Language-Team: French \n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Generator: Weblate 4.14.2-dev\n"
+"X-Generator: Weblate 4.17-dev\n"
#: doc/dev/_templates/layout.html:11
msgid "Page source"
@@ -1746,7 +1746,7 @@ msgstr "GnuDIP"
#: plinth/modules/dynamicdns/forms.py:57
msgid "Other update URL"
-msgstr "Autre URL de mise à jour"
+msgstr "URL de mise à jour alternative"
#: plinth/modules/dynamicdns/forms.py:59
msgid "Service Type"
@@ -1977,11 +1977,11 @@ msgstr "Yaxim"
#: plinth/modules/ejabberd/manifest.py:55
msgid "Monal - XMPP Chat"
-msgstr ""
+msgstr "Monal − Tchat XMPP"
#: plinth/modules/ejabberd/manifest.py:64
msgid "Siskin IM"
-msgstr ""
+msgstr "Messagerie Siskin"
#: plinth/modules/ejabberd/manifest.py:73
msgid "Dino"
@@ -3349,7 +3349,7 @@ msgid ""
"Matrix user IDs will look like @username:domainname."
msgstr ""
"Le service Matrix doit être configuré pour un domaine défini. Les "
-"utilisateurs sur d’autres serveurs Matrix seront en mesure de joindre les "
+"utilisateurs d’autres serveurs Matrix seront en mesure de joindre les "
"utilisateurs de ce serveur grâce à ce nom de domaine. Les identifiants "
"utilisateur Matrix seront du type @identifiant:nomdedomaine."
@@ -4661,8 +4661,9 @@ msgid ""
"actions."
msgstr ""
"La description qui suit résume le mieux la manière dont votre %(box_name)s "
-"est connectée à votre réseau. Ces informations ne sont utilisées que pour "
-"suggérer d’autres actions de configuration nécessaires."
+"est connectée à votre réseau. Ce choix sert uniquement à vous suggérer les "
+"autres configurations nécessaires au bon fonctionnement de votre "
+"installation."
#: plinth/modules/networks/templates/network_topology_main.html:24
#, python-format
@@ -5263,9 +5264,9 @@ msgid ""
"protocol/port combinations that you are able to define here. For example, "
"HTTPS on ports other than 443 is known to cause problems."
msgstr ""
-"Avertissement :
le serveur frontal PageKite peut ne pas être "
-"compatible avec toutes les combinaisons de protocole et de port en cours de "
-"définition. Par exemple, l’utilisation de ports autre que 443 pour le "
+"Avertissement :
le serveur frontal PageKite peut ne pas être "
+"compatible avec toutes les combinaisons de protocole et de port que vous "
+"pouvez saisir ici. Par exemple, l’utilisation de ports autre que 443 pour le "
"protocole HTTPS est connu pour causer des problèmes."
#: plinth/modules/pagekite/utils.py:45
@@ -5425,11 +5426,12 @@ msgid ""
msgstr ""
"Aider les développeuses et développeurs Debian/{box_name} en participant au "
"concours de popularité. En activant cette option la liste des applis "
-"utilisées sur ce système sera soumis de manière anonyme au projet Debian "
+"utilisées sur ce système sera soumise de manière anonyme au projet Debian "
"chaque semaine. Les statistiques construites à partir de ces données sont "
"accessibles publiquement à l’adresse popcon.debian.org. Pour plus de confidentialité, la "
-"transmission a lieu au travers du réseau Tor lorsque l’appli Tor est activée."
+"transmission a lieu au travers du réseau Tor pourvu que l’appli Tor soit "
+"activée."
#: plinth/modules/privoxy/__init__.py:23
msgid ""
@@ -5975,9 +5977,9 @@ msgid ""
"attempts to the SSH server and other enabled password protected internet-"
"services."
msgstr ""
-"Lorsque cette option est activée, Fail2Ban limitera les tentatives "
-"d’intrusion par force brute sur le serveur SSH ainsi que sur les autres "
-"services Internet protégés par mot de passe et actifs."
+"Lorsque cette option est activée, Fail2Ban limitera les tentatives d’"
+"intrusion par force brute sur le serveur SSH ainsi que sur les autres "
+"services Internet actifs protégés par mot de passe."
#: plinth/modules/security/templates/security.html:12
#: plinth/modules/security/templates/security.html:14
@@ -6551,20 +6553,18 @@ msgid ""
"administration tasks, copy files or run other services using such "
"connections."
msgstr ""
-"Un serveur Secure Shell utilise le protocole secure shell pour accepter les "
-"connexions des ordinateurs distants. Un ordinateur distant autorisé peut "
-"effectuer des tâches d’administration, copier des fichiers ou bien faire "
-"fonctionner d’autres services en utilisant de telles connexions."
+"Un serveur Secure Shell utilise le protocole « secure shell » pour "
+"accepter les connexions d’ordinateurs distants. Un ordinateur distant "
+"autorisé peut effectuer des tâches d’administration, copier des fichiers ou "
+"bien faire fonctionner d’autres services en utilisant ce type de connexion."
#: plinth/modules/ssh/__init__.py:41
msgid "Secure Shell (SSH) Server"
msgstr "Serveur Secure Shell (SSH)"
#: plinth/modules/ssh/__init__.py:61
-#, fuzzy
-#| msgid "Secure Shell (SSH)"
msgid "Remotely login using Secure Shell (SSH)"
-msgstr "Shell sécurisé (SSH)"
+msgstr "Se connecter à distance par shell sécurisé (SSH)"
#: plinth/modules/ssh/forms.py:13
msgid "Disable password authentication"
@@ -6582,7 +6582,7 @@ msgstr ""
#: plinth/modules/ssh/forms.py:21
msgid "Allow all users to login remotely"
-msgstr ""
+msgstr "Autoriser les utilisateurs et utilisatrices à se connecter à distance"
#: plinth/modules/ssh/forms.py:22
msgid ""
@@ -6590,6 +6590,10 @@ msgid ""
"disabled, only users of groups root, admin and freedombox-ssh can login via "
"SSH."
msgstr ""
+"Autorise n'importe quel utilisateur ou utilisatrice ayant un compte actif à "
+"se connecter via SSH. Si désactivé, seuls les utilisateurs et utilisatrices "
+"des groupes « root », « admin » et « freedombox-"
+"ssh » peuvent se connecter via SSH."
#: plinth/modules/ssh/templates/ssh.html:11
msgid "Server Fingerprints"
@@ -6871,11 +6875,10 @@ msgid ""
"deletion of files on one device will be automatically replicated on all "
"other devices that also run Syncthing."
msgstr ""
-"Syncthing est une application synchroniser des fichiers entre plusieurs "
+"Syncthing est une application pour synchroniser des fichiers entre plusieurs "
"appareils, par exemple votre ordinateur de bureau et votre téléphone "
"mobile. Création, modification ou suppression de fichiers sur un appareil "
-"seront automatiquement répliquées aux autres appareils qui utilisent "
-"Syncthing."
+"sont automatiquement répliquées aux autres appareils qui utilisent Syncthing."
#: plinth/modules/syncthing/__init__.py:27
#, python-brace-format
@@ -7242,8 +7245,8 @@ msgid ""
msgstr ""
"L’espace disponible sur la partition racine est insuffisant pour lancer la "
"mise à niveau de la distribution. Veuillez vous assurer qu’au moins 5 Go "
-"sont disponibles. Si activée, la mise à niveau automatique de la "
-"distribution sera retentée dans 24H."
+"sont disponibles. Si la mise à niveau automatique de la distribution est "
+"activée, elle sera retentée dans 24H."
#: plinth/modules/upgrades/__init__.py:203
msgid "Distribution update started"
@@ -8356,10 +8359,9 @@ msgstr ""
"Vous n’avez pas la permission d’accéder %(request_path)s sur ce serveur."
#: plinth/templates/404.html:10
-#, fuzzy, python-format
-#| msgid "Public key for this %(box_name)s:"
+#, python-format
msgid "Page not found - %(box_name)s"
-msgstr "Clé publique de cette %(box_name)s :"
+msgstr "Page introuvable − %(box_name)s :"
#: plinth/templates/404.html:18
msgid "404"
@@ -8714,13 +8716,11 @@ msgstr "Installer"
#: plinth/templates/setup.html:68
msgid "Update"
-msgstr "Mises à jour"
+msgstr "Mettre à jour"
#: plinth/templates/toolbar.html:39 plinth/templates/toolbar.html:40
-#, fuzzy
-#| msgid "Backups"
msgid "Backup"
-msgstr "Sauvegardes"
+msgstr "Sauvegarder"
#: plinth/templates/toolbar.html:51 plinth/templates/toolbar.html:52
#: plinth/templates/uninstall.html:36
@@ -8733,11 +8733,8 @@ msgid "Uninstall App %(app_name)s?"
msgstr "Désinstaller l’appli %(app_name)s ?"
#: plinth/templates/uninstall.html:17
-#, fuzzy
-#| msgid "Uninstalling an app is an exprimental feature."
msgid "Uninstalling an app is an experimental feature."
-msgstr ""
-"La désinstallation d’applications est une fonctionnalité expérimentale."
+msgstr "La désinstallation d’applications est une fonctionnalité expérimentale."
#: plinth/templates/uninstall.html:23
msgid ""
diff --git a/plinth/modules/coturn/__init__.py b/plinth/modules/coturn/__init__.py
index a3c424191..d3b549d52 100644
--- a/plinth/modules/coturn/__init__.py
+++ b/plinth/modules/coturn/__init__.py
@@ -59,7 +59,9 @@ class CoturnApp(app_module.App):
parent_url_name='apps')
self.add(menu_item)
- packages = Packages('packages-coturn', ['coturn'])
+ # Include sqlite3 to prevent removal of coturn from removal of
+ # roundcube.
+ packages = Packages('packages-coturn', ['coturn', 'sqlite3'])
self.add(packages)
firewall = Firewall('firewall-coturn', info.name,
diff --git a/plinth/modules/datetime/__init__.py b/plinth/modules/datetime/__init__.py
index e51cd50cd..209154ba4 100644
--- a/plinth/modules/datetime/__init__.py
+++ b/plinth/modules/datetime/__init__.py
@@ -9,7 +9,7 @@ from django.utils.translation import gettext_lazy as _
from plinth import app as app_module
from plinth import menu
-from plinth.daemon import Daemon
+from plinth.daemon import Daemon, RelatedDaemon
from plinth.modules.backups.components import BackupRestore
from plinth.package import Packages
@@ -75,6 +75,10 @@ class DateTimeApp(app_module.App):
packages = Packages('packages-datetime', ['systemd-timesyncd'])
self.add(packages)
+ daemon = RelatedDaemon('daemon-datetime-timedated',
+ 'systemd-timedated')
+ self.add(daemon)
+
if self._is_time_managed():
daemon = Daemon('daemon-datetime', 'systemd-timesyncd')
self.add(daemon)
diff --git a/plinth/modules/datetime/manifest.py b/plinth/modules/datetime/manifest.py
index 59f2d45f9..229b34d40 100644
--- a/plinth/modules/datetime/manifest.py
+++ b/plinth/modules/datetime/manifest.py
@@ -3,4 +3,9 @@
Application manifest for datetime.
"""
-backup = {'data': {'files': ['/etc/timezone']}}
+backup = {
+ 'data': {
+ 'files': ['/etc/localtime']
+ },
+ 'services': ['systemd-timedated'],
+}
diff --git a/plinth/modules/gitweb/data/etc/gitweb-freedombox.conf b/plinth/modules/gitweb/data/etc/gitweb-freedombox.conf
index 332fd327c..9bed257f1 100644
--- a/plinth/modules/gitweb/data/etc/gitweb-freedombox.conf
+++ b/plinth/modules/gitweb/data/etc/gitweb-freedombox.conf
@@ -33,12 +33,19 @@ $feature{'pathinfo'}{'default'} = [1];
# enable git blame
$feature{'blame'}{'default'} = [1];
+$feature{'blame'}{'override'} = 1;
# enable pickaxe search
$feature{'pickaxe'}{'default'} = [1];
+$feature{'pickaxe'}{'override'} = 1;
# enable syntax highlighting
$feature{'highlight'}{'default'} = [1];
+$feature{'highlight'}{'override'} = 1;
+
+# disable snapshots
+$feature{'snapshot'}{'default'} = [];
+$feature{'snapshot'}{'override'} = 1;
# do not recursively scan for Git repositories
our $project_maxdepth = 1;
diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py
index ecf939dfe..edcc133b6 100644
--- a/plinth/tests/functional/__init__.py
+++ b/plinth/tests/functional/__init__.py
@@ -555,7 +555,10 @@ def backup_restore(browser, app_name, archive_name=None):
def networks_set_firewall_zone(browser, zone):
""""Set the network device firewall zone as internal or external."""
nav_to_module(browser, 'networks')
+ # First active Ethernet connection
device = browser.find_by_xpath(
+ '//span[contains(@class, "connection-type-label") and '
+ 'contains(., "Ethernet") ]/../..'
'//span[contains(@class, "badge-success") '
'and contains(@class, "connection-status-label")]/following::a').first
network_id = device['href'].split('/')[-3]
diff --git a/plinth/tests/functional/install.sh b/plinth/tests/functional/install.sh
index 829274bfb..ff719feb5 100755
--- a/plinth/tests/functional/install.sh
+++ b/plinth/tests/functional/install.sh
@@ -8,7 +8,10 @@ sudo apt-get install -yq --no-install-recommends \
python3-pip python3-wheel firefox-esr git smbclient
# Use compatible versions of Splinter and Selenium
-pip3 install --user selenium==4.2.0 splinter==0.17.0 pytest-splinter pytest-reporter-html1
+PIP_VERSION=$(dpkg-query -W -f '${Version}' python3-pip)
+PIP_OPTIONS=
+dpkg --compare-versions 23 \<= $PIP_VERSION && PIP_OPTIONS=--break-system-packages
+pip3 install $PIP_OPTIONS selenium==4.2.0 splinter==0.17.0 pytest-splinter pytest-reporter-html1
echo "Installing geckodriver"
(