Compare commits

...

58 Commits

Author SHA1 Message Date
James Valleroy
dd631c600f
Release v26.14 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-15 22:33:23 -04:00
James Valleroy
b34188b85a
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-15 22:28:14 -04:00
Dietmar
0d55fdc1cf
Translated using Weblate (German)
Currently translated at 99.3% (1943 of 1955 strings)
2026-10-15 17:51:22 +00:00
bittin1ddc447d824349b2
0faa737d3a
Translated using Weblate (Swedish)
Currently translated at 100.0% (1955 of 1955 strings)
2026-10-13 09:51:26 +00:00
Hosted Weblate user 54392
5c5c60b569
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 61.1% (1196 of 1955 strings)
2026-10-11 19:51:33 +02:00
Jiří Podhorecký
e7ff040f96
Translated using Weblate (Czech)
Currently translated at 100.0% (1955 of 1955 strings)
2026-10-11 19:51:31 +02:00
bittin1ddc447d824349b2
0afaad6565
Translated using Weblate (Swedish)
Currently translated at 99.9% (1954 of 1955 strings)
2026-10-10 18:51:25 +02:00
Jiří Podhorecký
57b308adf7
Translated using Weblate (Czech)
Currently translated at 99.7% (1951 of 1955 strings)
2026-10-10 18:51:23 +02:00
James Valleroy
b5bcdf3148
homeassistant: Minor spelling fix
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-10 07:46:23 -04:00
Sunil Mohan Adapa
e0685bbc44
homeassistant: Enable app properly on first install
- When app is installed for the first time, the drop-in configuration file
/etc/apache2/includes/home-assistant-freedombox.conf is not created properly.
This is because app.enable() is not being called and not all components are
enabled (including the drop-in configuration component). Fix this by calling
app.enable() in setup().

- Ensure that apache2 is restarted after the homeassistant app is update to
version 2 from version 1.

Tests:

- On a fresh VM, without the patch, installing HA does not result in working HA
UI. With patch, on a fresh VM. It works.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-10 07:46:20 -04:00
Sunil Mohan Adapa
5e72f3944a
homeassistant: Migrate to new HTTP configuration approach
- Without new HTTP configuration mechanism, proper configuration of HA fails.
This is because we don't setup the configuration before starting Home Assistant.
Home Assistant only migrates the old configuration to new configuration format
only on the first run. It also leaves a "repair" message to the user asking them
to remove the 'http' section from the configuration file.

- Write to the internal storage format of HA after verifying the version of the
format. Writing through API is hindered by the lack of an API token (which
apparently can't be obtained pragmatically).

Tests:

- Install without patches. configuration.yml contains http section. Home
Assistant not work as HTTP configuration is not set. Apply patches and restart
the service. The setup is run again. 'http' section in configuration.yml is
removed. /var/lib/home-assistant-freedombox/config/.storage/http contains the
required configuration keys with proper values. Home Assistant works (after
domain selection).

- Install freshly with patches. configuration.yml does not contain 'http'
section. /var/lib/home-assistant-freedombox/config/ contains the necessary
configuration changes. HA works after domain selection.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-10 07:46:15 -04:00
James Valleroy
27ff747cf0
backups: Run compact in cleanup
Tests:

- Enable scheduled backups for root and remote repo. Modify
  schedule.py so that backups and cleanup will run every 2
  minutes. Log shows compact command is run for both
  /var/lib/freedombox/borgbackup and mount location for remote
  repo. No errors shown in log.

Closes: #2380

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-10-08 15:22:01 -07:00
Oğuz Ersen
b739a1e831
Translated using Weblate (Turkish)
Currently translated at 100.0% (1955 of 1955 strings)
2026-10-08 07:51:22 +02:00
James Valleroy
e480e9d3be
Release v26.13 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-06 22:44:58 -04:00
James Valleroy
1b924610ee
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-06 22:43:50 -04:00
James Valleroy
951157062c
locale: Update strings for translation
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-06 22:25:44 -04:00
Sunil Mohan Adapa
6d9ff77e4b
storage: tests: Fix a failure from psutil change (Closes: #1149418)
Tests:

- On unstable container, the test fails before the patch and passes after.

- On stable, testing, and unstable containers, unit tests pass.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-06 22:18:19 -04:00
Sunil Mohan Adapa
49acf4fb5c
wireguard: Don't setup server implicitly
- When waiting after a auto-client-add operation, sometimes, it is not detected
that server connection exists. Then a new server setup is triggered and this
causes a duplicate wireguard server connection created. Fix this by making wait
operations strictly read-only.

- Also add more safety checks during waiting based one of the seen failures.

Tests:

- Functional tests work.

- Auto add client works much more reliably.

[jvalleroy: Update docstring]
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-06 06:59:53 -04:00
Sunil Mohan Adapa
8858774b35
wireguard: Fix issues with QR codes and config download
- Previous changes introduced a regression where QR codes and configuration
download stopped working. This is because of removal of private key from
session. Fix this.

- Provide the QR code and configuration download inline so that private key does
not have to stored in session.

- Provide separate QR code and configuration for each of the available
endpoints.

- Move the manual parameters into a separate table for each of the endpoints.
Make it look like this is only needed as the last option.

- Immediately add the client when the page is presented instead of additional
step (there is no use input needed).

- Tone down the warnings into simple text.

- Provide additional parameters in the manual configuration parameters tables to
make it easy to configure (based on the parameters configured on the WireGuard
app for Android). Use terminology that is used in app so that the fields can be
mapped easily by the user.

Tests:

- Functional tests work more reliably now.

- Clicking on the 'Add Client Automatically' creates the client successfully. A
new message is shown with client public key. The description looks good.

- Clicking on 'Download config file', 'Show QR code' and 'Show config
parameters' works. Downloaded configuration file works. QR code works too and
fills in expected parameters. Shown manual parameters are correct.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-10-06 06:59:46 -04:00
Sunil Mohan Adapa
176af3e85d
gitlab-ci: Set default artifact expiry to 3 months
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-10-04 08:44:54 -07:00
QuietCedar47
b8d0efeb5d
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 61.0% (1192 of 1954 strings)
2026-09-21 13:51:33 +02:00
James Valleroy
dc0c5752c9
Release v26.12 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-09-14 20:31:25 -04:00
James Valleroy
b9ccba85c3
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-09-14 20:29:12 -04:00
James Valleroy
c8fe0cd5ca
locale: Update translation strings
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-09-14 20:10:33 -04:00
Sunil Mohan Adapa
8f463c77ea
nextcloud: test: Fix functional tests with version 26
- Some changes in the 'New' menu and a new introduction animation broke the
functional tests. Fix this by updating the way elements are searched for in the
interface.

Tests:

- Functional tests for Nextcloud pass.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-09-14 20:08:23 -04:00
Daniel Nylander
cb54e79d30
Translated using Weblate (Swedish)
Currently translated at 100.0% (1954 of 1954 strings)
2026-09-09 18:47:38 +02:00
James Valleroy
133fbe7706
locale: Move lo to freedombox path
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:48:55 -04:00
Sunil Mohan Adapa
a39632e9c8
bin: Rename main binary from plinth to freedombox
- Rename manual page from plinth.1 to freedombox.1

Tests:

- Running 'make build install' and 'systemctl daemon-reload' and 'systemctl
restart plinth.service' works. Installing new app works.

- Spawning a new stable VM with the changes works. First wizard works.
Installing new app works.

- On a fresh Trixie machine, install freedombox. Then upgrade to a deb with
these changes. The service continues to work. Installing an app also works.
Binary is now /usr/bin/freedombox. /usr/bin/plinth works but it is a symlink to
/usr/bin/freedombox.

- Build a Debian package and install it on Trixie machine with freedombox
package installed. 'man plinth' works. 'man freedombox' works. Manual page
contents shows changes from 'plinth' to 'freedombox'. plinth.1.gz is a symlink
to freedombox.1.gz.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:40:56 -04:00
Sunil Mohan Adapa
06595e0a55
wireguard: Improve reliability functional tests by waiting after ops
Tests:

- Functional tests run much more reliably. Although there were several failures
still observed due to following reasons:

  - Due to FreedomBox service receiving SIGSEGV (presumably during NM DBus
  operations).

  - Error something like Invalid UTF-8: setting not known during removal of
  a client.

  - Unknown failures caused by newly added clients not showing up on the page.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:40:28 -04:00
Sunil Mohan Adapa
fa5c5706be
wireguard: Fix issues with newline in public key when adding client
- This does not effect the existing flow much but is a problem when waiting for
the public key to show up in list of peers.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:40:24 -04:00
Sunil Mohan Adapa
c99f35ad0e
wireguard: Fix auto-adding client when no domains are configured
- When no domains are configured, and .local domain is filtered out, an
exception is thrown by the auto-add client page.

- Don't filter out .local domain. It is still a valid endpoint for peers to
connect to.

- Instead of showing just one domain, show all the domains as endpoints to
connect to.

- Don't store private key in the session. It is retained for longer than
necessary and also sessions are stored on the disk.

Tests:

- Remove all configured domains from the system and click 'Add Client
Automatically' button. It throws an exception. With the patch, it works.

- The Add Client Automatically page shows all the domains as endpoints.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:40:02 -04:00
Sunil Mohan Adapa
5c2fe7a3d1
tags: tests: Fix functional tests broken by separate apps/add page
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:39:08 -04:00
Sunil Mohan Adapa
5f5cec695c
radicale: tests: Don't fail if Nextcloud is enabled
- When Nextcloud is enabled, /.well-known/{card,cal}dav URLs are taken over by
Nextcloud. So relying on them makes radicale fail. Instead just check for the
web interface to be available.

Tests:

- Enable Nextcloud and run radicale functional tests. Without the patch tests
fail and with the patch, tests succeed.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:38:53 -04:00
Sunil Mohan Adapa
8297e74398
radicale: Redirect from .well-known URLs only temporarily
- When Nextcloud is enabled, it takes over the .well-known URLs. We don't want
the redirect result to be cached resulting in wanted behavior.

Tests:

- curl -k https://192.168.122.87/.well-known/caldav and curl -k
https://192.168.122.87/.well-known/carddav results in 302 Found responses
instead of 301 permanent redirects.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:38:42 -04:00
Sunil Mohan Adapa
7a88c46bb2
errors: Rename PlinthError to FbxError
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:38:33 -04:00
Sunil Mohan Adapa
d144dce428
container: Fix failure with defining a new VM
- We write to a file and immediately this file is consumed by the virsh command.
If the file is not flushed, the virsh command will see an empty file.

Tests:

- Without the change, virsh fails with an error message that the definition file
is empty. With the change, the failure goes away.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:38:29 -04:00
Sunil Mohan Adapa
80dceb12f4
*: Miscellaneous changes to work with reduce the use of term 'plinth'
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:38:06 -04:00
Sunil Mohan Adapa
2782fba9bb
*: All other changes need for new import path
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:37:45 -04:00
Sunil Mohan Adapa
3af63bbf21
django: Rename DB tables from plinth_ to freedombox_
- Migration files have already been renamed from plinth/migrations/*.py to
freedombox/migrations/*.py. When running these migrations, ensure that database
tables are first created with plinth_* names rather than freedombox_*. This is
because we want the database progression path for fresh installations (with not
tables) as well as the old installation (with plinth_ tables) to be the same. To
achieve this, migrations.CreateModel will be provided with db_table=plinth_*
values.

- Ensure if a migration call (plinth, 0001_initial) ran, then the (freedombox,
0001_initial) is not run again. This is achieved by adding replaces = [] in the
newly renamed migration.

- Create a new migration that renames plinth_* tables to freedombox_*.

- Fix an old migration (0003) to use historic model rather than current model.
This ensure that it uses the plinth_ table during migration rather than
freedombox_ table.

Tests:

- Delete the database and start plinth.service with all the patches. Notice that
the database migration (fresh creation) works well. First setup, first wizard,
bepasty app installation, and notifications work as expected. Notice that
django_migrations table contains entries for (plinth,000[1-6]*) as well
as (freedombox,000[1-7]*).

- Delete the database and start plinth.service without the patches. Run first
setup and wizard. Install bepasty. Then apply the patches and restart
plinth.service. Notice that the database migration (renaming of tables) works
well. First setup is already done. First wizard is not shown. bepasty is shown
as installed. Previously shown notifications are retained . Notice that
django_migrations table contains entries for (plinth,000[1-6]*) as well
as (freedombox,000[1-7]*).

- Delete the database and start plinth.service from trixie version. Run first
setup and wizard. Install bepasty. Then apply the patches and restart
plinth.service. Notice that the database migration (renaming of tables) works
well. First setup is already done. First wizard is not shown. bepasty is shown
as installed. Previously shown notifications are retained . Notice that
django_migrations table contains entries for (plinth,000[1-6]*) as well
as (freedombox,000[1-7]*).

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:37:17 -04:00
Sunil Mohan Adapa
3587f49703
django: Changes for new import path
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:37:03 -04:00
Sunil Mohan Adapa
f192171e43
d/copyright: Update copyright file
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:36:57 -04:00
Sunil Mohan Adapa
65ba2704a0
*: Update additional documentation/comments with new import path
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:36:20 -04:00
Sunil Mohan Adapa
d128836d2f
doc/dev: Update developer documentation with new import path
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:36:11 -04:00
Sunil Mohan Adapa
5e17a84c8a
*: Update import path in modules-enabled configuration files
from plinth.* to freedombox.*

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:35:53 -04:00
Sunil Mohan Adapa
c700e0866e
*: Additional import path related changes
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:35:37 -04:00
Sunil Mohan Adapa
baa44e91a2
*: Update imports statements from plinth to freedombox
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:35:18 -04:00
Sunil Mohan Adapa
23b6aff290
plinth/*: Rename plinth/ folder to freedombox/
Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-28 07:35:01 -04:00
Bone NI
dd0161a7e5
Translated using Weblate (Lao)
Currently translated at 100.0% (1954 of 1954 strings)
2026-08-28 05:51:55 +00:00
Bone NI
a00a0b6f76
Added translation using Weblate (Lao) 2026-08-27 07:03:29 +02:00
Jiří Podhorecký
fe7f6da2b1
Translated using Weblate (Czech)
Currently translated at 100.0% (1954 of 1954 strings)
2026-08-22 22:51:28 +02:00
John Doe
be95bcbc9b
Translated using Weblate (French)
Currently translated at 100.0% (1954 of 1954 strings)
2026-08-22 22:51:24 +02:00
James Valleroy
9c8a808eaa
Release v26.11.1 to unstable
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-19 21:10:32 -04:00
James Valleroy
effe91a6d1
doc: Fetch latest manual
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-19 21:09:44 -04:00
Dietmar
ec78a93b4e
Translated using Weblate (German)
Currently translated at 99.3% (1942 of 1954 strings)
2026-08-20 02:46:20 +02:00
Sunil Mohan Adapa
b1cc874abb
apache: Stop installing uwsgi by default
Closes: Debian #1144740.

- When one of the applications such as bepasty, radicale, or searx need it, then
install it.

- Reduces the number of dependencies for freedombox package.

- Reduces size of the disk image.

- Ensures that uwsgi does not run on every freedombox machine.

- Apache's proxy_uwsgi module (provided by apache2-bin, apache2) can still be
enabled by default because uwsgi is not a dependency for the Apache module and
uwsgi socket connections are not attempted until specific configuration is
enabled and requests arrive.

- Change dependency from uwsgi-core to uwsgi. uwsgi-core does not have init
scripts but uwsgi package has init script (but only on trixie and not forky and
up). The init script is disabled and masked by bepasty, radicale, and searx
apps. So, this should not be a problem.

Tests:

- On a freshly installed Debian forky and trixie machines, install freedombox
deb package built with changes. Installation succeeds. uwsgi is not installed at
all. bepasty and radicale can be installed and basic requests to web UI work.
uwsgi init script is not started and is masked.

- Functional tests for bepasty and radicale work.

- On a Trixie machine, setup freedombox from trixie. Then install freedombox deb
package with the patch. uwsgi is not marked as manually installed and running
unattended-updates will remove it. Install bepasty and uwsgi package is
installed and marked as manually installed.

- On a Trixie machine, setup freedombox from trixie. Install the bepasty app.
Then install freedombox deb package with the patch. uwsgi is marked as manually
installed and running unattended-updates will not remove it.

Signed-off-by: Sunil Mohan Adapa <sunil@medhas.org>
Reviewed-by: James Valleroy <jvalleroy@mailbox.org>
2026-08-19 20:43:36 -04:00
Hosted Weblate user 54392
714abafb0c
Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 61.0% (1192 of 1954 strings)
2026-08-19 04:51:25 +02:00
Oğuz Ersen
1ae6eed009
Translated using Weblate (Turkish)
Currently translated at 100.0% (1954 of 1954 strings)
2026-08-19 04:51:24 +02:00
James Valleroy
b6e122816d
d/tests: Re-arrange test steps to help with debugging
Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
2026-08-17 19:52:04 -07:00
1414 changed files with 124939 additions and 107646 deletions

View File

@ -3,6 +3,10 @@ include:
- remote: https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml - remote: https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
- local: /.ci/functional-tests.yml - local: /.ci/functional-tests.yml
default:
artifacts:
expire_in: 3 mos
image: registry.salsa.debian.org/freedombox-team/freedombox:gitlabci image: registry.salsa.debian.org/freedombox-team/freedombox:gitlabci
stages: stages:

View File

@ -78,7 +78,7 @@ development environment inside a systemd-nspawn container.
1. To run unit and functional tests for an app: 1. To run unit and functional tests for an app:
```bash ```bash
host$ ./container run-tests --pytest-args -v --include-functional --splinter-headless plinth/modules/{app-name} host$ ./container run-tests --pytest-args -v --include-functional --splinter-headless freedombox/modules/{app-name}
``` ```
Drop the option `--splinter-headless` if you want to see the tests running Drop the option `--splinter-headless` if you want to see the tests running
@ -420,11 +420,12 @@ The easiest way to start translating is with your browser, by using
Your changes will automatically get pushed to the code repository. Your changes will automatically get pushed to the code repository.
Alternatively, you can directly edit the `.po` file in your language directory Alternatively, you can directly edit the `.po` file in your language directory
`Plinth/plinth/locale/` and create a pull request (see [CONTRIBUTING.md](CONTRIBUTING.md)). `freedombox/freedombox/locale/` and create a pull request (see
In that case, consider introducing yourself on #freedombox IRC (irc.debian.org), [CONTRIBUTING.md](CONTRIBUTING.md)). In that case, consider introducing yourself
because some work may have been done already on the [Debian translators on #freedombox IRC (irc.debian.org), because some work may have been done
discussion lists](https://www.debian.org/MailingLists/subscribe) already on the [Debian translators discussion
or the Weblate localization platform. lists](https://www.debian.org/MailingLists/subscribe) or the Weblate
localization platform.
For more information on translations: https://wiki.debian.org/FreedomBox/Translate For more information on translations: https://wiki.debian.org/FreedomBox/Translate
@ -449,16 +450,16 @@ options. See pytest documentation for further filter options.
```bash ```bash
# Run tests in a directory # Run tests in a directory
guest$ py.test-3 plinth/tests guest$ py.test-3 freedombox/tests
# Run tests in a module # Run tests in a module
guest$ py.test-3 plinth/tests/test_actions.py guest$ py.test-3 freedombox/tests/test_actions.py
# Run tests of one class in test module # Run tests of one class in test module
guest$ py.test-3 plinth/tests/test_actions.py::TestActions guest$ py.test-3 freedombox/tests/test_actions.py::TestActions
# Run one test in a class or module # Run one test in a class or module
guest$ py.test-3 plinth/tests/test_actions.py::TestActions::test_is_package_manager_busy guest$ py.test-3 freedombox/tests/test_actions.py::TestActions::test_is_package_manager_busy
``` ```
Some tests are skipped by default: Some tests are skipped by default:
@ -489,13 +490,13 @@ guest$ sudo EXTENDED_TESTING=1 py.test-3
To run the coverage tool in the container/VM: To run the coverage tool in the container/VM:
```bash ```bash
guest$ py.test-3 --cov=plinth guest$ py.test-3 --cov=freedombox
``` ```
To collect HTML report: To collect HTML report:
```bash ```bash
guest$ py.test-3 --cov=plinth --cov-report=html guest$ py.test-3 --cov=freedombox --cov-report=html
``` ```
Invoking this command generates a HTML report to the `htmlcov` directory. Invoking this command generates a HTML report to the `htmlcov` directory.
@ -519,7 +520,7 @@ executed (red).
Inside the container run Inside the container run
```bash ```bash
guest$ cd /freedombox ; sudo plinth/tests/functional/install.sh guest$ cd /freedombox ; sudo freedombox/tests/functional/install.sh
``` ```
##### For running tests inside the VM ##### For running tests inside the VM
@ -565,13 +566,14 @@ on the guest.
#### Setup FreedomBox Service for tests #### Setup FreedomBox Service for tests
Via Plinth, create a new user as follows: Via FreedomBox web interface, create a new user as follows:
* Username: tester * Username: tester
* Password: testingtesting * Password: testingtesting
This step is optional if a fresh install of Plinth is being tested. Functional This step is optional if a fresh install of FreedomBox is being tested.
tests will create the required user using FreedomBox's first boot process. Functional tests will create the required user using FreedomBox's first boot
process.
#### Running Functional Tests #### Running Functional Tests
@ -620,7 +622,7 @@ In the VM or container, run the following command:
``` ```
guest$ cd /freedombox guest$ cd /freedombox
guest$ sudo make build install guest$ sudo make build install
guest$ plinth/tests/functional/enable-all-apps guest$ freedombox/tests/functional/enable-all-apps
``` ```
[back to index](#hacking) [back to index](#hacking)

View File

@ -30,7 +30,7 @@ FreedomBox [Manual](https://wiki.debian.org/FreedomBox/Manual/)'s
2. Run FreedomBox Service (Plinth): 2. Run FreedomBox Service (Plinth):
``` ```
$ sudo plinth $ sudo systemctl start plinth.service
``` ```
3. Access FreedomBox UI: 3. Access FreedomBox UI:

View File

@ -58,14 +58,14 @@ FIND_ARGS := \
ROOT_DATA_FILES := $(shell find data -type f $(FIND_ARGS)) ROOT_DATA_FILES := $(shell find data -type f $(FIND_ARGS))
MODULE_DATA_FILES := $(shell find $(wildcard plinth/modules/*/data) -type f $(FIND_ARGS)) MODULE_DATA_FILES := $(shell find $(wildcard freedombox/modules/*/data) -type f $(FIND_ARGS))
update-translations: update-translations:
$(DJANGO_ADMIN) makemessages --all --domain django --keep-pot \ $(DJANGO_ADMIN) makemessages --all --domain django --keep-pot \
--verbosity=1 --ignore conftest.py --ignore doc --ignore build \ --verbosity=1 --ignore conftest.py --ignore doc --ignore build \
--ignore htmlcov --ignore screenshots --ignore debian --ignore \ --ignore htmlcov --ignore screenshots --ignore debian --ignore \
actions --ignore preseed --ignore static --ignore data \ actions --ignore preseed --ignore static --ignore data \
--settings plinth.settings --pythonpath . --settings freedombox.settings --pythonpath .
configure: configure:
# Nothing to do # Nothing to do
@ -78,7 +78,7 @@ build:
$(MAKE) -C doc -j 8 $(MAKE) -C doc -j 8
# Build .whl package # Build .whl package
rm -f dist/plinth-*.whl rm -f dist/freedombox-*.whl
$(PYTHON) -m build --no-isolation --skip-dependency-check --wheel $(PYTHON) -m build --no-isolation --skip-dependency-check --wheel
install: install:
@ -96,15 +96,15 @@ install:
# Python package # Python package
temp=$$(mktemp -d) && \ temp=$$(mktemp -d) && \
lib_dir=$$($(PYTHON) -c 'import sysconfig; print(sysconfig.get_paths(scheme="deb_system")["purelib"])') && \ lib_dir=$$($(PYTHON) -c 'import sysconfig; print(sysconfig.get_paths(scheme="deb_system")["purelib"])') && \
$(PYTHON) -m pip install dist/plinth-*.whl --break-system-packages \ $(PYTHON) -m pip install dist/freedombox-*.whl --break-system-packages \
--no-deps --no-compile --no-warn-script-location \ --no-deps --no-compile --no-warn-script-location \
--ignore-installed --target=$${temp} && \ --ignore-installed --target=$${temp} && \
$(INSTALL) -d $(DESTDIR)$${lib_dir} && \ $(INSTALL) -d $(DESTDIR)$${lib_dir} && \
rm -rf $(DESTDIR)$${lib_dir}/plinth $(DESTDIR)$${lib_dir}/plinth*.dist-info && \ rm -rf $(DESTDIR)$${lib_dir}/freedombox $(DESTDIR)$${lib_dir}/freedombox*.dist-info && \
mv $${temp}/plinth $${temp}/plinth*.dist-info $(DESTDIR)$${lib_dir} && \ mv $${temp}/freedombox $${temp}/freedombox*.dist-info $(DESTDIR)$${lib_dir} && \
rm -f $(DESTDIR)$${lib_dir}/plinth*.dist-info/licenses/COPYING.md && \ rm -f $(DESTDIR)$${lib_dir}/freedombox*.dist-info/licenses/COPYING.md && \
rm -f $(DESTDIR)$${lib_dir}/plinth*.dist-info/direct_url.json && \ rm -f $(DESTDIR)$${lib_dir}/freedombox*.dist-info/direct_url.json && \
$(INSTALL) -D -t $(BIN_DIR) bin/plinth $(INSTALL) -D -t $(BIN_DIR) bin/freedombox
$(INSTALL) -D -t $(LIB_DIR)/freedombox bin/freedombox-privileged $(INSTALL) -D -t $(LIB_DIR)/freedombox bin/freedombox-privileged
$(INSTALL) -D -t $(BIN_DIR) bin/freedombox-cmd $(INSTALL) -D -t $(BIN_DIR) bin/freedombox-cmd
$(INSTALL) -D -t $(BIN_DIR) bin/freedombox-change-password $(INSTALL) -D -t $(BIN_DIR) bin/freedombox-change-password
@ -121,7 +121,7 @@ install:
cp $(CP_ARGS) $${file} $${target} ; \ cp $(CP_ARGS) $${file} $${target} ; \
done done
for file in $(MODULE_DATA_FILES) ; do \ for file in $(MODULE_DATA_FILES) ; do \
target=$$(dirname $(DESTDIR)$$(echo $${file} | sed -e 's|^plinth/modules/[^/]*/data||')) ; \ target=$$(dirname $(DESTDIR)$$(echo $${file} | sed -e 's|^freedombox/modules/[^/]*/data||')) ; \
$(INSTALL) --directory --mode=755 $${target} ; \ $(INSTALL) --directory --mode=755 $${target} ; \
cp $(CP_ARGS) $${file} $${target} ; \ cp $(CP_ARGS) $${file} $${target} ; \
done done
@ -137,12 +137,12 @@ check-tests:
# Tests with coverage report # Tests with coverage report
check-tests-cov: check-tests-cov:
$(PYTHON) -m pytest $(PYTEST_ARGS) --cov=plinth \ $(PYTHON) -m pytest $(PYTEST_ARGS) --cov=freedombox \
--cov-report=html:./htmlcov --cov-report=term --cov-report=html:./htmlcov --cov-report=term
# Code quality checking using flake8 # Code quality checking using flake8
check-code: check-code:
$(PYTHON) -m flake8 plinth container $(PYTHON) -m flake8 freedombox container
# Static type checking using mypy # Static type checking using mypy
check-type: check-type:
@ -154,8 +154,8 @@ check-doc:
clean: clean:
make -C doc clean make -C doc clean
rm -rf Plinth.egg-info rm -rf Freedombox.egg-info
find plinth/locale -name *.mo -delete find freedombox/locale -name *.mo -delete
define DEVELOP_SERVICE_CONF define DEVELOP_SERVICE_CONF
[Service] [Service]

5
Vagrantfile vendored
View File

@ -17,15 +17,12 @@ Vagrant.configure(2) do |config|
config.vm.provision "shell", run: 'always', inline: <<-SHELL config.vm.provision "shell", run: 'always', inline: <<-SHELL
# Disable automatic upgrades # Disable automatic upgrades
echo -e 'APT::Periodic::Update-Package-Lists "0";\nAPT::Periodic::Unattended-Upgrade "0";' > //etc/apt/apt.conf.d/20auto-upgrades echo -e 'APT::Periodic::Update-Package-Lists "0";\nAPT::Periodic::Unattended-Upgrade "0";' > //etc/apt/apt.conf.d/20auto-upgrades
# Do not run system plinth
systemctl stop plinth
systemctl disable plinth
SHELL SHELL
config.vm.provision "shell", inline: <<-SHELL config.vm.provision "shell", inline: <<-SHELL
cd /freedombox/ cd /freedombox/
make provision-dev make provision-dev
SHELL SHELL
config.vm.provision "tests", run: "never", type: "shell", path: "plinth/tests/functional/install.sh" config.vm.provision "tests", run: "never", type: "shell", path: "freedombox/tests/functional/install.sh"
config.vm.post_up_message = "FreedomBox virtual machine is ready config.vm.post_up_message = "FreedomBox virtual machine is ready
for development. To get the IP address: for development. To get the IP address:
$ vagrant ssh $ vagrant ssh

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
import plinth.__main__ import freedombox.__main__
plinth.__main__.main() freedombox.__main__.main()

View File

@ -11,14 +11,14 @@ import argparse
import getpass import getpass
import sys import sys
import plinth.web_framework import freedombox.web_framework
from plinth.modules.users import privileged from freedombox.modules.users import privileged
def main(): def main():
"""Ask for new password, setup Django and update a user's password.""" """Ask for new password, setup Django and update a user's password."""
try: try:
plinth.web_framework.init() freedombox.web_framework.init()
except Exception: except Exception:
_print('Error initializing Django.') _print('Error initializing Django.')
return return

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
import plinth.privileged_daemon import freedombox.privileged_daemon
plinth.privileged_daemon.client_main() freedombox.privileged_daemon.client_main()

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3 #!/usr/bin/python3
# SPDX-License-Identifier: AGPL-3.0-or-later # SPDX-License-Identifier: AGPL-3.0-or-later
import plinth.privileged_daemon import freedombox.privileged_daemon
plinth.privileged_daemon.main() freedombox.privileged_daemon.main()

View File

@ -233,10 +233,10 @@ DEBIAN_FRONTEND=noninteractive apt-get -yq --with-new-pkgs upgrade
# Install requirements for tests if not already installed as root # Install requirements for tests if not already installed as root
if ! [[ -e /usr/local/bin/geckodriver ]] if ! [[ -e /usr/local/bin/geckodriver ]]
then then
/freedombox/plinth/tests/functional/install.sh /freedombox/freedombox/tests/functional/install.sh
fi fi
# Run the plinth server if functional tests are requested # Wait for the server to start if functional tests are requested
if [[ "{pytest_command}" =~ "--include-functional" ]] if [[ "{pytest_command}" =~ "--include-functional" ]]
then then
make -C /freedombox wait-while-first-setup make -C /freedombox wait-while-first-setup
@ -1392,6 +1392,7 @@ class VM(Machine):
with tempfile.NamedTemporaryFile() as file_handle: with tempfile.NamedTemporaryFile() as file_handle:
file_handle.write(domain_xml.encode()) file_handle.write(domain_xml.encode())
file_handle.flush()
logger.info('Running `virsh define %s`', file_handle.name) logger.info('Running `virsh define %s`', file_handle.name)
self._virsh(['define', file_handle.name], self._virsh(['define', file_handle.name],
stdout=subprocess.DEVNULL) stdout=subprocess.DEVNULL)

View File

@ -39,9 +39,9 @@
</If> </If>
## ##
## Redirect traffic on home to /freedombox as part of turning the machine ## Redirect traffic on home to /freedombox as part of turning the machine into
## into FreedomBox server. Plinth then acts as a portal to reach all ## FreedomBox server. FreedomBox then acts as a portal to reach all other
## other services. ## services.
## ##
<IfFile !/etc/apache2/conf-enabled/freedombox-apache-homepage.conf> <IfFile !/etc/apache2/conf-enabled/freedombox-apache-homepage.conf>
RedirectMatch "^/$" "/freedombox" RedirectMatch "^/$" "/freedombox"
@ -58,7 +58,7 @@
<Location /freedombox> <Location /freedombox>
ProxyPass http://127.0.0.1:8000/freedombox ProxyPass http://127.0.0.1:8000/freedombox
ProxyPreserveHost On ProxyPreserveHost On
## Send the scheme from user's request to enable Plinth to redirect ## Send the scheme from user's request to enable FreedomBox to redirect
## URLs, set cookies, set absolute URLs (if any) properly. ## URLs, set cookies, set absolute URLs (if any) properly.
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS RequestHeader set X-Forwarded-Proto 'https' env=HTTPS

View File

@ -2,7 +2,7 @@
[Unit] [Unit]
Description=FreedomBox Service (Plinth) Description=FreedomBox Service (Plinth)
Documentation=man:plinth(1) Documentation=man:freedombox(1)
After=network.target After=network.target
StartLimitIntervalSec=0 StartLimitIntervalSec=0
# Uploaded files in /var/tmp/ are shared with FreedomBox privileged service. # Uploaded files in /var/tmp/ are shared with FreedomBox privileged service.
@ -10,7 +10,7 @@ JoinsNamespaceOf=freedombox-privileged.service
[Service] [Service]
Type=notify Type=notify
ExecStart=/usr/bin/plinth ExecStart=/usr/bin/freedombox
TimeoutSec=300s TimeoutSec=300s
Restart=on-failure Restart=on-failure
RestartSec=5 RestartSec=5

110
debian/changelog vendored
View File

@ -1,3 +1,113 @@
freedombox (26.14) unstable; urgency=medium
[ Oğuz Ersen ]
* Translated using Weblate (Turkish)
[ James Valleroy ]
* backups: Run compact in cleanup
* homeassistant: Minor spelling fix
* doc: Fetch latest manual
[ Sunil Mohan Adapa ]
* homeassistant: Migrate to new HTTP configuration approach
* homeassistant: Enable app properly on first install
[ Jiří Podhorecký ]
* Translated using Weblate (Czech)
[ bittin1ddc447d824349b2 ]
* Translated using Weblate (Swedish)
[ Hosted Weblate user 54392 ]
* Translated using Weblate (Chinese (Simplified Han script))
[ Dietmar ]
* Translated using Weblate (German)
-- James Valleroy <jvalleroy@mailbox.org> Thu, 15 Oct 2026 22:29:56 -0400
freedombox (26.13) unstable; urgency=medium
[ QuietCedar47 ]
* Translated using Weblate (Chinese (Simplified Han script))
[ Sunil Mohan Adapa ]
* gitlab-ci: Set default artifact expiry to 3 months
* wireguard: Fix issues with QR codes and config download
* wireguard: Don't setup server implicitly
* storage: tests: Fix a failure from psutil change (Closes: #1149418)
[ James Valleroy ]
* locale: Update strings for translation
* doc: Fetch latest manual
-- James Valleroy <jvalleroy@mailbox.org> Tue, 06 Oct 2026 22:44:25 -0400
freedombox (26.12) unstable; urgency=medium
[ John Doe ]
* Translated using Weblate (French)
[ Jiří Podhorecký ]
* Translated using Weblate (Czech)
[ Bone NI ]
* Added translation using Weblate (Lao)
* Translated using Weblate (Lao)
[ Sunil Mohan Adapa ]
* plinth/*: Rename plinth/ folder to freedombox/
* *: Update imports statements from plinth to freedombox
* *: Additional import path related changes
* *: Update import path in modules-enabled configuration files
* doc/dev: Update developer documentation with new import path
* *: Update additional documentation/comments with new import path
* d/copyright: Update copyright file
* django: Changes for new import path
* django: Rename DB tables from plinth_ to freedombox_
* *: All other changes need for new import path
* *: Miscellaneous changes to work with reduce the use of term 'plinth'
* container: Fix failure with defining a new VM
* errors: Rename PlinthError to FbxError
* radicale: Redirect from .well-known URLs only temporarily
* radicale: tests: Don't fail if Nextcloud is enabled
* tags: tests: Fix functional tests broken by separate apps/add page
* wireguard: Fix auto-adding client when no domains are configured
* wireguard: Fix issues with newline in public key when adding client
* wireguard: Improve reliability functional tests by waiting after ops
* bin: Rename main binary from plinth to freedombox
* nextcloud: test: Fix functional tests with version 26
[ James Valleroy ]
* locale: Move lo to freedombox path
* locale: Update translation strings
* doc: Fetch latest manual
[ Daniel Nylander ]
* Translated using Weblate (Swedish)
-- James Valleroy <jvalleroy@mailbox.org> Mon, 14 Sep 2026 20:30:46 -0400
freedombox (26.11.1) unstable; urgency=medium
[ James Valleroy ]
* d/tests: Re-arrange test steps to help with debugging
* doc: Fetch latest manual
[ Oğuz Ersen ]
* Translated using Weblate (Turkish)
[ Hosted Weblate user 54392 ]
* Translated using Weblate (Chinese (Simplified Han script))
[ Sunil Mohan Adapa ]
* apache: Stop installing uwsgi by default (Closes: #1144740)
[ Dietmar ]
* Translated using Weblate (German)
-- James Valleroy <jvalleroy@mailbox.org> Wed, 19 Aug 2026 21:09:59 -0400
freedombox (26.11) unstable; urgency=medium freedombox (26.11) unstable; urgency=medium
[ Burak Yavuz ] [ Burak Yavuz ]

170
debian/copyright vendored
View File

@ -5,8 +5,8 @@ Files: *
Copyright: 2011-2026 FreedomBox Authors Copyright: 2011-2026 FreedomBox Authors
License: AGPL-3+ License: AGPL-3+
Files: plinth/modules/jsxc/static/icons/jsxc.png Files: freedombox/modules/jsxc/static/icons/jsxc.png
plinth/modules/jsxc/static/icons/jsxc.svg freedombox/modules/jsxc/static/icons/jsxc.svg
Copyright: 2011-2019 FreedomBox Authors Copyright: 2011-2019 FreedomBox Authors
License: AGPL-3+ License: AGPL-3+
@ -42,42 +42,42 @@ Copyright: 2011-2025 The Bootstrap Authors
Comment: https://getbootstrap.com/docs/5.3/customize/color-modes/ Comment: https://getbootstrap.com/docs/5.3/customize/color-modes/
License: CC-BY-3.0 License: CC-BY-3.0
Files: plinth/modules/bepasty/static/icons/bepasty.svg Files: freedombox/modules/bepasty/static/icons/bepasty.svg
Copyright: (c) 2014 by the Bepasty Team, see the AUTHORS file. Copyright: (c) 2014 by the Bepasty Team, see the AUTHORS file.
Comment: https://github.com/bepasty/bepasty-server/blob/master/src/bepasty/static/app/bepasty.svg Comment: https://github.com/bepasty/bepasty-server/blob/master/src/bepasty/static/app/bepasty.svg
License: BSD-2-clause License: BSD-2-clause
Files: plinth/modules/cockpit/static/icons/cockpit.svg Files: freedombox/modules/cockpit/static/icons/cockpit.svg
Copyright: Cockpit Authors (https://github.com/cockpit-project/cockpit/blob/master/AUTHORS) Copyright: Cockpit Authors (https://github.com/cockpit-project/cockpit/blob/master/AUTHORS)
Comment: https://github.com/cockpit-project/cockpit/blob/master/src/branding/default/logo.svg Comment: https://github.com/cockpit-project/cockpit/blob/master/src/branding/default/logo.svg
License: LGPL-2.1+ License: LGPL-2.1+
Files: plinth/modules/coturn/static/icons/coturn.png Files: freedombox/modules/coturn/static/icons/coturn.png
plinth/modules/coturn/static/icons/coturn.svg freedombox/modules/coturn/static/icons/coturn.svg
Copyright: Kmg Design (https://thenounproject.com/kmgdesignid/) Copyright: Kmg Design (https://thenounproject.com/kmgdesignid/)
Comment: Video Call by Kmg Design from the Noun Project https://thenounproject.com/term/video-call/3256092/ Comment: Video Call by Kmg Design from the Noun Project https://thenounproject.com/term/video-call/3256092/
License: CC-BY-3.0-US License: CC-BY-3.0-US
Files: plinth/modules/deluge/static/icons/deluge.png Files: freedombox/modules/deluge/static/icons/deluge.png
plinth/modules/deluge/static/icons/deluge.svg freedombox/modules/deluge/static/icons/deluge.svg
Copyright: 2007 Andrew Wedderburn Copyright: 2007 Andrew Wedderburn
Comment: https://commons.wikimedia.org/wiki/File:Deluge-Logo.svg Comment: https://commons.wikimedia.org/wiki/File:Deluge-Logo.svg
License: GPL-2+ License: GPL-2+
Files: plinth/modules/ejabberd/static/icons/ejabberd.png Files: freedombox/modules/ejabberd/static/icons/ejabberd.png
plinth/modules/ejabberd/static/icons/ejabberd.svg freedombox/modules/ejabberd/static/icons/ejabberd.svg
plinth/modules/email/static/icons/email.png freedombox/modules/email/static/icons/email.png
plinth/modules/email/static/icons/email.svg freedombox/modules/email/static/icons/email.svg
plinth/modules/gnome/static/icons/gnome.png freedombox/modules/gnome/static/icons/gnome.png
plinth/modules/gnome/static/icons/gnome.svg freedombox/modules/gnome/static/icons/gnome.svg
plinth/modules/matrixsynapse/static/icons/matrixsynapse.svg freedombox/modules/matrixsynapse/static/icons/matrixsynapse.svg
plinth/modules/privoxy/static/icons/privoxy.png freedombox/modules/privoxy/static/icons/privoxy.png
plinth/modules/privoxy/static/icons/privoxy.svg freedombox/modules/privoxy/static/icons/privoxy.svg
plinth/modules/radicale/static/icons/radicale.svg freedombox/modules/radicale/static/icons/radicale.svg
plinth/modules/rssbridge/static/icons/rssbridge.png freedombox/modules/rssbridge/static/icons/rssbridge.png
plinth/modules/rssbridge/static/icons/rssbridge.svg freedombox/modules/rssbridge/static/icons/rssbridge.svg
plinth/modules/zoph/static/icons/zoph.png freedombox/modules/zoph/static/icons/zoph.png
plinth/modules/zoph/static/icons/zoph.svg freedombox/modules/zoph/static/icons/zoph.svg
static/themes/default/img/application.svg static/themes/default/img/application.svg
static/themes/default/img/network-connection.svg static/themes/default/img/network-connection.svg
static/themes/default/img/network-connection-vertical.svg static/themes/default/img/network-connection-vertical.svg
@ -100,109 +100,109 @@ Copyright: 2020 Adwaita Icon Theme Authors, GNOME Project
Comment: https://github.com/GNOME/adwaita-icon-theme/ http://www.gnome.org Comment: https://github.com/GNOME/adwaita-icon-theme/ http://www.gnome.org
License: LGPL-3 or CC-BY-SA-3.0-US License: LGPL-3 or CC-BY-SA-3.0-US
Files: plinth/modules/featherwiki/static/icons/featherwiki.png Files: freedombox/modules/featherwiki/static/icons/featherwiki.png
plinth/modules/featherwiki/static/icons/featherwiki.svg freedombox/modules/featherwiki/static/icons/featherwiki.svg
Copyright: 2022 Robbie Antenesse <dev@alamantus.com> Copyright: 2022 Robbie Antenesse <dev@alamantus.com>
Comment: https://codeberg.org/Alamantus/FeatherWiki/src/branch/main/logo.svg Comment: https://codeberg.org/Alamantus/FeatherWiki/src/branch/main/logo.svg
License: AGPL-3+ License: AGPL-3+
Files: plinth/modules/gitweb/static/icons/gitweb.png Files: freedombox/modules/gitweb/static/icons/gitweb.png
plinth/modules/gitweb/static/icons/gitweb.svg freedombox/modules/gitweb/static/icons/gitweb.svg
Copyright: 2010 Git Authors Copyright: 2010 Git Authors
Comment: https://github.com/git/git/blob/master/gitweb/static/git-logo.png Comment: https://github.com/git/git/blob/master/gitweb/static/git-logo.png
License: GPL-2 License: GPL-2
Files: plinth/modules/homeassistant/static/icons/homeassistant.png Files: freedombox/modules/homeassistant/static/icons/homeassistant.png
plinth/modules/homeassistant/static/icons/homeassistant.svg freedombox/modules/homeassistant/static/icons/homeassistant.svg
Copyright: Home Assistant Core Developers Copyright: Home Assistant Core Developers
Comment: https://github.com/home-assistant/core/blob/dev/tests/components/image_upload/logo.png Comment: https://github.com/home-assistant/core/blob/dev/tests/components/image_upload/logo.png
License: Apache-2.0 License: Apache-2.0
Files: plinth/modules/ikiwiki/static/icons/ikiwiki.png Files: freedombox/modules/ikiwiki/static/icons/ikiwiki.png
plinth/modules/ikiwiki/static/icons/ikiwiki.svg freedombox/modules/ikiwiki/static/icons/ikiwiki.svg
Copyright: 2006 Recai Oktaş <roktas@debian.org> Copyright: 2006 Recai Oktaş <roktas@debian.org>
Comment: https://commons.wikimedia.org/wiki/File:Ikiwiki.svg Comment: https://commons.wikimedia.org/wiki/File:Ikiwiki.svg
License: GPL-2+ License: GPL-2+
Files: plinth/modules/infinoted/static/icons/infinoted.png Files: freedombox/modules/infinoted/static/icons/infinoted.png
plinth/modules/infinoted/static/icons/infinoted.svg freedombox/modules/infinoted/static/icons/infinoted.svg
Copyright: 2008-2014 Armin Burgmeier <armin@arbur.net> Copyright: 2008-2014 Armin Burgmeier <armin@arbur.net>
License: ISC License: ISC
Files: plinth/modules/janus/static/icons/janus.png Files: freedombox/modules/janus/static/icons/janus.png
plinth/modules/janus/static/icons/janus.svg freedombox/modules/janus/static/icons/janus.svg
plinth/modules/janus/static/janus-video-room.css freedombox/modules/janus/static/janus-video-room.css
plinth/modules/janus/static/janus-video-room.js freedombox/modules/janus/static/janus-video-room.js
plinth/modules/janus/templates/janus_video_room.html freedombox/modules/janus/templates/janus_video_room.html
Copyright: 2014-2025 Meetecho Copyright: 2014-2025 Meetecho
License: GPL-3 with OpenSSL exception License: GPL-3 with OpenSSL exception
Files: plinth/modules/kiwix/static/icons/kiwix.png Files: freedombox/modules/kiwix/static/icons/kiwix.png
plinth/modules/kiwix/static/icons/kiwix.svg freedombox/modules/kiwix/static/icons/kiwix.svg
Copyright: 2020 The other Kiwix guy Copyright: 2020 The other Kiwix guy
Comment: https://commons.wikimedia.org/wiki/File:Kiwix_logo_v3.svg Comment: https://commons.wikimedia.org/wiki/File:Kiwix_logo_v3.svg
License: CC-BY-SA-4.0 License: CC-BY-SA-4.0
Files: plinth/modules/matrixsynapse/static/icons/matrixsynapse.png Files: freedombox/modules/matrixsynapse/static/icons/matrixsynapse.png
Copyright: 2017 Kishan Raval Copyright: 2017 Kishan Raval
Comment: https://github.com/thekishanraval/Logos Comment: https://github.com/thekishanraval/Logos
License: GPL-3+ License: GPL-3+
Files: plinth/modules/mediawiki/static/icons/mediawiki.png Files: freedombox/modules/mediawiki/static/icons/mediawiki.png
plinth/modules/mediawiki/static/icons/mediawiki.svg freedombox/modules/mediawiki/static/icons/mediawiki.svg
Copyright: 2020 Serhio Magpie Copyright: 2020 Serhio Magpie
Comment: https://commons.wikimedia.org/wiki/File:MediaWiki-2020-icon.svg Comment: https://commons.wikimedia.org/wiki/File:MediaWiki-2020-icon.svg
License: CC-BY-SA-4.0 License: CC-BY-SA-4.0
Files: plinth/modules/minetest/static/icons/minetest.png Files: freedombox/modules/minetest/static/icons/minetest.png
Copyright: 2011 erlehmann Copyright: 2011 erlehmann
License: CC-BY-SA-3.0 License: CC-BY-SA-3.0
Files: plinth/modules/minetest/static/icons/minetest.svg Files: freedombox/modules/minetest/static/icons/minetest.svg
Copyright: 2015 Calinou, Nils Dagsson Moskopp Copyright: 2015 Calinou, Nils Dagsson Moskopp
Comment: https://github.com/luanti-org/luanti/blob/master/misc/luanti.svg Comment: https://github.com/luanti-org/luanti/blob/master/misc/luanti.svg
License: CC-BY-SA-3.0 License: CC-BY-SA-3.0
Files: plinth/modules/miniflux/static/icons/miniflux.png Files: freedombox/modules/miniflux/static/icons/miniflux.png
plinth/modules/miniflux/static/icons/miniflux.svg freedombox/modules/miniflux/static/icons/miniflux.svg
Copyright: 2018, 2019 Frédéric Guillot Copyright: 2018, 2019 Frédéric Guillot
Comment: https://github.com/miniflux/logo Comment: https://github.com/miniflux/logo
License: CC-BY-SA-4.0 License: CC-BY-SA-4.0
Files: plinth/modules/mumble/static/icons/mumble.png Files: freedombox/modules/mumble/static/icons/mumble.png
Copyright: 2009 Martin Skilnand Copyright: 2009 Martin Skilnand
Comment: https://commons.wikimedia.org/wiki/File:Icons_mumble.svg Comment: https://commons.wikimedia.org/wiki/File:Icons_mumble.svg
License: BSD-3-clause License: BSD-3-clause
Files: plinth/modules/mumble/static/icons/mumble.svg Files: freedombox/modules/mumble/static/icons/mumble.svg
Copyright: 2005-2019 The Mumble Developers Copyright: 2005-2019 The Mumble Developers
Comment: https://github.com/mumble-voip/mumble/blob/master/icons/mumble.svg Comment: https://github.com/mumble-voip/mumble/blob/master/icons/mumble.svg
https://github.com/mumble-voip/mumble/blob/master/LICENSE https://github.com/mumble-voip/mumble/blob/master/LICENSE
License: BSD-3-clause License: BSD-3-clause
Files: plinth/modules/nextcloud/static/icons/nextcloud.png Files: freedombox/modules/nextcloud/static/icons/nextcloud.png
plinth/modules/nextcloud/static/icons/nextcloud.svg freedombox/modules/nextcloud/static/icons/nextcloud.svg
Copyright: 2016 Nextcloud GmbH. Copyright: 2016 Nextcloud GmbH.
Comment: https://nextcloud.com/trademarks/ Comment: https://nextcloud.com/trademarks/
License: AGPL-3+ License: AGPL-3+
Files: plinth/modules/openvpn/static/icons/openvpn.png Files: freedombox/modules/openvpn/static/icons/openvpn.png
Copyright: 2017 Kishan Raval Copyright: 2017 Kishan Raval
Comment: https://github.com/thekishanraval/Logos Comment: https://github.com/thekishanraval/Logos
License: GPL-3+ License: GPL-3+
Files: plinth/modules/openvpn/static/icons/openvpn.svg Files: freedombox/modules/openvpn/static/icons/openvpn.svg
Copyright: OpenVPN Technologies, Inc. Copyright: OpenVPN Technologies, Inc.
Comment: https://commons.wikimedia.org/wiki/File:Ovpntech_logo-s_REVISED.png Comment: https://commons.wikimedia.org/wiki/File:Ovpntech_logo-s_REVISED.png
License: CC-BY-SA-3.0 License: CC-BY-SA-3.0
Files: plinth/modules/quassel/static/icons/quassel.png Files: freedombox/modules/quassel/static/icons/quassel.png
plinth/modules/quassel/static/icons/quassel.svg freedombox/modules/quassel/static/icons/quassel.svg
Copyright: 2005-2019 Quassel Project <devel@quassel-irc.org> Copyright: 2005-2019 Quassel Project <devel@quassel-irc.org>
Comment: https://github.com/quassel/quassel/blob/master/pics/quassel-64.svg Comment: https://github.com/quassel/quassel/blob/master/pics/quassel-64.svg
License: GPL-2 or GPL-3 License: GPL-2 or GPL-3
Files: plinth/modules/radicale/static/icons/radicale.png Files: freedombox/modules/radicale/static/icons/radicale.png
Copyright: 2008, Nicolas Kandel Copyright: 2008, Nicolas Kandel
2008, Pascal Halter 2008, Pascal Halter
2008-2017, Guillaume Ayoub <guillaume.ayoub@kozea.fr> 2008-2017, Guillaume Ayoub <guillaume.ayoub@kozea.fr>
@ -210,7 +210,7 @@ Copyright: 2008, Nicolas Kandel
2017, Unrud <unrud@outlook.com> 2017, Unrud <unrud@outlook.com>
License: GPL-3+ License: GPL-3+
Files: plinth/modules/roundcube/static/icons/roundcube.png Files: freedombox/modules/roundcube/static/icons/roundcube.png
Copyright: 2000 Edmund Grimley Evans <edmundo@rano.org> Copyright: 2000 Edmund Grimley Evans <edmundo@rano.org>
2013 Thomas Yu - Sian, Liu 2013 Thomas Yu - Sian, Liu
Copyright (C) 2005-2017, The Roundcube Dev Team Copyright (C) 2005-2017, The Roundcube Dev Team
@ -218,21 +218,21 @@ Copyright: 2000 Edmund Grimley Evans <edmundo@rano.org>
2005-2007, Jon Abernathy <jon@chuggnutt.com> 2005-2007, Jon Abernathy <jon@chuggnutt.com>
License: GPL-3+ License: GPL-3+
Files: plinth/modules/roundcube/static/icons/roundcube.svg Files: freedombox/modules/roundcube/static/icons/roundcube.svg
Copyright: Thomas B. (https://github.com/thomascube) Copyright: Thomas B. (https://github.com/thomascube)
Aleksander Machniak (https://github.com/alecpl) Aleksander Machniak (https://github.com/alecpl)
Comment: https://raw.githubusercontent.com/roundcube/roundcubemail/master/skins/elastic/images/logo.svg Comment: https://raw.githubusercontent.com/roundcube/roundcubemail/master/skins/elastic/images/logo.svg
License: CC-BY-SA-3.0 License: CC-BY-SA-3.0
Files: plinth/modules/samba/static/icons/samba.png Files: freedombox/modules/samba/static/icons/samba.png
plinth/modules/samba/static/icons/samba.svg freedombox/modules/samba/static/icons/samba.svg
Copyright: None Copyright: None
Comment: 2010 Samba Team Comment: 2010 Samba Team
https://commons.wikimedia.org/wiki/File:Samba_logo_2010.svg https://commons.wikimedia.org/wiki/File:Samba_logo_2010.svg
License: public-domain License: public-domain
Files: plinth/modules/searx/static/icons/searx.png Files: freedombox/modules/searx/static/icons/searx.png
plinth/modules/searx/static/icons/searx.svg freedombox/modules/searx/static/icons/searx.svg
Copyright: Copyright:
2013-2017 Adam Tauber <asciimoo@gmail.com> 2013-2017 Adam Tauber <asciimoo@gmail.com>
2016 Alexandre Flament <alex@al-f.net> 2016 Alexandre Flament <alex@al-f.net>
@ -240,84 +240,84 @@ Copyright:
2014 Thomas Pointhuber <thomas.pointhuber@gmx.at> 2014 Thomas Pointhuber <thomas.pointhuber@gmx.at>
License: AGPL-3+ License: AGPL-3+
Files: plinth/modules/shaarli/static/icons/shaarli.png Files: freedombox/modules/shaarli/static/icons/shaarli.png
plinth/modules/shaarli/static/icons/shaarli.svg freedombox/modules/shaarli/static/icons/shaarli.svg
Copyright: 2011-2015 Sébastien SAUVAGE <sebsauvage@sebsauvage.net> Copyright: 2011-2015 Sébastien SAUVAGE <sebsauvage@sebsauvage.net>
2011-2018 The Shaarli Community 2011-2018 The Shaarli Community
Comment: https://github.com/shaarli/Shaarli/blob/master/doc/md/images/doc-logo.svg Comment: https://github.com/shaarli/Shaarli/blob/master/doc/md/images/doc-logo.svg
https://github.com/shaarli/Shaarli/blob/master/assets/default/img/favicon.png https://github.com/shaarli/Shaarli/blob/master/assets/default/img/favicon.png
License: Zlib License: Zlib
Files: plinth/modules/shadowsocks/static/icons/shadowsocks.png Files: freedombox/modules/shadowsocks/static/icons/shadowsocks.png
plinth/modules/shadowsocksserver/static/icons/shadowsocks.png freedombox/modules/shadowsocksserver/static/icons/shadowsocks.png
Copyright: 2014-2018 Symeon Huang (librehat) <hzwhuang@gmail.com> Copyright: 2014-2018 Symeon Huang (librehat) <hzwhuang@gmail.com>
Comment: https://commons.wikimedia.org/wiki/File:Shadowsocks_logo.png Comment: https://commons.wikimedia.org/wiki/File:Shadowsocks_logo.png
License: LGPL-3+ License: LGPL-3+
Files: plinth/modules/shadowsocks/static/icons/shadowsocks.svg Files: freedombox/modules/shadowsocks/static/icons/shadowsocks.svg
plinth/modules/shadowsocksserver/static/icons/shadowsocks.svg freedombox/modules/shadowsocksserver/static/icons/shadowsocks.svg
Copyright: Clowwindy Copyright: Clowwindy
Comment: https://commons.wikimedia.org/wiki/File:Shadowsocks-Logo.svg Comment: https://commons.wikimedia.org/wiki/File:Shadowsocks-Logo.svg
License: Apache-2.0 License: Apache-2.0
Files: plinth/modules/sharing/static/icons/sharing.png Files: freedombox/modules/sharing/static/icons/sharing.png
plinth/modules/sharing/static/icons/sharing.svg freedombox/modules/sharing/static/icons/sharing.svg
Copyright: Interface (https://www.shareicon.net/author/interface) Copyright: Interface (https://www.shareicon.net/author/interface)
Comment: https://www.shareicon.net/universal-interface-interface-sharing-share-697502 Comment: https://www.shareicon.net/universal-interface-interface-sharing-share-697502
License: CC-BY-3.0 License: CC-BY-3.0
Files: plinth/modules/sogo/static/icons/sogo.png Files: freedombox/modules/sogo/static/icons/sogo.png
plinth/modules/sogo/static/icons/sogo.svg freedombox/modules/sogo/static/icons/sogo.svg
Copyright: 2024 Inverse inc./Alinto Copyright: 2024 Inverse inc./Alinto
Comment: https://github.com/Alinto/sogo/blob/master/COPYING.GPL Comment: https://github.com/Alinto/sogo/blob/master/COPYING.GPL
License: GPL-2 License: GPL-2
Files: plinth/modules/syncthing/static/icons/syncthing.png Files: freedombox/modules/syncthing/static/icons/syncthing.png
Copyright: 2015 Jack Palevich <jack.palevich@gmail.com> Copyright: 2015 Jack Palevich <jack.palevich@gmail.com>
2014 The Syncthing Authors 2014 The Syncthing Authors
2015 Audrius Butkevicius and Contributors 2015 Audrius Butkevicius and Contributors
License: MPL-2.0 License: MPL-2.0
Files: plinth/modules/syncthing/static/icons/syncthing.svg Files: freedombox/modules/syncthing/static/icons/syncthing.svg
Copyright: Jakob Borg and the Syncthing project Copyright: Jakob Borg and the Syncthing project
Comment: https://commons.wikimedia.org/wiki/File:SyncthingLogoHorizontal.svg Comment: https://commons.wikimedia.org/wiki/File:SyncthingLogoHorizontal.svg
License: MPL-2.0 License: MPL-2.0
Files: plinth/modules/tiddlywiki/static/icons/tiddlywiki.svg Files: freedombox/modules/tiddlywiki/static/icons/tiddlywiki.svg
plinth/modules/tiddlywiki/static/icons/tiddlywiki.png freedombox/modules/tiddlywiki/static/icons/tiddlywiki.png
Copyright: 2004-2007 Jeremy Ruston <jeremy@jermolene.com> Copyright: 2004-2007 Jeremy Ruston <jeremy@jermolene.com>
2007-2016 UnaMesa Association 2007-2016 UnaMesa Association
Comment: https://github.com/Jermolene/TiddlyWiki5/blob/086506012d98e9db34c7d96dc27aea249a9bdbc8/editions/introduction/tiddlers/images/Motovun%20Jack.svg Comment: https://github.com/Jermolene/TiddlyWiki5/blob/086506012d98e9db34c7d96dc27aea249a9bdbc8/editions/introduction/tiddlers/images/Motovun%20Jack.svg
License: BSD-3-clause License: BSD-3-clause
Files: plinth/modules/tor/static/icons/tor.png Files: freedombox/modules/tor/static/icons/tor.png
plinth/modules/tor/static/icons/tor.svg freedombox/modules/tor/static/icons/tor.svg
Copyright: The Tor Project, Inc. Copyright: The Tor Project, Inc.
Comment: https://commons.wikimedia.org/wiki/File:Tor_logo1.png Comment: https://commons.wikimedia.org/wiki/File:Tor_logo1.png
https://commons.wikimedia.org/wiki/File:Tor-logo-2011-flat.svg https://commons.wikimedia.org/wiki/File:Tor-logo-2011-flat.svg
License: CC-BY-3.0-US License: CC-BY-3.0-US
Files: plinth/modules/transmission/static/icons/transmission.png Files: freedombox/modules/transmission/static/icons/transmission.png
plinth/modules/transmission/static/icons/transmission.svg freedombox/modules/transmission/static/icons/transmission.svg
Copyright: Transmission Authors Copyright: Transmission Authors
Comment: https://github.com/transmission/transmission/blob/master/gtk/icons/hicolor_apps_scalable_transmission.svg Comment: https://github.com/transmission/transmission/blob/master/gtk/icons/hicolor_apps_scalable_transmission.svg
License: GPL-3 License: GPL-3
Files: plinth/modules/upgrades/data/usr/share/augeas/lenses/aptsources.aug Files: freedombox/modules/upgrades/data/usr/share/augeas/lenses/aptsources.aug
plinth/modules/upgrades/data/usr/share/augeas/lenses/tests/test_aptsources.aug freedombox/modules/upgrades/data/usr/share/augeas/lenses/tests/test_aptsources.aug
Copyright: 2007-2025 David Lutterkort Copyright: 2007-2025 David Lutterkort
Comment: https://github.com/hercules-team/augeas/blob/master/lenses/aptsources.aug Comment: https://github.com/hercules-team/augeas/blob/master/lenses/aptsources.aug
https://github.com/hercules-team/augeas/blob/master/lenses/tests/test_aptsources.aug https://github.com/hercules-team/augeas/blob/master/lenses/tests/test_aptsources.aug
License: LGPL-2.1+ License: LGPL-2.1+
Files: plinth/modules/wordpress/static/icons/wordpress.png Files: freedombox/modules/wordpress/static/icons/wordpress.png
plinth/modules/wordpress/static/icons/wordpress.svg freedombox/modules/wordpress/static/icons/wordpress.svg
Copyright: 2011-2021 WordPress Contributors Copyright: 2011-2021 WordPress Contributors
Comment: https://github.com/WordPress/wordpress-develop/blob/master/src/wp-admin/images/wordpress-logo.svg Comment: https://github.com/WordPress/wordpress-develop/blob/master/src/wp-admin/images/wordpress-logo.svg
License: GPL-2+ License: GPL-2+
Files: plinth/modules/wireguard/static/icons/wireguard.png Files: freedombox/modules/wireguard/static/icons/wireguard.png
plinth/modules/wireguard/static/icons/wireguard.svg freedombox/modules/wireguard/static/icons/wireguard.svg
Copyright: 2019 WireGuard LLC Copyright: 2019 WireGuard LLC
Comment: https://git.zx2c4.com/wireguard-windows/plain/ui/icon/wireguard.svg Comment: https://git.zx2c4.com/wireguard-windows/plain/ui/icon/wireguard.svg
License: Expat License: Expat

2
debian/freedombox.links vendored Normal file
View File

@ -0,0 +1,2 @@
usr/bin/freedombox usr/bin/plinth
usr/share/man/man1/freedombox.1.gz usr/share/man/man1/plinth.1.gz

View File

@ -1,20 +1,19 @@
# Apache configuration for the Plinth itself is shipped with proper # Apache configuration for the FreedomBox service itself is shipped with proper
# name plinth.conf. However, due to the nature of the package, Plinth # name freedombox.conf. However, due to the nature of the package, FreedomBox
# takes the responsibility of configuring various other services # takes the responsibility of configuring various other services behind Apache.
# behind Apache. The upstream hence ships various Apache # The upstream hence ships various Apache configuration files which are enabled
# configuration files which are enabled and disabled when user # and disabled when user requests.
# requests.
freedombox binary: non-standard-apache2-configuration-name * freedombox binary: non-standard-apache2-configuration-name *
# Plinth depends on Apache2 and cannot work with just any web server. Instead of # FreedomBox depends on Apache2 and cannot work with just any web server.
# being a simple web application it is an administration console that configures # Instead of being a simple web application it is an administration console that
# web servers. At some point we would like to work with other web servers but # configures web servers. At some point we would like to work with other web
# that requires significant effort. # servers but that requires significant effort.
freedombox binary: web-application-works-only-with-apache freedombox binary: web-application-works-only-with-apache
# Not documentation # Not documentation
freedombox: package-contains-documentation-outside-usr-share-doc [usr/share/plinth/static/jslicense.html] freedombox: package-contains-documentation-outside-usr-share-doc [usr/share/plinth/static/jslicense.html]
freedombox: package-contains-documentation-outside-usr-share-doc [usr/lib/python3/dist-packages/plinth-*.dist-info/top_level.txt] freedombox: package-contains-documentation-outside-usr-share-doc [usr/lib/python3/dist-packages/freedombox-*.dist-info/top_level.txt]
# This executable is meant to executed from systemd service file and is not # This executable is meant to executed from systemd service file and is not
# meant for user. However, don't install to /usr/libexec and follow systemd # meant for user. However, don't install to /usr/libexec and follow systemd

View File

@ -1,2 +1,2 @@
./doc/freedombox-cmd.1 ./doc/freedombox-cmd.1
./doc/plinth.1 ./doc/freedombox.1

View File

@ -22,17 +22,17 @@ for _ in $(seq 1 120); do
done done
# Print final status in test log # Print final status in test log
cat /tmp/fbx_status.json cat /tmp/fbx_status.json || true
rm -f /tmp/fbx_status.json rm -f /tmp/fbx_status.json
if [ "$SETUP_COMPLETE" -eq 0 ]; then
echo "Error: first-boot setup did not complete in the allotted time." >&2
exit 1
fi
journalctl --unit=plinth --unit=freedombox-privileged journalctl --unit=plinth --unit=freedombox-privileged
# Access FreedomBox interface # Access FreedomBox interface
curl --location --cookie "" --fail --write-out "%{response_code}" --insecure \ curl --location --cookie "" --fail --write-out "%{response_code}" --insecure \
--stderr - https://localhost/freedombox/ --stderr - https://localhost/freedombox/
if [ "$SETUP_COMPLETE" -eq 0 ]; then
echo "Error: first-boot setup did not complete in the allotted time." >&2
exit 1
fi

View File

@ -1,5 +1,5 @@
# #
# Smoke test to check various basics on an installed version of Plinth. This # Smoke test to check various basics on an installed version of FreedomBox. This
# checks that the following aspects are working okay: # checks that the following aspects are working okay:
# - Python runtime # - Python runtime
# - Python library dependencies # - Python library dependencies
@ -13,7 +13,7 @@ Restrictions: needs-root, breaks-testbed
# #
# Run unit and integration tests on installed files. # Run unit and integration tests on installed files.
# #
Test-Command: PYTHONPATH='/usr/lib/python3/dist-packages/' py.test-3 -p no:cacheprovider --cov=plinth --cov-report=html:debci/htmlcov --cov-report=term Test-Command: PYTHONPATH='/usr/lib/python3/dist-packages/' py.test-3 -p no:cacheprovider --cov=freedombox --cov-report=html:debci/htmlcov --cov-report=term
Depends: e2fsprogs, git, python3-pytest, python3-pytest-cov, python3-pytest-django, @ Depends: e2fsprogs, git, python3-pytest, python3-pytest-cov, python3-pytest-django, @
Restrictions: breaks-testbed Restrictions: breaks-testbed

View File

@ -13,7 +13,7 @@ SCRIPTS_DIR=scripts
manual-pdfs=$(foreach lang,$(MANUAL_LANGUAGES),manual/$(lang)/freedombox-manual.pdf) manual-pdfs=$(foreach lang,$(MANUAL_LANGUAGES),manual/$(lang)/freedombox-manual.pdf)
manual-xmls=$(patsubst %.pdf,%.xml,$(manual-pdfs)) manual-xmls=$(patsubst %.pdf,%.xml,$(manual-pdfs))
OUTPUTS=$(manual-pdfs) plinth.1 freedombox-cmd.1 OUTPUTS=$(manual-pdfs) freedombox.1 freedombox-cmd.1
INSTALL_OPTS=-D --mode=644 INSTALL_OPTS=-D --mode=644
@ -33,7 +33,7 @@ endif
all: $(OUTPUTS) manual-pages all: $(OUTPUTS) manual-pages
install: all install: all
install $(INSTALL_OPTS) -t $(MAN_INSTALL_DIR)/man1 plinth.1 install $(INSTALL_OPTS) -t $(MAN_INSTALL_DIR)/man1 freedombox.1
for file in $(manual-pages-part-html) $(manual-pdfs); do \ for file in $(manual-pages-part-html) $(manual-pdfs); do \
install $(INSTALL_OPTS) -t $(INSTALL_DIR)/$$(dirname $${file}) \ install $(INSTALL_OPTS) -t $(INSTALL_DIR)/$$(dirname $${file}) \
$${file} ; \ $${file} ; \

View File

@ -20,7 +20,7 @@ from datetime import datetime
import django import django
sys.path.insert(0, os.path.abspath('../../')) sys.path.insert(0, os.path.abspath('../../'))
os.environ['DJANGO_SETTINGS_MODULE'] = 'plinth.settings' os.environ['DJANGO_SETTINGS_MODULE'] = 'freedombox.settings'
django.setup() django.setup()
# -- Project information ----------------------------------------------------- # -- Project information -----------------------------------------------------

View File

@ -6,5 +6,5 @@ Action Utils
Several utilities to help with the implementation of actions and diagnostic Several utilities to help with the implementation of actions and diagnostic
tests are implemented in this module. tests are implemented in this module.
.. automodule:: plinth.action_utils .. automodule:: freedombox.action_utils
:members: :members:

View File

@ -1,16 +1,14 @@
.. SPDX-License-Identifier: CC-BY-SA-4.0 .. SPDX-License-Identifier: CC-BY-SA-4.0
Actions Privileged Actions
^^^^^^^ ^^^^^^^^^^^^^^^^^^
FreedomBox's web front does not directly change any aspect of the underlying FreedomBox Service performs most changes to the underlying operating system
operating system. Instead, it calls upon **actions**, as shell commands. Actions using remote calls into the **freedombox-privileged** daemon or other daemons
live in ``/usr/share/plinth/actions`` directory. They require no interaction such as NetworkManager and UDisks.
beyond passing command line arguments or taking sensitive arguments via stdin.
They change the operation of the services and apps of the FreedomBox and nothing
else. These actions are also directly usable by a skilled administrator.
The following documentation for the ``actions`` module. The following documentation for the ``actions`` module which contains function
decorators to mark a method to run with privileged permissions.
.. automodule:: plinth.actions .. automodule:: freedombox.actions
:members: privileged :members: privileged

View File

@ -3,5 +3,5 @@
App App
--- ---
.. autoclass:: plinth.app.App .. autoclass:: freedombox.app.App
:members: :members:

View File

@ -3,5 +3,5 @@
Backups Backups
^^^^^^^ ^^^^^^^
.. autoclass:: plinth.modules.backups.components.BackupRestore .. autoclass:: freedombox.modules.backups.components.BackupRestore
:members: :members:

View File

@ -3,5 +3,5 @@
Configuration Configuration
^^^^^^^^^^^^^ ^^^^^^^^^^^^^
.. autoclass:: plinth.config.DropinConfigs .. autoclass:: freedombox.config.DropinConfigs
:members: :members:

View File

@ -3,5 +3,5 @@
Container Container
^^^^^^^^^ ^^^^^^^^^
.. autoclass:: plinth.container.Container .. autoclass:: freedombox.container.Container
:members: :members:

View File

@ -3,8 +3,8 @@
Coturn Coturn
^^^^^^ ^^^^^^
.. autoclass:: plinth.modules.coturn.components.TurnConsumer .. autoclass:: freedombox.modules.coturn.components.TurnConsumer
:members: :members:
.. autoclass:: plinth.modules.coturn.components.TurnConfiguration .. autoclass:: freedombox.modules.coturn.components.TurnConfiguration
:members: :members:

View File

@ -3,11 +3,11 @@
Daemon Daemon
^^^^^^ ^^^^^^
.. autoclass:: plinth.daemon.Daemon .. autoclass:: freedombox.daemon.Daemon
:members: :members:
.. autoclass:: plinth.daemon.RelatedDaemon .. autoclass:: freedombox.daemon.RelatedDaemon
:members: :members:
.. autoclass:: plinth.daemon.SharedDaemon .. autoclass:: freedombox.daemon.SharedDaemon
:members: :members:

View File

@ -3,8 +3,8 @@
Domain Name Domain Name
^^^^^^^^^^^ ^^^^^^^^^^^
.. autoclass:: plinth.modules.names.components.DomainName .. autoclass:: freedombox.modules.names.components.DomainName
:members: :members:
.. autoclass:: plinth.modules.names.components.DomainType .. autoclass:: freedombox.modules.names.components.DomainType
:members: :members:

View File

@ -3,5 +3,5 @@
EnableState EnableState
^^^^^^^^^^^ ^^^^^^^^^^^
.. autoclass:: plinth.app.EnableState .. autoclass:: freedombox.app.EnableState
:members: :members:

View File

@ -3,8 +3,8 @@
Firewall Firewall
^^^^^^^^ ^^^^^^^^
.. autoclass:: plinth.modules.firewall.components.Firewall .. autoclass:: freedombox.modules.firewall.components.Firewall
:members: :members:
.. autoclass:: plinth.modules.firewall.components.FirewallLocalProtection .. autoclass:: freedombox.modules.firewall.components.FirewallLocalProtection
:members: :members:

View File

@ -3,5 +3,5 @@
Frontpage Frontpage
^^^^^^^^^ ^^^^^^^^^
.. autoclass:: plinth.frontpage.Shortcut .. autoclass:: freedombox.frontpage.Shortcut
:members: :members:

View File

@ -27,20 +27,20 @@ Components
Base Classes Base Classes
^^^^^^^^^^^^ ^^^^^^^^^^^^
.. autoclass:: plinth.app.Component .. autoclass:: freedombox.app.Component
:members: :members:
.. autoclass:: plinth.app.LeaderComponent .. autoclass:: freedombox.app.LeaderComponent
:members: :members:
.. autoclass:: plinth.app.FollowerComponent .. autoclass:: freedombox.app.FollowerComponent
:members: :members:
Other Classes Other Classes
^^^^^^^^^^^^^ ^^^^^^^^^^^^^
.. autoclass:: plinth.diagnostic_check.DiagnosticCheck .. autoclass:: freedombox.diagnostic_check.DiagnosticCheck
:members: :members:
.. autoclass:: plinth.diagnostic_check.Result .. autoclass:: freedombox.diagnostic_check.Result
:members: :members:

View File

@ -3,5 +3,5 @@
Info Info
^^^^ ^^^^
.. autoclass:: plinth.app.Info .. autoclass:: freedombox.app.Info
:members: :members:

View File

@ -3,5 +3,5 @@
Let's Encrypt Let's Encrypt
^^^^^^^^^^^^^ ^^^^^^^^^^^^^
.. autoclass:: plinth.modules.letsencrypt.components.LetsEncrypt .. autoclass:: freedombox.modules.letsencrypt.components.LetsEncrypt
:members: :members:

View File

@ -3,5 +3,5 @@
Menu Menu
^^^^ ^^^^
.. autoclass:: plinth.menu.Menu .. autoclass:: freedombox.menu.Menu
:members: :members:

View File

@ -3,5 +3,5 @@
Packages Packages
^^^^^^^^ ^^^^^^^^
.. autoclass:: plinth.package.Packages .. autoclass:: freedombox.package.Packages
:members: :members:

View File

@ -3,5 +3,5 @@
StaticFiles StaticFiles
^^^^^^^^^^^ ^^^^^^^^^^^
.. autoclass:: plinth.web_server.StaticFiles .. autoclass:: freedombox.web_server.StaticFiles
:members: :members:

View File

@ -3,5 +3,5 @@
Users Users
^^^^^ ^^^^^
.. autoclass:: plinth.modules.users.components.UsersAndGroups .. autoclass:: freedombox.modules.users.components.UsersAndGroups
:members: :members:

View File

@ -3,8 +3,8 @@
Webserver Webserver
^^^^^^^^^ ^^^^^^^^^
.. autoclass:: plinth.modules.apache.components.Webserver .. autoclass:: freedombox.modules.apache.components.Webserver
:members: :members:
.. autoclass:: plinth.modules.apache.components.WebserverRoot .. autoclass:: freedombox.modules.apache.components.WebserverRoot
:members: :members:

View File

@ -3,8 +3,8 @@
Forms Forms
----- -----
.. autoclass:: plinth.forms.DomainSelectionForm .. autoclass:: freedombox.forms.DomainSelectionForm
:members: :members:
.. autoclass:: plinth.forms.CheckboxSelectMultipleWithReadOnly .. autoclass:: freedombox.forms.CheckboxSelectMultipleWithReadOnly
:members: :members:

View File

@ -3,5 +3,5 @@
Notification Notification
^^^^^^^^^^^^ ^^^^^^^^^^^^
.. autoclass:: plinth.notification.Notification .. autoclass:: freedombox.notification.Notification
:members: :members:

View File

@ -3,5 +3,5 @@
Views Views
----- -----
.. autoclass:: plinth.views.AppView .. autoclass:: freedombox.views.AppView
:members: :members:

View File

@ -6,56 +6,56 @@ Full Code
Transmission app is already included in FreedomBox. Here is the full source for Transmission app is already included in FreedomBox. Here is the full source for
the module for reference. the module for reference.
plinth/modules/transmission/__init__.py freedombox/modules/transmission/__init__.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/__init__.py .. literalinclude:: ../../../freedombox/modules/transmission/__init__.py
:language: python3 :language: python3
plinth/modules/transmission/forms.py freedombox/modules/transmission/forms.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/forms.py .. literalinclude:: ../../../freedombox/modules/transmission/forms.py
:language: python3 :language: python3
plinth/modules/transmission/manifest.py freedombox/modules/transmission/manifest.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/manifest.py .. literalinclude:: ../../../freedombox/modules/transmission/manifest.py
:language: python3 :language: python3
plinth/modules/transmission/privileged.py freedombox/modules/transmission/privileged.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/privileged.py
:language: python3
plinth/modules/transmission/urls.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/urls.py
:language: python3
plinth/modules/transmission/views.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/views.py
:language: python3
plinth/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission
:language: text
plinth/modules/transmission/data/usr/share/freedombox/etc/apache2/conf-available/transmission-plinth.conf
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/data/usr/share/freedombox/etc/apache2/conf-available/transmission-plinth.conf
:language: apache
plinth/modules/transmission/tests/__init__.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/tests/__init__.py .. literalinclude:: ../../../freedombox/modules/transmission/privileged.py
:language: python3
freedombox/modules/transmission/urls.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../freedombox/modules/transmission/urls.py
:language: python3
freedombox/modules/transmission/views.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../freedombox/modules/transmission/views.py
:language: python3
freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission
:language: text
freedombox/modules/transmission/data/usr/share/freedombox/etc/apache2/conf-available/transmission-plinth.conf
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../freedombox/modules/transmission/data/usr/share/freedombox/etc/apache2/conf-available/transmission-plinth.conf
:language: apache
freedombox/modules/transmission/tests/__init__.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../freedombox/modules/transmission/tests/__init__.py
:language: python3 :language: python3

View File

@ -3,11 +3,11 @@
Part 4: Components Part 4: Components
------------------ ------------------
Each :class:`~plinth.app.App` contains various :class:`~plinth.app.Component` Each :class:`~freedombox.app.App` contains various
components that each provide one small functionality needed by the app. Each of :class:`~freedombox.app.Component` components that each provide one small
these components are instantiated and added to the app as children. The functionality needed by the app. Each of these components are instantiated and
:class:`~plinth.menu.Menu` object added in the previous step is one such added to the app as children. The :class:`~freedombox.menu.Menu` object added in
component. the previous step is one such component.
Providing basic information about the app Providing basic information about the app
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -20,7 +20,7 @@ function normally.
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from plinth import app as app_module from freedombox import app as app_module
from . import manifest from . import manifest
@ -44,7 +44,7 @@ needs to be called again. name, icon_filename, description, manual_page,
clients, and tags provide information that is shown on the app's main page. The clients, and tags provide information that is shown on the app's main page. The
donation_url encourages our users to contribute to upstream projects in order donation_url encourages our users to contribute to upstream projects in order
ensure their long term sustainability. More information about the parameters is ensure their long term sustainability. More information about the parameters is
available in :class:`~plinth.app.Info` class documentation. available in :class:`~freedombox.app.Info` class documentation.
The description of app should provide basic information on what the app is about The description of app should provide basic information on what the app is about
and how to use it. It is impractical, however, to explain everything about the and how to use it. It is impractical, however, to explain everything about the
@ -82,13 +82,13 @@ running in the system to work. When the app is enabled, the daemon should be
enabled. When the app is disabled, the daemon should be disabled. We should also enabled. When the app is disabled, the daemon should be disabled. We should also
show the status of whether the daemon is running in the app's view. All of these show the status of whether the daemon is running in the app's view. All of these
concerns are automatically handled by the framework if a concerns are automatically handled by the framework if a
:class:`~plinth.daemon.Daemon` component is added to the app. Let us do that in :class:`~freedombox.daemon.Daemon` component is added to the app. Let us do that
our app's class. in our app's class.
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth.daemon import Daemon from freedombox.daemon import Daemon
class TransmissionApp(app_module.App): class TransmissionApp(app_module.App):
... ...
@ -101,8 +101,8 @@ our app's class.
self.add(daemon) self.add(daemon)
The first argument to instantiate the :class:`~plinth.daemon.Daemon` class is a The first argument to instantiate the :class:`~freedombox.daemon.Daemon` class
unique ID. The second is the name of the `systemd is a unique ID. The second is the name of the `systemd
<https://www.freedesktop.org/wiki/Software/systemd/>`_ unit file which manages <https://www.freedesktop.org/wiki/Software/systemd/>`_ unit file which manages
the daemon. The final argument is the list of ports that this daemon listens on. the daemon. The final argument is the list of ports that this daemon listens on.
This information is used to check if the daemon is listening on the expected This information is used to check if the daemon is listening on the expected
@ -113,14 +113,14 @@ Package management
Transmission server is installed through a set of packages fetched from Debian Transmission server is installed through a set of packages fetched from Debian
package repositories. The packages required for this are passed on to a package repositories. The packages required for this are passed on to a
:class:`~plinth.package.Packages` component which takes care of installing, :class:`~freedombox.package.Packages` component which takes care of installing,
upgrading and uninstalling the Debian packages. An app might require one or more upgrading and uninstalling the Debian packages. An app might require one or more
Debian packages to be installed. Debian packages to be installed.
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth.package import Packages from freedombox.package import Packages
class TransmissionApp(app_module.App): class TransmissionApp(app_module.App):
@ -146,13 +146,13 @@ write a configuration snippet for Apache, the default web server on FreedomBox.
This configuration snippet needs to be activated when our app is enabled. The This configuration snippet needs to be activated when our app is enabled. The
configuration snippet needs to be deactivated when our app is disabled. All of configuration snippet needs to be deactivated when our app is disabled. All of
these concerns are automatically handled by the framework if a these concerns are automatically handled by the framework if a
:class:`~plinth.modules.apache.components.Webserver` component is added to the :class:`~freedombox.modules.apache.components.Webserver` component is added to
app. Let us do that in our app's class. the app. Let us do that in our app's class.
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth.modules.apache.components import Webserver from freedombox.modules.apache.components import Webserver
class TransmissionApp(app_module.App): class TransmissionApp(app_module.App):
... ...
@ -165,13 +165,13 @@ app. Let us do that in our app's class.
self.add(webserver) self.add(webserver)
The first argument to instantiate the The first argument to instantiate the
:class:`~plinth.modules.apache.components.Webserver` class is a unique ID. The :class:`~freedombox.modules.apache.components.Webserver` class is a unique ID.
second is the name of the Apache2 web server configuration snippet that contains The second is the name of the Apache2 web server configuration snippet that
the directives to proxy Transmission web interface via Apache2. We then need to contains the directives to proxy Transmission web interface via Apache2. We then
create the configuration file itself in ``transmission-plinth.conf``. The need to create the configuration file itself in ``transmission-plinth.conf``.
final argument is the list of URLs that the app exposes to the users of the app. The final argument is the list of URLs that the app exposes to the users of the
This information is used to check if the URLs are accessible as expected when app. This information is used to check if the URLs are accessible as expected
the user requests diagnostic tests on the app. when the user requests diagnostic tests on the app.
Simply creating and shipping a configuration file into ``/etc`` folder creates Simply creating and shipping a configuration file into ``/etc`` folder creates
some hassles. Consider the following scenario: a debian package, either some hassles. Consider the following scenario: a debian package, either
@ -181,13 +181,13 @@ debian package provides a newer version of the configuration file with, say,
more tweaks. As a result, a configuration file prompt is shown to the user more tweaks. As a result, a configuration file prompt is shown to the user
during package upgrade process. In case of unattended upgrades, the package is during package upgrade process. In case of unattended upgrades, the package is
not upgraded at all. To avoid such problems, FreedomBox provides the not upgraded at all. To avoid such problems, FreedomBox provides the
:class:`~plinth.config.DropinConfigs` component. Let us add it in our app's :class:`~freedombox.config.DropinConfigs` component. Let us add it in our app's
class. class.
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth.config import DropinConfigs from freedombox.config import DropinConfigs
class TransmissionApp(app_module.App): class TransmissionApp(app_module.App):
... ...
@ -200,9 +200,9 @@ class.
]) ])
self.add(dropin_configs) self.add(dropin_configs)
The first argument to instantiate the :class:`~plinth.config.DropinConfigs` The first argument to instantiate the :class:`~freedombox.config.DropinConfigs`
class is the unique ID. The second argument is the list of configuration files class is the unique ID. The second argument is the list of configuration files
as paths is ``/etc/``. The :class:`~plinth.config.DropinConfigs` component as paths is ``/etc/``. The :class:`~freedombox.config.DropinConfigs` component
requires that a file be shipped into ``/usr/share/freedombox/etc`` instead of requires that a file be shipped into ``/usr/share/freedombox/etc`` instead of
``/etc``. The component will handle the creation of a symlink from ``/usr`` path ``/etc``. The component will handle the creation of a symlink from ``/usr`` path
to ``/etc`` path. To ship the file, we can simply create file in the ``data/`` to ``/etc`` path. To ship the file, we can simply create file in the ``data/``
@ -231,13 +231,13 @@ special port since the web ports are always kept open. However, it is still good
to specify that we operate on http/https ports so that users can be provided to specify that we operate on http/https ports so that users can be provided
this information along with additional information on whether the service is this information along with additional information on whether the service is
available over Internet. Create the available over Internet. Create the
:class:`~plinth.modules.firewall.components.Firewall` component during app :class:`~freedombox.modules.firewall.components.Firewall` component during app
initialization. initialization.
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth.modules.firewall.components import Firewall from freedombox.modules.firewall.components import Firewall
class TransmissionApp(app_module.App): class TransmissionApp(app_module.App):
... ...
@ -268,7 +268,7 @@ with the FreedomBox framework in ``__init.py__``.
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth.modules.users.components import UsersAndGroups from freedombox.modules.users.components import UsersAndGroups
class TransmissionApp(app_module.App): class TransmissionApp(app_module.App):
... ...
@ -303,12 +303,12 @@ since only they can configure the app. Other users who have access to this app
should have a way of discovering the app. This is done by providing a link in should have a way of discovering the app. This is done by providing a link in
the front page of FreedomBox web interface. This is the page that user's see the front page of FreedomBox web interface. This is the page that user's see
when they visit FreedomBox. To provide this shortcut, a when they visit FreedomBox. To provide this shortcut, a
:class:`~plinth.frontpage.Shortcut` component can added to the app. :class:`~freedombox.frontpage.Shortcut` component can added to the app.
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth import frontpage from freedombox import frontpage
group = ('bit-torrent', 'Download files using BitTorrent applications') group = ('bit-torrent', 'Download files using BitTorrent applications')
@ -344,15 +344,15 @@ Each app in FreedomBox needs to provide the ability to backup and restore its
configuration and data. Apart from providing durability to users' data, this configuration and data. Apart from providing durability to users' data, this
allows the user to migrate from one machine to another. FreedomBox framework allows the user to migrate from one machine to another. FreedomBox framework
provides a component for handling these operations. Create the provides a component for handling these operations. Create the
:class:`~plinth.modules.backups.components.BackupRestore` component during app :class:`~freedombox.modules.backups.components.BackupRestore` component during
initialization. app initialization.
In ``__init__.py``, add: In ``__init__.py``, add:
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth.modules.backups.components import BackupRestore from freedombox.modules.backups.components import BackupRestore
from . import manifest from . import manifest

View File

@ -101,7 +101,7 @@ the user submits it. Let us implement that in ``views.py``.
from django.contrib import messages from django.contrib import messages
from plinth import actions, views from freedombox import actions, views
from .forms import TransmissionForm from .forms import TransmissionForm
@ -161,8 +161,8 @@ for transmission daemon. We will do this by creating a file ``privileged.py``.
import json import json
import pathlib import pathlib
from plinth import action_utils from freedombox import action_utils
from plinth.actions import privileged from freedombox.actions import privileged
_transmission_config = pathlib.Path('/etc/transmission-daemon/settings.json') _transmission_config = pathlib.Path('/etc/transmission-daemon/settings.json')
@ -187,8 +187,8 @@ for transmission daemon. We will do this by creating a file ``privileged.py``.
action_utils.service_reload('transmission-daemon') action_utils.service_reload('transmission-daemon')
This is a simple Python3 module but it runs in a separate process with superuser This is a simple Python3 module but it runs in a separate process with superuser
privileges due to the :meth:`plinth.actions.privileged` decorator. All such privileges due to the :meth:`freedombox.actions.privileged` decorator. All such
methods must have full type annotations for the method parameters. Further, the methods must have full type annotations for the method parameters. Further, the
parameters and return value must be JSON serializable. It may use various helper parameters and return value must be JSON serializable. It may use various helper
utilities provided by the FreedomBox framework in :obj:`plinth.action_utils` to utilities provided by the FreedomBox framework in :obj:`freedombox.action_utils`
easily perform it's duties. to easily perform it's duties.

View File

@ -13,9 +13,9 @@ 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. calling the diagnostics method and displaying the list in a formatted manner.
To implement additional diagnostic tests on top of those provided by the 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 framework, the method :meth:`freedombox.app.App.diagnose` has to be overridden
a component that belongs to the app, the method or in a component that belongs to the app, the method
:meth:`plinth.app.Component.diagnose` has to be overridden. The methods must :meth:`freedombox.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 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 itself is a two-tuple containing the display name of the test followed by the
result as ``passed``, ``failed`` or ``error``. result as ``passed``, ``failed`` or ``error``.
@ -36,7 +36,7 @@ result as ``passed``, ``failed`` or ``error``.
The user can trigger the diagnostics test by going to **System -> Diagnostics** The user can trigger the diagnostics test by going to **System -> Diagnostics**
page. This runs diagnostics for all the applications. Users can also run page. This runs diagnostics for all the applications. Users can also run
diagnostics specifically for this app from the app's page. A diagnostics menu 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 item is shown by the :class:`freedombox.views.AppView` and `app.html` template
automatically when ``diagnose()`` method is overridden in the app or a automatically when ``diagnose()`` method is overridden in the app or a
component. component.

View File

@ -11,8 +11,8 @@ Creating the project structure
Create a directory structure as follows with empty files. We will fill them up Create a directory structure as follows with empty files. We will fill them up
in a step-by-step manner:: in a step-by-step manner::
─┬ <plinth_root>/ ─┬ <freedombox_root>/
└─┬ plinth/ └─┬ freedombox/
└─┬ modules/ └─┬ modules/
└─┬ transmission/ └─┬ transmission/
├─ __init__.py ├─ __init__.py
@ -41,46 +41,46 @@ The file ``__init__.py`` indicates that the directory in which it is present is
a Python module. For now, it is an empty file. a Python module. For now, it is an empty file.
FreedomBox's build system will automatically install the FreedomBox's build system will automatically install the
``plinth/modules/transmission`` directory (along with other files described ``freedombox/modules/transmission`` directory (along with other files described
later) to an appropriate location. If you are creating an app that stays later) to an appropriate location. If you are creating an app that stays
independent and outside of FreedomBox source tree, then build system in your independent and outside of FreedomBox source tree, then build system in your
source tree will need to install it to a proper location on the system. The source tree will need to install it to a proper location on the system. The
``plinth/modules/`` directory is a Python3 `namespace package ``freedombox/modules/`` directory is a Python3 `namespace package
<https://www.python.org/dev/peps/pep-0420/>`_. So, you can install it with the <https://www.python.org/dev/peps/pep-0420/>`_. So, you can install it with the
``plinth/modules/`` directory structure into any Python path and still be ``freedombox/modules/`` directory structure into any Python path and still be
discovered as ``plinth.modules.*``. discovered as ``freedombox.modules.*``.
Tell FreedomBox that our app exists Tell FreedomBox that our app exists
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The first thing to do is tell FreedomBox that our app exists. This is done by The first thing to do is tell FreedomBox that our app exists. This is done by
writing a small file with the Python import path to our app and placing it in writing a small file with the Python import path to our app and placing it in
``plinth/modules/transmission/data/usr/share/freedombox/modules-enabled/``. Let ``freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/``.
us create this file ``transmission``: Let us create this file ``transmission``:
.. code-block:: text .. code-block:: text
:caption: ``plinth/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission`` :caption: ``freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission``
plinth.modules.transmission freedombox.modules.transmission
This file is automatically installed to This file is automatically installed to
``/usr/share/freedombox/modules-enabled/`` by FreedomBox's build system. If we ``/usr/share/freedombox/modules-enabled/`` by FreedomBox's build system. If we
are writing a module that resides independently outside the FreedomBox's source are writing a module that resides independently outside the FreedomBox's source
code, the setup script will need to copy it to the target location. Further, it code, the setup script will need to copy it to the target location. Further, it
is not necessary for the app to be part of the ``plinth.modules`` namespace. It is not necessary for the app to be part of the ``freedombox.modules`` namespace.
can, for example, be ``freedombox_transmission``. It can, for example, be ``freedombox_transmission``.
Creating the App class Creating the App class
^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^
In the FreedomBox framework, each app must be a class derived from the In the FreedomBox framework, each app must be a class derived from the
:class:`plinth.app.App`. Let us do that in ``__init__.py``. We will fill up the :class:`freedombox.app.App`. Let us do that in ``__init__.py``. We will fill up
class later. the class later.
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth import app as app_module from freedombox import app as app_module
class TransmissionApp(app_module.App): class TransmissionApp(app_module.App):
"""FreedomBox app for Transmission.""" """FreedomBox app for Transmission."""

View File

@ -22,7 +22,7 @@ write the following:
] ]
This routes the ``/apps/transmission/`` URL to a view called This routes the ``/apps/transmission/`` URL to a view called
``TransmissionAppView`` defined in ``plinth/modules/transmission/views.py``. ``TransmissionAppView`` defined in ``freedombox/modules/transmission/views.py``.
This is no different than how routing URLs is done in Django. See :doc:`Django This is no different than how routing URLs is done in Django. See :doc:`Django
URL dispatcher <django:topics/http/urls>` for more information. URL dispatcher <django:topics/http/urls>` for more information.
@ -36,7 +36,7 @@ a link in FreedomBox web interface. Let us add a link in the apps list. In
.. code-block:: python3 .. code-block:: python3
:caption: ``__init__.py`` :caption: ``__init__.py``
from plinth import menu from freedombox import menu
class TransmissionApp(app_module.App): class TransmissionApp(app_module.App):
... ...
@ -63,7 +63,7 @@ menu item we want to present.
* The third parameter is the name of the icon to use when showing the menu * The third parameter is the name of the icon to use when showing the menu
item. An SVG file and a PNG should be created in the item. An SVG file and a PNG should be created in the
``plinth/modules/transmission/static/icons/`` directory. ``freedombox/modules/transmission/static/icons/`` directory.
* The fourth parameter is the list of tags to show on the menu item. * The fourth parameter is the list of tags to show on the menu item.
@ -87,15 +87,15 @@ view to show the app page for our app. In ``views.py``, let us add a view.
.. code-block:: python3 .. code-block:: python3
:caption: ``views.py`` :caption: ``views.py``
from plinth import views from freedombox import views
from plinth.modules import transmission from freedombox.modules import transmission
class TransmissionAppView(views.AppView): class TransmissionAppView(views.AppView):
"""Serve configuration page.""" """Serve configuration page."""
app_id = 'transmission' app_id = 'transmission'
The base view :class:`~plinth.views.AppView` takes care of a lot of details for The base view :class:`~freedombox.views.AppView` takes care of a lot of details
us. First, it shows basic information about the app like name, description, for us. First, it shows basic information about the app like name, description,
desktop/mobiles clients for the service (described later), link to the manual desktop/mobiles clients for the service (described later), link to the manual
page (described later), link to diagnostics button, etc. Then it shows the page (described later), link to diagnostics button, etc. Then it shows the
status of the app whether it is running and can also present a form for status of the app whether it is running and can also present a form for

View File

@ -5,22 +5,22 @@
--> -->
<refentry> <refentry>
<refmeta> <refmeta>
<refentrytitle><application>plinth</application></refentrytitle> <refentrytitle><application>freedombox</application></refentrytitle>
<manvolnum>1</manvolnum> <manvolnum>1</manvolnum>
<refmiscinfo class="manual">FreedomBox</refmiscinfo> <refmiscinfo class="manual">FreedomBox</refmiscinfo>
<refmiscinfo class="version"> </refmiscinfo> <refmiscinfo class="version"> </refmiscinfo>
</refmeta> </refmeta>
<refnamediv> <refnamediv>
<refname><application>plinth</application></refname> <refname><application>freedombox</application></refname>
<refpurpose> <refpurpose>
a web front end for administering FreedomBox An inexpensive server at home.
</refpurpose> </refpurpose>
</refnamediv> </refnamediv>
<refsynopsisdiv> <refsynopsisdiv>
<cmdsynopsis> <cmdsynopsis>
<command>plinth</command> <command>freedombox</command>
<arg><option>-h, </option><option>--help</option></arg> <arg><option>-h, </option><option>--help</option></arg>
<arg><option>--server_dir</option><arg choice="req">SERVER_DIR</arg></arg> <arg><option>--server_dir</option><arg choice="req">SERVER_DIR</arg></arg>
<arg><option>--develop</option></arg> <arg><option>--develop</option></arg>
@ -53,14 +53,13 @@
data stays with the users. data stays with the users.
</para> </para>
<para> <para>
Plinth is a web interface to administer the functions of the FreedomBox Service (Plinth) has a web interface to administer its
FreedomBox. It is extensible and is made of modules. Each functions. It is extensible and is made of modules. Each module provides
module provides a simplified user interface to control the a simplified user interface to control the underlying functionality of a
underlying functionality of a specific application of specific application of FreedomBox. As FreedomBox can act as a wireless
FreedomBox. As FreedomBox can act as a wireless router, it is router, it is possible to configure networking. FreedomBox allows
possible to configure networking from Plinth. Plinth allows configuration of basic system parameters such as time zone, hostname and
configuration of basic system parameters such as time zone, automatic upgrade settings.
hostname and automatic upgrade settings.
</para> </para>
</refsect1> </refsect1>
@ -71,9 +70,9 @@
<term><option>--server_dir SERVER_DIR</option></term> <term><option>--server_dir SERVER_DIR</option></term>
<listitem> <listitem>
<para> <para>
This the URL fragment under which Plinth will provide its services. This the URL fragment under which FreedomBox will provide its services.
Plinth is shipped with a default value of FreedomBox is shipped with a default value of
<filename>/freedombox</filename>. This means that Plinth will be <filename>/freedombox</filename>. This means that FreedomBox will be
available as http://localhost:8000/freedombox by default. available as http://localhost:8000/freedombox by default.
</para> </para>
</listitem> </listitem>
@ -86,8 +85,8 @@
from the current working directory. Enables extra debug messages, from the current working directory. Enables extra debug messages,
enable Django debug mode for detailed error pages and turn off enable Django debug mode for detailed error pages and turn off
Django security features. Monitor source files for changes and Django security features. Monitor source files for changes and
restart Plinth on modifications. Die if there is an error during restart FreedomBox Service on modifications. Die if there is an
module initialization. error during module initialization.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>
@ -95,7 +94,7 @@
<term><option>--diagnose</option></term> <term><option>--diagnose</option></term>
<listitem> <listitem>
<para> <para>
If provided, Plinth loads modules, performs initialization If provided, FreedomBox loads modules, performs initialization
but does start the web server. Instead it runs diagnostic but does start the web server. Instead it runs diagnostic
tests on each module and exits. tests on each module and exits.
</para> </para>
@ -166,7 +165,7 @@
<refsect1> <refsect1>
<title>Configuration</title> <title>Configuration</title>
<para> <para>
Plinth reads various configuration options from the files FreedomBox Service reads various configuration options from the files
<filename>/usr/share/freedombox/freedombox.config</filename>, <filename>/usr/share/freedombox/freedombox.config</filename>,
<filename>/usr/share/freedombox/freedombox.config.d/*.config</filename>, <filename>/usr/share/freedombox/freedombox.config.d/*.config</filename>,
<filename>/etc/plinth/plinth.config</filename>, <filename>/etc/plinth/plinth.config</filename>,
@ -182,26 +181,26 @@
<title>Examples</title> <title>Examples</title>
<example> <example>
<title>Start Plinth with default options</title> <title>Start FreedomBox Service with default options</title>
<synopsis>$ plinth</synopsis> <synopsis>$ freedombox</synopsis>
<para> <para>
Run Plinth as guided by configuration file. Run FreedomBox Service as guided by configuration file.
</para> </para>
</example> </example>
<example> <example>
<title>Run Plinth with different URL prefix</title> <title>Run FreedomBox Service with different URL prefix</title>
<synopsis>$ plinth --server_dir='/myurl'</synopsis> <synopsis>$ freedombox --server_dir='/myurl'</synopsis>
<para> <para>
Run Plinth with the '/myurl' prefix. Note that Apache forwards requests Run FreedomBox with the '/myurl' prefix. Note that Apache forwards
to '/freedombox' by default, so /myurl is not accessible outside of your requests to '/freedombox' by default, so /myurl is not accessible
FreedomBox without adapting the apache configuration. outside of your FreedomBox without adapting the apache configuration.
</para> </para>
</example> </example>
<example> <example>
<title>Run Plinth in development mode</title> <title>Run FreedomBox Service in development mode</title>
<synopsis>$ plinth --develop</synopsis> <synopsis>$ freedombox --develop</synopsis>
<para> <para>
Run in development mode on the terminal. Enable auto-reloading and Run in development mode on the terminal. Enable auto-reloading and
more extensive debugging. more extensive debugging.
@ -213,7 +212,7 @@
<title>Bugs</title> <title>Bugs</title>
<para> <para>
See <ulink See <ulink
url="https://salsa.debian.org/freedombox-team/freedombox/issues">Plinth url="https://salsa.debian.org/freedombox-team/freedombox/issues">FreedomBox
issue tracker</ulink> for a full list of known issues and TODO items. issue tracker</ulink> for a full list of known issues and TODO items.
</para> </para>
</refsect1> </refsect1>
@ -222,7 +221,7 @@
<title>Author</title> <title>Author</title>
<para> <para>
<author> <author>
<firstname>Plinth Developers</firstname> <firstname>FreedomBox Developers</firstname>
<contrib>Original author</contrib> <contrib>Original author</contrib>
</author> </author>
</para> </para>

View File

@ -13,7 +13,7 @@
!FreedomBox is a [[DebianPureBlends|pure blend]] of Debian. This means that all the work on !FreedomBox is available in Debian as packages. It also means that any machine running Debian can be turned into a !FreedomBox. !FreedomBox is a [[DebianPureBlends|pure blend]] of Debian. This means that all the work on !FreedomBox is available in Debian as packages. It also means that any machine running Debian can be turned into a !FreedomBox.
This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (bookworm), Testing (trixie), and Unstable (sid). This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (trixie), Testing (forky), and Unstable (sid).
'''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this approach. '''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this approach.
@ -21,13 +21,15 @@ This page describes the process of installing !FreedomBox on a Debian system. Cu
'''Use a fresh Debian installation''' '''Use a fresh Debian installation'''
Installing !FreedomBox changes your Debian system in many important ways. This includes installing a firewall and regenerating server certificates. It is hence recommended that you install !FreedomBox on a fresh Debian installation instead of an existing setup. Installing !FreedomBox changes your Debian system in many important ways. This includes installing a firewall and regenerating server certificates. It is hence recommended that you install !FreedomBox on a fresh Debian installation instead of an existing setup.
During installation of Debian, it is recommended that you choose btrfs as the filesystem for the root partition. Btrfs filesystem is needed for the Snapshots feature to work.
}}} }}}
=== Installing on Debian 12 (bookworm) or newer === === Installing on Debian 13 (trixie) or newer ===
Check the Troubleshooting section below, for any tips or workarounds that might help during the install. Check the Troubleshooting section below, for any tips or workarounds that might help during the install.
1. [[InstallingDebianOn|Install Debian]] 12 (Bookworm) or newer on your hardware. During installation choosing "Btrfs" for root filesystem type is recommended as !FreedomBox uses it take regular snapshots of the system. 1. [[InstallingDebianOn|Install Debian]] 13 (Trixie) or newer on your hardware. During installation choosing "Btrfs" for root filesystem type is recommended as !FreedomBox uses it take regular snapshots of the system.
1. Update your package list. 1. Update your package list.
@ -47,6 +49,16 @@ $ sudo DEBIAN_FRONTEND=noninteractive apt-get install freedombox
1. You can start [[FreedomBox/Manual/QuickStart|using]] !FreedomBox. During initial wizard, you will need to enter the secret noted above. 1. You can start [[FreedomBox/Manual/QuickStart|using]] !FreedomBox. During initial wizard, you will need to enter the secret noted above.
=== Difference between Debian Package and Disk Image ===
Following are the differences between setup using a !FreedomBox image vs. installing !FreedomBox using a Debian package on an existing Debian installation:
1. '''Filesystem:''' The disk images have btrfs as the filesystem. When installing a Debian package, the existing filesystem is not altered. The snapshots feature is currently only available if btrfs is the filesystem. So, for those wanting to install freedombox .deb package, it is recommended that they install Debian on a btrfs filesystem first.
1. '''First Wizard:''' When installing from a Debian package, !FreedomBox will ask for a secret (stored at a path on the disk) during first wizard. The secret is for security and has no relevance after the first wizard is completed. This secret is not asked if first wizard is run from a disk image (as hardware is expected to be in possession of the user and the user won't be able to easily peak the secret on the disk without running the first wizard first).
1. '''Networking:''' When disk image is booted, all the Ethernet and Wi-Fi devices are automatically configured to be managed by Network Manager. When !FreedomBox is installed from Debian package, existing network connections are not reconfigured. These network interfaces can later be reconfigured (by commenting out entries in /etc/network/interfaces) to be managed by Network Manager.
=== Tips and Troubleshooting === === Tips and Troubleshooting ===
1. !FreedomBox uses !NetworkManager to manage network configuration. If you have configured your network interfaces using Debian installer or by editing `/etc/network/interfaces`, !FreedomBox will not manage those interfaces. (See [[https://bugs.debian.org/797614|bug #797614]].) To let !FreedomBox/NetworkManager manage your network interfaces, edit the `/etc/network/interfaces` manually and ensure that it contains only the following: 1. !FreedomBox uses !NetworkManager to manage network configuration. If you have configured your network interfaces using Debian installer or by editing `/etc/network/interfaces`, !FreedomBox will not manage those interfaces. (See [[https://bugs.debian.org/797614|bug #797614]].) To let !FreedomBox/NetworkManager manage your network interfaces, edit the `/etc/network/interfaces` manually and ensure that it contains only the following:

View File

@ -8,6 +8,64 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version. The following are the release notes for each !FreedomBox version.
== FreedomBox 26.14 (2026-10-15) ==
* backups: Run compact in cleanup
* homeassistant: Enable app properly on first install
* homeassistant: Migrate to new HTTP configuration approach
* locale: Update translations for Chinese (Simplified Han script), Czech, German, Swedish, Turkish
== FreedomBox 26.13 (2026-10-06) ==
=== Highlights ===
* wireguard: Fix issues with QR codes and config download
=== Other Changes ===
* gitlab-ci: Set default artifact expiry to 3 months
* locale: Update translations for Chinese (Simplified Han script)
* wireguard: Don't setup server implicitly
* storage: tests: Fix a failure from psutil change
== FreedomBox 26.12 (2026-09-14) ==
=== Highlights ===
* locale: Add Lao translation
* radicale: Redirect from .well-known URLs only temporarily
* wireguard: Fix auto-adding client when no domains are configured
* wireguard: Fix issues with newline in public key when adding client
=== Other Changes ===
* *: Additional import path related changes
* *: All other changes need for new import path
* *: Miscellaneous changes to work with reduce the use of term 'plinth'
* *: Update additional documentation/comments with new import path
* *: Update import path in modules-enabled configuration files
* *: Update imports statements from plinth to freedombox
* bin: Rename main binary from plinth to freedombox
* container: Fix failure with defining a new VM
* d/copyright: Update copyright file
* django: Changes for new import path
* django: Rename DB tables from plinth_ to freedombox_
* doc/dev: Update developer documentation with new import path
* errors: Rename !PlinthError to !FbxError
* locale: Move lo to freedombox path
* locale: Update translations for Czech, French, Lao, Swedish
* nextcloud: test: Fix functional tests with version 26
* plinth/*: Rename plinth/ folder to freedombox/
* radicale: tests: Don't fail if Nextcloud is enabled
* tags: tests: Fix functional tests broken by separate apps/add page
* wireguard: Improve reliability functional tests by waiting after ops
== FreedomBox 26.11.1 (2026-08-19) ==
* apache: Stop installing uwsgi by default
* debian: Re-arrange test steps to help with debugging
* locale: Update translations for Chinese (Simplified Han script), German, Turkish
== FreedomBox 26.11 (2026-08-17) == == FreedomBox 26.11 (2026-08-17) ==
=== Highlights === === Highlights ===

View File

@ -16,56 +16,132 @@
!WireGuard is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It can be a useful replacement for IPSec or [[FreedomBox/Manual/OpenVPN|OpenVPN]]. !WireGuard is an extremely simple yet fast and modern VPN that utilizes state-of-the-art cryptography. It can be a useful replacement for IPSec or [[FreedomBox/Manual/OpenVPN|OpenVPN]].
=== Usage ===
In !FreedomBox, the !WireGuard app can be used for two separate purposes.
==== As a server ====
The first purpose is that !FreedomBox can act as a VPN server. Say, you are at a coffee shop and connected to their Wi-Fi network with your phone or laptop. You don't want the network operators or their Internet providers to know which websites you visit. You can encrypt all your Internet traffic including domain name lookups and send it to your !FreedomBox and your !FreedomBox will then send this to the broader Internet using the Internet connection that !FreedomBox has at your home. This has two effects. The network at the coffee shop will only see encrypted network traffic going to your !FreedomBox (but not any other network traffic) and the websites you visit will think you are browsing from your home and not the coffee shop.
==== As a client ====
The second purpose is that you can make your !FreedomBox a VPN client. Say, you don't want your Internet provider to monitor the traffic that originates from your !FreedomBox and other home devices. You can purchase a VPN account from one of the !WireGuard VPN providers (alternatively, you can ask a friend with !FreedomBox to allow you as a !WireGuard client on their !WireGuard server). Then configure !FreedomBox's !WireGuard app as a VPN client. All traffic originating from !FreedomBox (including !BitTorrent traffic) will be encrypted and sent to your VPN provider. From there the traffic is decrypted and set to the broader Internet. This, again, has two effects. Your home Internet provider will see only encrypted traffic going to VPN provider (but not any other network traffic) and the websites you visit from !FreedomBox will think you are browsing from the location of VPN server. Many VPN providers setup their servers in many different countries and let you choose a server from a particular country. The websites you access from !FreedomBox will think that the traffic is originating from the country you have chosen.
Additionally, you can make all your home devices use this VPN setup. For this you need to setup your Wi-Fi router "behind" the !FreedomBox. Your Wi-Fi router will be plugged into the "LAN" port of your !FreedomBox and configured in "repeater" mode (note that you will need to setup !FreedomBox on a device that has two Ethernet ports, such as [[FreedomBox/Hardware/LibreCrafts|Libre Crafts FreedomBox]]). Once this is done, network traffic from all the devices connect to the Wi-Fi router will then pass through !FreedomBox. If !WireGuard VPN client is configured on !FreedomBox, then all the traffic originating from these devices will use the VPN automatically.
=== Installation === === Installation ===
You can install wireguard from the Apps section of the !FreedomBox web interface. You can install !WireGuard from the Apps section of the !FreedomBox web interface.
=== Configure FreedomBox as a VPN Server ===
To configure !FreedomBox as a server, click on the "Start !WireGuard Server" button if you see it along with the message "!WireGuard server not started yet" in the "As a Server" section. This is only needed once. After this, you see server information such as its public key, end points, and IP address in this section.
If your !FreedomBox is setup behind a router, then you need to configure your router to forward incoming traffic on the UDP port 51820 to !FreedomBox's port 51820.
=== Configure Mobile App to use VPN Server ===
The recommended app for Android and iOS is the official !WireGuard app available from app stores. Currently, the app is not available in F-Droid app store, so use the APK instead. Links are available in the "Clients Apps" section on the !WireGuard page.
==== Using QR Code ====
This is the simplest and recommended way to configure the !WireGuard mobile app.
1. In the !FreedomBox !WireGuard app page, click on "Add Client Automatically". Click on the "Show QR Code". !FreedomBox will show a QR code.
1. In the !WireGuard mobile app, click on the "+" button in the main page to create a new tunnel. From the menu shown, select "Scan from QR code" option. A dialog asking you allow camera permission to the !WireGuard app will be shown. Allow it.
1. Then show the QR code generated by !FreedomBox in the first step.
1. If scanning the code is successful, then the app will ask for a name for the tunnel. Provide any name you choose such as "!MyFreedomBox". Your configuration is complete.
1. Enable the tunnel using slider button whenever you wish to connect to your !FreedomBox VPN server.
1. See the section below on Troubleshooting to verify that the setup is working.
{{attachment:wireguard-app.png|WireGuard App|height=400}}
{{attachment:wireguard-app-add-tunnel.png|Add tunnel menu|height=400}}
{{attachment:wireguard-app-after-qr-code.png|After scanning QR code|height=400}}
{{attachment:wireguard-app-tunnel-added.png|Tunnel Added|height=400}}
==== Using Configuration File ====
If scanning QR code is not possible for some reason, use this approach.
1. In the !FreedomBox !WireGuard app page, click on "Add Client Automatically". Click on the "Download config file" option. A file is downloaded to your device. If this device is not the mobile device you wish to configure, then transfer this file to your mobile device (or send to the person who wants to your VPN server).
1. In the !WireGuard mobile app, click on the "+" button in the main page to create a new tunnel. From the menu shown, select "Import from file or archive". Then select the configuration file that was downloaded from !FreedomBox web interface (or transferred to the mobile device).
1. If import is successful, you will see the message "Imported wg-client" and a new tunnel added with the name "wg-client". You can rename it to a more memorable name such as "!MyFreedomBox".
1. Enable the tunnel using slider button whenever you wish to connect to your !FreedomBox VPN server.
1. See the section below on Troubleshooting to verify that the setup is working.
{{attachment:wireguard-app.png|WireGuard App|height=400}}
{{attachment:wireguard-app-add-tunnel.png|Add tunnel menu|height=400}}
{{attachment:wireguard-app-imported.png|Configuration file imported|height=400}}
{{attachment:wireguard-app-tunnel-added.png|Tunnel Added|height=400}}
=== Usage === ==== Using Manual Configuration ====
* Point-to-point tunnel If scanning QR code and importing from a configuration is not possible, use this approach.
* VPN client with default route
1. In the !FreedomBox !WireGuard app page, click on "Add Client Automatically". Note the Private Key and all other details on the page.
1. In the !WireGuard mobile app, click on the "+" button in the main page to create a new tunnel. From the menu shown, select "Create from scratch".
1. In the Interface section provide name that is memorable such as "!MyFreedomBox". At the "Private Key", provide the private key generated by !FreedomBox in the first step. Public key is automatically filled up by the app (as public key is part of/derived from the private key). For Addresses, provide the value of "IP Address" from first step. For "DNS Servers" provide "10.84.0.1".
1. After completing the Interface section, click on "Add peer" at the bottom of the page. For Public key, provide "Server public key" as seen in !FreedomBox !WireGuard app page "As a server" section. Provide one of the endpoints shown in the first step in the Endpoint field. Provide "0.0.0.0/0,::0/0" as Allowed IPs.
1. Select save. You should see a new tunnel created.
1. Enable the tunnel using slider button whenever you wish to connect to your !FreedomBox VPN server.
1. See the section below on Troubleshooting to verify that the setup is working.
{{attachment:wireguard-app.png|WireGuard App|height=400}}
{{attachment:wireguard-app-add-tunnel.png|Add tunnel menu|height=400}}
{{attachment:wireguard-app-manual-add-1.png|Filling Interface section|height=400}}
{{attachment:wireguard-app-manual-add-2.png|Filling Peer section|height=400}}
{{attachment:wireguard-app-tunnel-added.png|Tunnel Added|height=400}}
=== Configuration - Debian Peers === === Configure Desktop App (GNU/Linux) to use VPN Server ===
Note: These steps are handled automatically on !FreedomBox. So you only need to follow these steps on any Debian clients that will connect to !FreedomBox, or Debian servers that !FreedomBox will connect to. On a GNU/Linux desktop such as Debian, install the "wireguard" or "wireguard-tools" package. See the [[https://www.wireguard.com/install/|installation]] page for more details.
* [[WireGuard#Step_1_-_Generating_Keypairs|Step 1 - Generating Keypairs]] 1. In the !FreedomBox !WireGuard app page, click on "Add Client Automatically". Click on the "Download config file" option. A file is downloaded to your device. If this device is not the device you wish to configure, then transfer this file to your device (or send to the person who wants to your VPN server).
* [[WireGuard#Step_2_-_Configuration|Step 2 - Alternative A - Manual Configuration]] 1. To activate the !WireGuard tunnel, run the command "sudo wg-quick up /path/to/your/wg-client.conf". To deactivate the tunnel, run "sudo wg-quick down /path/to/your/wg-client.conf".
1. See the section below on Troubleshooting to verify that the setup is working.
=== Configure Desktop App (Windows) to use VPN Server ===
=== Configuration - Mobile Clients === Download and install the official !WireGuard client for Windows. See the [[https://www.wireguard.com/install/|installation]] page for more details.
!WireGuard has a user space implementation for mobile devices available via the !WireGuard app - available for Android and iOS (a full list of supported operating systems is available [[https://www.wireguard.com/install/|here]]). 1. In the !FreedomBox !WireGuard app page, click on "Add Client Automatically". Click on the "Download config file" option. A file is downloaded to your device. If this device is not the device you wish to configure, then transfer this file to your device (or send to the person who wants to your VPN server).
1. Import the configuration file into the !WireGuard for Windows app. After that, you should be able to activate and deactivate the tunnel.
1. See the section below on Troubleshooting to verify that the setup is working.
The client can be configured in several ways: === Configure Desktop App (macOS) to use VPN Server ===
==== Alternative A - Create configuration manually ==== Download and install the official !WireGuard client for macOS. See the [[https://www.wireguard.com/install/|installation]] page for more details.
This is self-explanatory, you actually create the config on the mobile device then transfer the relevant keys to the server's config. 1. In the !FreedomBox !WireGuard app page, click on "Add Client Automatically". Click on the "Download config file" option. A file is downloaded to your device. If this device is not the device you wish to configure, then transfer this file to your device (or send to the person who wants to your VPN server).
1. Import the configuration file into the !WireGuard for macOS app. After that, you should be able to activate and deactivate the tunnel.
1. See the section below on Troubleshooting to verify that the setup is working.
==== Alternative B - Create configuration from archive ==== === Troubleshooting ===
Here you have to create a .zip archive of the client configuration file, transfer it to the device then import it into the app. After you activate the tunnel, all traffic on the system will go through the VPN you have configured. If there is an error in configuration, activating the tunnel will not fail as there is no connection to be made. You traffic will simply fail to reach the server and this will happen silently. Use the following tricks to ensure that your !WireGuard configuration is correct.
==== Alternative C - Import by reading a QR code (most secure method) ==== 1. Activate the tunnel.
1. Open a browser and access a website like https://www.wikipedia.org/ . It should work.
1. Open a browser and access the link https://10.84.0.1. This should show you your !FreedomBox web interface (after a security warning).
1. Click the tunnel in the !WireGuard client app. It should show you some value for "Last handshake". It should also show you a non-zero value for data received.
1. On !FreedomBox's !WireGuard app page, click on the public key of the client in the "Peers" table of "As a server" section. This shows you the Allowed Client page. In this page, data received should be non-zero and "Last handshake" should show a valid value.
1. If you have the "ping" utility installed on your client machine, running "ping 9.9.9.9" should receive responses.
1. If you have "traceroute" utility installed on your machine, running "traceroute 9.9.9.9" should show "10.84.0.1" (your !FreedomBox) as the first step in delivering the packets.
The mobile client as of version 0.0.20180724 supports QR code based input. If the above does not work, verify the following:
DebianPackage:qrencode can be used to generate qr codes, even in a terminal/console using UTF8 characters. 1. The public key of the client should be shown in the list of Peers in the "As a Server" section of !WireGuard app in !FreedomBox. It should match exactly.
1. The allowed IP listed against the public key in !FreedomBox should be the value of IP address set in the client app.
1. The public key of the !FreedomBox server shown in "As a Server" section of !WireGuard app in !FreedomBox interface should be the public key set in peer section of client app. It should match exactly.
1. Allowed IPs should be "0.0.0.0/0,::0/0" in client app in the peer section of tunnel configuration.
1. The endpoint of the peer in client app should be a domain name or the IP address of the !FreedomBox server followed by a ":51820". Your !FreedomBox should also be reachable from this IP address or domain name. Deactivate the tunnel and type this address in the browser (without the port) from the client machine. !FreedomBox web interface should show up.
The syntax is: === Known Issues ===
{{{
# qrencode -t ansiutf8 < client.conf
}}}
This will generate a QR code that is readable by the mobile client.
The advantage of this approach is that there is no need to transfer sensitive information via data channels that can potentially be compromised and there is no need for any additional software.
* In version 26.12 of !FreedomBox, the Show QR Code and Download configuration functionality is broken. It will be fixed in version 26.13.
=== External Links === === External Links ===

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -13,7 +13,7 @@
!FreedomBox is a [[DebianPureBlends|pure blend]] of Debian. This means that all the work on !FreedomBox is available in Debian as packages. It also means that any machine running Debian can be turned into a !FreedomBox. !FreedomBox is a [[DebianPureBlends|pure blend]] of Debian. This means that all the work on !FreedomBox is available in Debian as packages. It also means that any machine running Debian can be turned into a !FreedomBox.
This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (bookworm), Testing (trixie), and Unstable (sid). This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (trixie), Testing (forky), and Unstable (sid).
'''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this approach. '''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this approach.
@ -21,13 +21,15 @@ This page describes the process of installing !FreedomBox on a Debian system. Cu
'''Use a fresh Debian installation''' '''Use a fresh Debian installation'''
Installing !FreedomBox changes your Debian system in many important ways. This includes installing a firewall and regenerating server certificates. It is hence recommended that you install !FreedomBox on a fresh Debian installation instead of an existing setup. Installing !FreedomBox changes your Debian system in many important ways. This includes installing a firewall and regenerating server certificates. It is hence recommended that you install !FreedomBox on a fresh Debian installation instead of an existing setup.
During installation of Debian, it is recommended that you choose btrfs as the filesystem for the root partition. Btrfs filesystem is needed for the Snapshots feature to work.
}}} }}}
=== Installing on Debian 12 (bookworm) or newer === === Installing on Debian 13 (trixie) or newer ===
Check the Troubleshooting section below, for any tips or workarounds that might help during the install. Check the Troubleshooting section below, for any tips or workarounds that might help during the install.
1. [[InstallingDebianOn|Install Debian]] 12 (Bookworm) or newer on your hardware. During installation choosing "Btrfs" for root filesystem type is recommended as !FreedomBox uses it take regular snapshots of the system. 1. [[InstallingDebianOn|Install Debian]] 13 (Trixie) or newer on your hardware. During installation choosing "Btrfs" for root filesystem type is recommended as !FreedomBox uses it take regular snapshots of the system.
1. Update your package list. 1. Update your package list.
@ -47,6 +49,16 @@ $ sudo DEBIAN_FRONTEND=noninteractive apt-get install freedombox
1. You can start [[FreedomBox/Manual/QuickStart|using]] !FreedomBox. During initial wizard, you will need to enter the secret noted above. 1. You can start [[FreedomBox/Manual/QuickStart|using]] !FreedomBox. During initial wizard, you will need to enter the secret noted above.
=== Difference between Debian Package and Disk Image ===
Following are the differences between setup using a !FreedomBox image vs. installing !FreedomBox using a Debian package on an existing Debian installation:
1. '''Filesystem:''' The disk images have btrfs as the filesystem. When installing a Debian package, the existing filesystem is not altered. The snapshots feature is currently only available if btrfs is the filesystem. So, for those wanting to install freedombox .deb package, it is recommended that they install Debian on a btrfs filesystem first.
1. '''First Wizard:''' When installing from a Debian package, !FreedomBox will ask for a secret (stored at a path on the disk) during first wizard. The secret is for security and has no relevance after the first wizard is completed. This secret is not asked if first wizard is run from a disk image (as hardware is expected to be in possession of the user and the user won't be able to easily peak the secret on the disk without running the first wizard first).
1. '''Networking:''' When disk image is booted, all the Ethernet and Wi-Fi devices are automatically configured to be managed by Network Manager. When !FreedomBox is installed from Debian package, existing network connections are not reconfigured. These network interfaces can later be reconfigured (by commenting out entries in /etc/network/interfaces) to be managed by Network Manager.
=== Tips and Troubleshooting === === Tips and Troubleshooting ===
1. !FreedomBox uses !NetworkManager to manage network configuration. If you have configured your network interfaces using Debian installer or by editing `/etc/network/interfaces`, !FreedomBox will not manage those interfaces. (See [[https://bugs.debian.org/797614|bug #797614]].) To let !FreedomBox/NetworkManager manage your network interfaces, edit the `/etc/network/interfaces` manually and ensure that it contains only the following: 1. !FreedomBox uses !NetworkManager to manage network configuration. If you have configured your network interfaces using Debian installer or by editing `/etc/network/interfaces`, !FreedomBox will not manage those interfaces. (See [[https://bugs.debian.org/797614|bug #797614]].) To let !FreedomBox/NetworkManager manage your network interfaces, edit the `/etc/network/interfaces` manually and ensure that it contains only the following:

View File

@ -8,6 +8,64 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version. The following are the release notes for each !FreedomBox version.
== FreedomBox 26.14 (2026-10-15) ==
* backups: Run compact in cleanup
* homeassistant: Enable app properly on first install
* homeassistant: Migrate to new HTTP configuration approach
* locale: Update translations for Chinese (Simplified Han script), Czech, German, Swedish, Turkish
== FreedomBox 26.13 (2026-10-06) ==
=== Highlights ===
* wireguard: Fix issues with QR codes and config download
=== Other Changes ===
* gitlab-ci: Set default artifact expiry to 3 months
* locale: Update translations for Chinese (Simplified Han script)
* wireguard: Don't setup server implicitly
* storage: tests: Fix a failure from psutil change
== FreedomBox 26.12 (2026-09-14) ==
=== Highlights ===
* locale: Add Lao translation
* radicale: Redirect from .well-known URLs only temporarily
* wireguard: Fix auto-adding client when no domains are configured
* wireguard: Fix issues with newline in public key when adding client
=== Other Changes ===
* *: Additional import path related changes
* *: All other changes need for new import path
* *: Miscellaneous changes to work with reduce the use of term 'plinth'
* *: Update additional documentation/comments with new import path
* *: Update import path in modules-enabled configuration files
* *: Update imports statements from plinth to freedombox
* bin: Rename main binary from plinth to freedombox
* container: Fix failure with defining a new VM
* d/copyright: Update copyright file
* django: Changes for new import path
* django: Rename DB tables from plinth_ to freedombox_
* doc/dev: Update developer documentation with new import path
* errors: Rename !PlinthError to !FbxError
* locale: Move lo to freedombox path
* locale: Update translations for Czech, French, Lao, Swedish
* nextcloud: test: Fix functional tests with version 26
* plinth/*: Rename plinth/ folder to freedombox/
* radicale: tests: Don't fail if Nextcloud is enabled
* tags: tests: Fix functional tests broken by separate apps/add page
* wireguard: Improve reliability functional tests by waiting after ops
== FreedomBox 26.11.1 (2026-08-19) ==
* apache: Stop installing uwsgi by default
* debian: Re-arrange test steps to help with debugging
* locale: Update translations for Chinese (Simplified Han script), German, Turkish
== FreedomBox 26.11 (2026-08-17) == == FreedomBox 26.11 (2026-08-17) ==
=== Highlights === === Highlights ===

View File

@ -14,53 +14,162 @@
!WireGuard es red privada virtual (VPN) extremadamente sencilla aunque rápida y moderna que emplea cifrado de última generación.Puede ser un reemplazo útil para IPSec u [[es/FreedomBox/Manual/OpenVPN|OpenVPN]]. !WireGuard es red privada virtual (VPN) extremadamente sencilla aunque rápida y moderna que emplea cifrado de última generación.Puede ser un reemplazo útil para IPSec u [[es/FreedomBox/Manual/OpenVPN|OpenVPN]].
=== Uso ===
En !FreedomBox, al app !WireGuard se puede usar para dos propósitos diferentes.
==== Como servidor ====
El primer propósito es que !FreedomBox haga de servidor VPN.
Imagina que estás en una cafetería conectado a su red Wi-Fi con tu móvil o portátil.
No quieres que los operadores de la red o sus proveedores de Internet sepan qué sitios web visitas.
Puedes cifrar todo tu tráfico de Internet incluyendo búsquedas de nombre de dominio y enviarlo a tu !FreedomBox para que lo saque a Internet desde tu casa.
Esto tiene dos efectos: Por un lado, la cafetería solo verá tráfico cifrado hacia tu !FreedomBox, y por otro, los sitios web que visites pensarán que navegas desde casa, no desde la cafetería.
==== Como cliente ====
El segundo propósito es convertir tu !FreedomBox en un cliente VPN.
Imagina que no quieres que tu proveedor de Internet vea el tráfico que sale de tu !FreedomBox u otros dispositivos de tu hogar.
Puedes contratar una cuenta en una red VPN en uno de los proveedores de !WireGuard VPN (o pedir a un amigo con !FreedomBox que te deje ser cliente de su servidor !WireGuard).
Entonces puedes configurar la app !WireGuard en !FreedomBox's como cliente VPN. Todo el tráfico que salga de tu !FreedomBox (incluyendo tráfico !BitTorrent) se cifrará y enviará por tu servidor VPN.
Allí se descifrará y reenviará hacia Internet. Esto, de nuevo, tiene dos efectos: Tu proveedor de Internet sólo verá tráfico cifrado yendo hacia tu proveedor de VPN y
los sitios web que visites desde !FreedomBox te verán navegando desde el servidor VPN. Muchos proveedores de VPN reparten sus servidores en países diferentes y te permiten elegir por cual sales.
Los sitios web que visites desde !FreedomBox te verán navegando desde el país que elegiste.
Además puedes configurar los dispositivos de tu hogar para que usen esta VPN. Para ello tienes que situar a tu router Wi-Fi "detrás" de tu !FreedomBox.
Tu router Wi-Fi se cableará al puerto "LAN" de tu !FreedomBox y se configurará en modo "repetidor"
(necesitará instalar !FreedomBox en un dispositivo con dos puertos Ethernet, como la [[FreedomBox/Hardware/LibreCrafts|FreedomBox de Libre Crafts]]).
Después, el tráfico de red de todos los dispositivos conectados al router Wi-Fi pasarán por la !FreedomBox.
Si el cliente VPN !WireGuard está configurado en la !FreedomBox, todo el tráfico de esos dispositivos usará la VPN automáticamente.
=== Instalación === === Instalación ===
Puedes instalar !WireGuard desde la sección ''Apps'' de la interfaz de !FreedomBox. Puedes instalar !WireGuard desde la sección ''Apps'' de la interfaz de !FreedomBox.
=== Configuración - Debian Peers === === Configurar FreedomBox como servidor de VPN ===
Nota: !FreedomBox trata estos pasos automáticamente. Así que solo necesitas seguirlos en clientes Debian que se conecten a !FreedomBox, O en servidores Debian a los que !FreedomBox se conecte. Para configurar !FreedomBox como servidor, pulsa el botón "Arrancar un Servidor !WireGuard" si lo ves junto al mensaje "Servidor !WireGuard apagado" en la sección "Como Servidor".
Esto sólo se necesita hacer una vez y después se muestra información del servidor como su clave pública, URLs, y dirección IP.
* [[WireGuard#Step_1_-_Generating_Keypairs|Paso 1 - Generar los pares de claves]] Si tu !FreedomBox está detrás de un router, necesitas configurarlo para que reenvíe el tráfico que entre por el puerto UDP 51820 al mismo puerto de tu !FreedomBox.
* [[WireGuard#Step_2_-_Configuration|Paso 2 - Alternativa A - Configuración Manual]]
=== Configurar la App móvil para usar el servidor de VPN ===
=== Uso === La app recomendada para Android e iOS es la app oficial "!WireGuard" disponible en sus tiendas. Actualmente la app no está disponible en la tienda de F-Droid, así que usa el APK.
Hay enlaces Links en la sección "Apps Cliente" de la página !WireGuard.
* Tunel punto a punto ==== Usando el código QR ====
* Cliente VPN con ruta por omisión
=== Configuración - Clientes móviles === Esta es la forma más simple, y la recomendada, para configurar la app móvil de !WireGuard.
!WireGuard tiene una implementación en espacio de usuario para dispositivos móviles disponible en la propia app. Funciona en Android e iOS. [[https://www.wireguard.com/install/|Aquí]] hay una lista completa de sistemas operativos compatibles. 1. En !FreedomBox, en la página de la app de !WireGuard, haz clic en "Añadir Cliente Automáticamente". Luego haz clic en "Mostrar Código QR". !FreedomBox mostrará un código QR.
1. En la app móvil de !WireGuard, haz clic en el botón "+" de la página principal para crear un túnel nuevo. Desde el menú que se muestra, selecciona la opción "Escanear desde código QR".
Se mostrará un diálogo pidiendo permiso para que la app de !WireGuard use la cámara. Permíteselo.
1. A continuación, muéstrale a la cámara el código QR que generó la !FreedomBox en el primer paso.
1. Si falla al escanear el código, la app preguntará por el nombre del túnel. Nombra el nuevo túnel y tu configuración estará completa.
1. Habilita el túnel usando el botón deslizante cuando quieras conectar con el servidor VPN de tu !FreedomBox.
1. Mira la sección de Resolución de Problemas para verificar si tu instalación funciona.
El cliente se puede configurar de varias maneras: {{attachment:FreedomBox/Manual/WireGuard/wireguard-app.png |App de WireGuard |height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-add-tunnel.png |Menú de añadir túnel |height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-after-qr-code.png|Tras escanear el código QR|height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-tunnel-added.png |Túnel Añadido |height=400}}
==== Alternativa A - Crear una configuración a mano ==== ==== Usando un fichero de configuración ====
Esta es autoexplicativa: te creas la configuración en el dispositivo móvil y transfieres las claves apropiadas a la configuración del servidor. Si por algún motivo no es posible escanear, prueba esto.
==== Alternativa B - Crear una configuración a partir de un archivo ==== 1. En !FreedomBox, en la página de la app de !WireGuard, haz clic en "Añadir Cliente Automáticamente". Luego haz clic en la opción "Descargar fichero de configuración".
Se descarga un fichero a tu dispositivo. Si se descarga en un dispositivo que no es el que quieres configurar, transfiérelo al dispositivo correcto (o a la persona que quiere conectar con tu servidor VPN).
1. En la app móvil de !WireGuard, haz clic en el botón "+" de la página principal para crear un túnel nuevo. Desde el menú que se muestra, selecciona la opción "Importar desde fichero o archivo".
1. A continuación, selecciona el fichero que se descargó desde el interfaz web de !FreedomBox (o se transfirió al dispositivo).
1. Si falla al importar, verás el mensaje "Cliente wg importado" y un nuevo túnel con el nombre "wg-client". Puedes renombrarlo.
1. Habilita el túnel usando el botón deslizante cuando quieras conectar con el servidor VPN de tu !FreedomBox.
1. Mira la sección de Resolución de Problemas para verificar si tu instalación funciona.
Aquí tienes que comprimir a .zip el archivo de configuración del cliente, transferirlo al dispositivo, e importarlo a la app. {{attachment:FreedomBox/Manual/WireGuard/wireguard-app.png |App de WireGuard |height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-add-tunnel.png |Menú de añadir túnel |height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-imported.png |Fichero de configuración importado|height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-tunnel-added.png|Túnel Añadido |height=400}}
==== Alternativa C - Importarla leyendo un código QR (el método másseguro) ==== ==== Usando configuración manual ====
La versión 0.0.20180724 del cliente móvil soporta lectura de código QR. Si por algún motivo no es posible ni escanear ni importar, prueba esto.
Se puede emplear DebianPackage:qrencode para generar códigos QR incluso desde el terminal/la consola usando carácteres UTF-8. 1. En !FreedomBox, en la página de la app de !WireGuard, haz clic en "Añadir Cliente Automáticamente". Anota la Clave Privada y todos los otros detalles de la página.
1. En la app móvil de !WireGuard, haz clic en el botón "+" de la página principal para crear un túnel nuevo. Desde el menú que se muestra, selecciona la opción "Crear desde cero".
1. En la sección Interfaz nombra el nuevo túnel. En "Clave Privada", pon la clave privada que generó tu !FreedomBox en el primer paso.
La app rellena la clave pública por sí sola (porque la clave pública se deduce de la privada.
Pon como Dirección la dirección IP del primer paso. Y como "Servidores DNS" pon "10.84.0.1".
1. Tras completar la sección Interfaz, haz clic en "Añadir pareja" al final de la página.
En "Clave Pública", pon la "Clave pública del servidor" mostrada en la sección "Como servidor" de la página de la app !WireGuard en !FreedomBox.
Pon en el campo Endpoint una de las URLs mostradas en el primer paso. Y "0.0.0.0/0,::0/0" como "IPs permitidas".
1. Dále a Grabar. Deberías ver el nuevo túnel.
1. Habilita el túnel usando el botón deslizante cuando quieras conectar con el servidor VPN de tu !FreedomBox.
1. Mira la sección de Resolución de Problemas para verificar si tu instalación funciona.
La syntaxis es: {{attachment:FreedomBox/Manual/WireGuard/wireguard-app.png |App de WireGuard |height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-add-tunnel.png |Menú de añadir túnel |height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-manual-add-1.png|Rellenar sección de interfaz |height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-manual-add-2.png|Rellenar sección de emparejamiento|height=400}}
{{attachment:FreedomBox/Manual/WireGuard/wireguard-app-tunnel-added.png|Túnel Añadido |height=400}}
{{{ === Configurar la app de escritorio (GNU/Linux) para usar el servidor VPN ===
# qrencode -t ansiutf8 < client.conf
}}}
Esto generará un código QR legible desde el cliente móvil. En un escritorio GNU/Linux como Debian, instala el paquete de software {{{wireguard}}} o {{{wireguard-tools}}}. Más detalles en la página de [[https://www.wireguard.com/install/|instalación]].
La ventaja de este enfoque es que no hay necesidad de software adicional ni de transferir información sensible a través de canales de datos que podrían estar comprometidos. 1. En !FreedomBox, en la página de la app de !WireGuard, haz clic en "Añadir Cliente Automáticamente". Luego haz clic en la opción "Descargar fichero de configuración".
Se descarga un fichero a tu dispositivo. Si se descarga en un dispositivo que no es el que quieres configurar, transfiérelo al dispositivo correcto (o a la persona que quiere conectar con tu servidor VPN).
1. Para activar el túnel ejecuta la órden {{{sudo wg-quick up /ruta/a/tu/wg-client.conf}}}. Para desactivar el túnel, ejecuta {{{sudo wg-quick down /ruta/a/tu/wg-client.conf}}}.
1. Mira la sección de Resolución de Problemas para verificar si tu instalación funciona.
=== Configurar la app de escritorio (Windows) para usar el servidor VPN ===
Descarga e instala el cliente !WireGuard oficial para Windows. Más detalles en la página de [[https://www.wireguard.com/install/|instalación]].
1. En !FreedomBox, en la página de la app de !WireGuard, haz clic en "Añadir Cliente Automáticamente". Luego haz clic en la opción "Descargar fichero de configuración".
Se descarga un fichero a tu dispositivo. Si se descarga en un dispositivo que no es el que quieres configurar, transfiérelo al dispositivo correcto (o a la persona que quiere conectar con tu servidor VPN).
1. Importa el fichero de configuración a la app Windows de !WireGuard. Después deberías poder activar y desactivar el túnel.
1. Mira la sección de Resolución de Problemas para verificar si el túnel funciona.
=== Configurar la app de escritorio (MacOS) para usar el servidor VPN ===
Descarga e instala el cliente !WireGuard oficial para MacOS. Más detalles en la página de [[https://www.wireguard.com/install/|instalación]].
1. En !FreedomBox, en la página de la app de !WireGuard, haz clic en "Añadir Cliente Automáticamente". Luego haz clic en la opción "Descargar fichero de configuración".
Se descarga un fichero a tu dispositivo. Si se descarga en un dispositivo que no es el que quieres configurar, transfiérelo al dispositivo correcto (o a la persona que quiere conectar con tu servidor VPN).
1. Importa el fichero de configuración a la app MacOS de !WireGuard. Después deberías poder activar y desactivar el túnel.
1. Mira la sección de Resolución de Problemas para verificar si el túnel funciona.
=== Resolución de problemas ===
Tras activar el túnel, todo el tráfico del sistema viajará por la VPN que has configurado. Si hay algún error en la configuración, activar el túnel no fallará porque no hay conexión que valga.
Nada te avisará de que tu tráfico no llega al servidor. Para asegurarte:
1. Activa el túnel.
1. Abre un navegador y accede a un sitio web como https://www.wikipedia.org. Debería funcionar.
1. Abre un navegador y accede a https://10.84.0.1 (tu !FreedomBox). Esto debería mostrarte la interfaz web de tu !FreedomBox (tras un aviso de seguridad).
1. En !FreedomBox, en la página de la app !WireGuard, en la sección "Como Servidor", en la tabla "Parejas", haz clic en la clave pública del cliente.
Esto muestra la página de Clientes Permitidos, que debería mostrarte algún valor para "Última conexión" y un valor mayor que cero para Datos recibidos.
1. En la página de Clientes Permitidos de !FreedomBox debería mostrarte algún valor para "Última conexión" y un valor mayor que cero para Datos recibidos.
1. Si tienes {{{ping}}} instalado en tu máquina cliente, ejecutar {{{ping 9.9.9.9}}} debería recibir respuestas.
1. Si tienes {{{traceroute}}} instalado en tu máquina, ejecutar {{{traceroute 9.9.9.9"}}} debería mostrar "10.84.0.1" como primer paso en la entrega de paquetes de red.
Si lo anterior no funciona, verifica lo siguiente:
1. En la sección "Como Servidor" de la app !WireGuard en !FreedomBox debe mostrarse en la lista de Parejas la clave pública del cliente. Y debe coincidir exáctamente.
1. En la app cliente el valor de la dirección IP debe coincidir con la IP Permitida asociada a la clave pública en !FreedomBox.
1. La clave pública del servidor mostrada en la sección "Como Servidor" de la app de !WireGuard del interfaz de !FreedomBox debe coincidir con la clave pública establecida en la sección de emparejamiento de la app cliente. Y debe coincidir exáctamente.
1. En la sección de emparejamiento de la configuración del túnel en la app cliente, las IPs permitidas deben ser "0.0.0.0/0,::0/0".
1. La URL de endpoint de la pareja en la app cliente debería ser el nombre de dominio o la dirección IP del servidor !FreedomBox seguidos de {{{:51820}}}.
Tu !FreedomBox también debe ser alcanzable desde esa dirección IP o nombre de dominio. Desactiva el túnel y escribe esa dirección (sin el puerto) en un navegador de la máquina cliente.
Debería aparecer la interfaz web de !FreedomBox
=== Problemas conocidos ===
* La versión 26.12 de !FreedomBox tiene rotas las funciones de Mostrar Códgo QR y Descargar Configuración. La version 26.13 las arreglará.
=== Enlaces externos === === Enlaces externos ===
@ -77,4 +186,4 @@ Volver a la [[es/FreedomBox/Features|descripción de Funcionalidades]] o a las p
<<Include(es/FreedomBox/Portal)>> <<Include(es/FreedomBox/Portal)>>
---- ----
CategoryFreedomBox CategoryFreedomBox CategoryAntiSpam

View File

@ -51,7 +51,9 @@ Por omisión las direcciones web de artículos de blog de nueva creación son co
=== Actualizaciones automáticas === === Actualizaciones automáticas ===
Como con todas las demás apps, !FreedomBox (si no se deshabilitan) maneja las actualizaciones funcionales y de seguridad para !WordPress automáticamente. Tras una actualización de versión menor !WordPress efectúa automáticamente cambios en la estructura de la base de datos. No obstante, tras una actualización de versión mayor como un salto bianual de distribución los cambios en la base de datos no son automáticos. Para esto necesitarás ingresar a !WordPress y dispararlos manualmente. Como con todas las demás apps, !FreedomBox (mientras permanezca habilitada la funcionalidad de autoactualización) maneja las actualizaciones funcionales y de seguridad para !WordPress automáticamente. Nótese que el actualizador propio de !WordPress no puede actualizar el núcleo de !WordPress ni plugins que se instalen desde paquetes Debian. Solo se puede usar para actualizar plugins adicionales añadidos a la instalación.
Tras una actualización de versión menor !WordPress efectúa automáticamente cambios en la estructura de la base de datos. No obstante, tras una actualización de versión mayor como un salto bianual de distribución los cambios en la base de datos no son automáticos. Para esto necesitarás ingresar a !WordPress y dispararlos manualmente.
=== Plugins y Temas === === Plugins y Temas ===

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@ -1192,12 +1192,12 @@ from="## BEGIN_INCLUDE", to="## END_INCLUDE")>>')
>>> parse_wiki('{{{#!wiki caution\\n\\nOnce some other app is set as the \ >>> parse_wiki('{{{#!wiki caution\\n\\nOnce some other app is set as the \
home page, you can only navigate to the !FreedomBox Service (Plinth) by \ home page, you can only navigate to the !FreedomBox Service (Plinth) by \
typing https://myfreedombox.rocks/freedombox/ into the browser. <<BR>>\\n\ typing https://myfreedombox.rocks/freedombox/ into the browser. <<BR>>\\n\
''/freedombox'' can also be used as an alias to ''/plinth''\\n}}}') ''/plinth'' can also be used as an alias to ''/freedombox''\\n}}}')
[Admonition('caution', [Paragraph([PlainText('Once some other app is set \ [Admonition('caution', [Paragraph([PlainText('Once some other app is set \
as the home page, you can only navigate to the FreedomBox Service (Plinth) by \ as the home page, you can only navigate to the FreedomBox Service (Plinth) by \
typing '), Url('https://myfreedombox.rocks/freedombox/'), PlainText(' into the \ typing '), Url('https://myfreedombox.rocks/freedombox/'), PlainText(' into the \
browser. ')]), Paragraph([PlainText('/freedombox can also be used as an alias \ browser. ')]), Paragraph([PlainText('/plinth can also be used as an alias \
to /plinth ')])])] to /freedombox ')])])]
>>> parse_wiki('{{{\\nmulti-line\\n\ >>> parse_wiki('{{{\\nmulti-line\\n\
preformatted text (source code)\\n}}}''') preformatted text (source code)\\n}}}''')
@ -1773,8 +1773,8 @@ Code</ulink>'
'<ulink url="https://bugs.debian.org/1234#">Bug</ulink>' '<ulink url="https://bugs.debian.org/1234#">Bug</ulink>'
>>> generate_inner_docbook([Link('DebianPkg:freedombox', \ >>> generate_inner_docbook([Link('DebianPkg:freedombox', \
[PlainText('Plinth')])]) [PlainText('FreedomBox')])])
'<ulink url="https://packages.debian.org/freedombox#">Plinth</ulink>' '<ulink url="https://packages.debian.org/freedombox#">FreedomBox</ulink>'
>>> generate_inner_docbook([Link('AliothList:freedombox-discuss', \ >>> generate_inner_docbook([Link('AliothList:freedombox-discuss', \
[PlainText('Discuss')])]) [PlainText('Discuss')])])

View File

@ -3,4 +3,4 @@
Package init file. Package init file.
""" """
__version__ = '26.11' __version__ = '26.13'

View File

@ -29,7 +29,7 @@ def parse_arguments():
help='web server path under which to serve') help='web server path under which to serve')
parser.add_argument( parser.add_argument(
'--develop', action='store_true', default=None, '--develop', action='store_true', default=None,
help=('run Plinth *insecurely* from current folder; ' help=('run FreedomBox Service *insecurely* from current folder; '
'enable auto-reloading and debugging options')) 'enable auto-reloading and debugging options'))
parser.add_argument('--setup', default=False, nargs='*', parser.add_argument('--setup', default=False, nargs='*',
help='run setup tasks on all essential apps and exit') help='run setup tasks on all essential apps and exit')

View File

@ -18,9 +18,9 @@ from . import actions
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
# Flag on disk to indicate if freedombox package was held by # Flag on disk to indicate if freedombox package was held by FreedomBox
# plinth. This is a backup in case the process is interrupted and hold # Service. This is a backup in case the process is interrupted and hold is not
# is not released. # released.
apt_hold_flag = pathlib.Path('/var/lib/freedombox/package-held') apt_hold_flag = pathlib.Path('/var/lib/freedombox/package-held')
@ -790,7 +790,7 @@ def move_uploaded_file(source: str | pathlib.Path,
If allow_overwrite is set to False and destination file exists, an If allow_overwrite is set to False and destination file exists, an
exception is raised. exception is raised.
""" """
from plinth import settings from freedombox import settings
if isinstance(source, str): if isinstance(source, str):
source = pathlib.Path(source) source = pathlib.Path(source)

View File

@ -14,7 +14,7 @@ import traceback
import types import types
import typing import typing
from plinth import cfg, module_loader from freedombox import cfg, module_loader
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -463,8 +463,8 @@ def _privileged_call(module_name, action_name, arguments, log_error=True):
raise SyntaxError('Invalid module name') raise SyntaxError('Invalid module name')
cfg.read() cfg.read()
if module_name == 'plinth': if module_name == 'freedombox':
import_path = 'plinth' import_path = 'freedombox'
else: else:
try: try:
import_path = module_loader.get_module_import_path(module_name) import_path = module_loader.get_module_import_path(module_name)

View File

@ -9,9 +9,9 @@ import inspect
import logging import logging
from typing import ClassVar, TypeAlias from typing import ClassVar, TypeAlias
from plinth import cfg from freedombox import cfg
from plinth.diagnostic_check import DiagnosticCheck from freedombox.diagnostic_check import DiagnosticCheck
from plinth.signals import post_app_loading from freedombox.signals import post_app_loading
from . import clients as clients_module from . import clients as clients_module
from . import db from . import db
@ -130,7 +130,7 @@ class App:
def info(self): def info(self):
"""Return the information component of the app. """Return the information component of the app.
It is mandatory to have one :class:`~plinth.app.Info` component in It is mandatory to have one :class:`~freedombox.app.Info` component in
every app to provide basic information about the app. Trying to access every app to provide basic information about the app. Trying to access
this property without having the Info component will result in a this property without having the Info component will result in a
KeyError exception being raised. The lookup for the Info component is KeyError exception being raised. The lookup for the Info component is
@ -230,7 +230,7 @@ class App:
"""Run diagnostics and return results. """Run diagnostics and return results.
Return value must be a list of results. Each result is a Return value must be a list of results. Each result is a
:class:`~plinth.diagnostic_check.DiagnosticCheck` with a :class:`~freedombox.diagnostic_check.DiagnosticCheck` with a
unique check_id, a user visible description of the test, the result, unique check_id, a user visible description of the test, the result,
test parameters, and the component ID. The test result is a string test parameters, and the component ID. The test result is a string
enumeration from 'failed', 'passed', 'error', 'warning' and 'not_done'. enumeration from 'failed', 'passed', 'error', 'warning' and 'not_done'.
@ -314,7 +314,7 @@ class App:
This is typically true if the apps has daemons or containers. This is typically true if the apps has daemons or containers.
""" """
from plinth import log from freedombox import log
for component in self.components.values(): for component in self.components.values():
if isinstance(component, log.LogEmitter): if isinstance(component, log.LogEmitter):
return True return True
@ -323,7 +323,7 @@ class App:
def get_logs(self) -> _list_type[dict[str, str]]: def get_logs(self) -> _list_type[dict[str, str]]:
"""Return the logs in a dictionary format.""" """Return the logs in a dictionary format."""
from plinth import log from freedombox import log
logs: list[dict[str, str]] = [] logs: list[dict[str, str]] = []
for component in self.components.values(): for component in self.components.values():
if isinstance(component, log.LogEmitter): if isinstance(component, log.LogEmitter):
@ -380,7 +380,7 @@ class Component:
"""Run diagnostics and return results. """Run diagnostics and return results.
Return value must be a list of results. Each result is a Return value must be a list of results. Each result is a
:class:`~plinth.diagnostic_check.DiagnosticCheck` with a :class:`~freedombox.diagnostic_check.DiagnosticCheck` with a
unique check_id, a user visible description of the test, the result, unique check_id, a user visible description of the test, the result,
test parameters, and the component ID. The test result is a string test parameters, and the component ID. The test result is a string
enumeration from 'failed', 'passed', 'error', 'warning' and 'not_done'. enumeration from 'failed', 'passed', 'error', 'warning' and 'not_done'.
@ -533,7 +533,7 @@ class Info(FollowerComponent):
'clients' is the list of applications that can be used with the 'clients' is the list of applications that can be used with the
services provided by this app. This is used to suggest installation of services provided by this app. This is used to suggest installation of
compatible clients on desktop, web and mobile. This is a list of compatible clients on desktop, web and mobile. This is a list of
dictionaries who structure is documented in plinth.clients. dictionaries who structure is documented in freedombox.clients.
'donation_url' is a link to a webpage that describes how to 'donation_url' is a link to a webpage that describes how to
donate to the upstream project. donate to the upstream project.
@ -611,17 +611,17 @@ class EnableState(LeaderComponent):
def is_enabled(self): def is_enabled(self):
"""Return whether the app/component is enabled.""" """Return whether the app/component is enabled."""
from plinth import kvstore from freedombox import kvstore
return kvstore.get_default(self.key, False) return kvstore.get_default(self.key, False)
def enable(self): def enable(self):
"""Store that the app/component is enabled.""" """Store that the app/component is enabled."""
from plinth import kvstore from freedombox import kvstore
kvstore.set(self.key, True) kvstore.set(self.key, True)
def disable(self): def disable(self):
"""Store that the app/component is disabled.""" """Store that the app/component is disabled."""
from plinth import kvstore from freedombox import kvstore
kvstore.set(self.key, False) kvstore.set(self.key, False)

View File

@ -22,7 +22,7 @@ server_dir = '/freedombox'
host = '127.0.0.1' host = '127.0.0.1'
port = 8000 port = 8000
# Enable the following only if Plinth is behind a proxy server. The # Enable the following only if FreedomBox is behind a proxy server. The
# proxy server should properly clean and the following HTTP headers: # proxy server should properly clean and the following HTTP headers:
# X-Forwarded-For # X-Forwarded-For
# X-Forwarded-Host # X-Forwarded-Host

View File

@ -5,9 +5,9 @@ import pathlib
from django.utils.translation import gettext_noop from django.utils.translation import gettext_noop
from plinth.diagnostic_check import (DiagnosticCheck, from freedombox.diagnostic_check import (DiagnosticCheck,
DiagnosticCheckParameters, Result) DiagnosticCheckParameters, Result)
from plinth.privileged import config as privileged from freedombox.privileged import config as privileged
from . import app as app_module from . import app as app_module

View File

@ -62,7 +62,7 @@ def pytest_collection_modifyitems(config, items):
@pytest.fixture(name='load_cfg') @pytest.fixture(name='load_cfg')
def fixture_load_cfg(): def fixture_load_cfg():
"""Load test configuration.""" """Load test configuration."""
from plinth import cfg from freedombox import cfg
keys = ('file_root', 'data_dir', 'custom_static_dir', 'store_file', keys = ('file_root', 'data_dir', 'custom_static_dir', 'store_file',
'doc_dir', 'server_dir', 'host', 'port', 'use_x_forwarded_for', 'doc_dir', 'server_dir', 'host', 'port', 'use_x_forwarded_for',
@ -73,7 +73,7 @@ def fixture_load_cfg():
saved_state[key] = getattr(cfg, key) saved_state[key] = getattr(cfg, key)
root_dir = pathlib.Path(__file__).resolve().parent root_dir = pathlib.Path(__file__).resolve().parent
cfg_file = root_dir / 'plinth' / 'develop.config' cfg_file = root_dir / 'freedombox' / 'develop.config'
cfg.read_file(str(cfg_file)) cfg.read_file(str(cfg_file))
yield cfg yield cfg
@ -187,10 +187,10 @@ def fixture_mock_run_as_user():
"""A fixture to override action_utils.run_as_user.""" """A fixture to override action_utils.run_as_user."""
def _bypass_runuser(*args, username, **kwargs): def _bypass_runuser(*args, username, **kwargs):
from plinth import action_utils from freedombox import action_utils
return action_utils.run(*args, **kwargs) return action_utils.run(*args, **kwargs)
with patch('plinth.action_utils.run_as_user') as mock: with patch('freedombox.action_utils.run_as_user') as mock:
mock.side_effect = _bypass_runuser mock.side_effect = _bypass_runuser
yield yield
@ -287,7 +287,7 @@ def fixture_host_sudo(host):
@pytest.fixture(name='test_menu') @pytest.fixture(name='test_menu')
def fixture_test_menu(): def fixture_test_menu():
"""Initialized menu module.""" """Initialized menu module."""
from plinth import menu as menu_module from freedombox import menu as menu_module
menu_module.Menu._all_menus = set() menu_module.Menu._all_menus = set()
menu_module.init() menu_module.init()

View File

@ -5,10 +5,10 @@ import contextlib
from django.utils.translation import gettext_noop from django.utils.translation import gettext_noop
from plinth import app, log, privileged from freedombox import app, log, privileged
from plinth.daemon import diagnose_port_listening from freedombox.daemon import diagnose_port_listening
from plinth.diagnostic_check import (DiagnosticCheck, from freedombox.diagnostic_check import (DiagnosticCheck,
DiagnosticCheckParameters, Result) DiagnosticCheckParameters, Result)
class Container(app.LeaderComponent, log.LogEmitter): class Container(app.LeaderComponent, log.LogEmitter):
@ -89,7 +89,7 @@ class Container(app.LeaderComponent, log.LogEmitter):
@contextlib.contextmanager @contextlib.contextmanager
def ensure_running(self): def ensure_running(self):
"""Ensure a service is running and return to previous state.""" """Ensure a service is running and return to previous state."""
from plinth.privileged import service as service_privileged from freedombox.privileged import service as service_privileged
starting_state = self.is_running() starting_state = self.is_running()
if not starting_state: if not starting_state:
service_privileged.enable(self.name) service_privileged.enable(self.name)
@ -121,7 +121,7 @@ class Container(app.LeaderComponent, log.LogEmitter):
def diagnose(self) -> list[DiagnosticCheck]: def diagnose(self) -> list[DiagnosticCheck]:
"""Check if the container is running.. """Check if the container is running..
See :py:meth:`plinth.app.Component.diagnose`. See :py:meth:`freedombox.app.Component.diagnose`.
""" """
results = [] results = []
results.append(self._diagnose_unit_is_running()) results.append(self._diagnose_unit_is_running())

View File

@ -6,8 +6,8 @@ Django context processors to provide common data to templates.
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.utils.translation import gettext_noop from django.utils.translation import gettext_noop
from plinth import cfg, views, web_server from freedombox import cfg, views, web_server
from plinth.utils import is_user_admin from freedombox.utils import is_user_admin
def common(request): def common(request):
@ -20,7 +20,7 @@ def common(request):
# the brand name 'FreedomBox' itself to be translated. # the brand name 'FreedomBox' itself to be translated.
gettext_noop('FreedomBox') gettext_noop('FreedomBox')
from plinth.notification import Notification from freedombox.notification import Notification
notifications_context = Notification.get_display_context( notifications_context = Notification.get_display_context(
request, user=request.user) request, user=request.user)

View File

@ -8,9 +8,9 @@ import subprocess
import psutil import psutil
from django.utils.translation import gettext_noop from django.utils.translation import gettext_noop
from plinth import action_utils, app, log from freedombox import action_utils, app, log
from plinth.diagnostic_check import (DiagnosticCheck, from freedombox.diagnostic_check import (DiagnosticCheck,
DiagnosticCheckParameters, Result) DiagnosticCheckParameters, Result)
class Daemon(app.LeaderComponent, log.LogEmitter): class Daemon(app.LeaderComponent, log.LogEmitter):
@ -71,14 +71,14 @@ class Daemon(app.LeaderComponent, log.LogEmitter):
def enable(self): def enable(self):
"""Run operations to enable the daemon/unit.""" """Run operations to enable the daemon/unit."""
from plinth.privileged import service as service_privileged from freedombox.privileged import service as service_privileged
service_privileged.enable(self.unit) service_privileged.enable(self.unit)
if self.alias: if self.alias:
service_privileged.enable(self.alias) service_privileged.enable(self.alias)
def disable(self): def disable(self):
"""Run operations to disable the daemon/unit.""" """Run operations to disable the daemon/unit."""
from plinth.privileged import service as service_privileged from freedombox.privileged import service as service_privileged
service_privileged.disable(self.unit) service_privileged.disable(self.unit)
if self.alias: if self.alias:
service_privileged.disable(self.alias) service_privileged.disable(self.alias)
@ -90,7 +90,7 @@ class Daemon(app.LeaderComponent, log.LogEmitter):
@contextlib.contextmanager @contextlib.contextmanager
def ensure_running(self): def ensure_running(self):
"""Ensure a service is running and return to previous state.""" """Ensure a service is running and return to previous state."""
from plinth.privileged import service as service_privileged from freedombox.privileged import service as service_privileged
if action_utils.service_show(self.unit)['LoadState'] == 'not-found': if action_utils.service_show(self.unit)['LoadState'] == 'not-found':
# The service's package not installed yet, don't try to start it # The service's package not installed yet, don't try to start it
@ -111,7 +111,7 @@ class Daemon(app.LeaderComponent, log.LogEmitter):
def diagnose(self) -> list[DiagnosticCheck]: def diagnose(self) -> list[DiagnosticCheck]:
"""Check if the daemon is running and listening on expected ports. """Check if the daemon is running and listening on expected ports.
See :py:meth:`plinth.app.Component.diagnose`. See :py:meth:`freedombox.app.Component.diagnose`.
""" """
results = [] results = []

View File

@ -7,7 +7,7 @@ Uses utilities from 'postgres' package such as 'psql' and 'pg_dump'.
import os import os
import pathlib import pathlib
from plinth import action_utils from freedombox import action_utils
def _run_as(command, **kwargs): def _run_as(command, **kwargs):

View File

@ -6,7 +6,7 @@ Expose some API over D-Bus.
import logging import logging
import threading import threading
from plinth.utils import import_from_gi from freedombox.utils import import_from_gi
from . import setup from . import setup
@ -95,7 +95,7 @@ class DBusServer():
self.package_handler = PackageHandler() self.package_handler = PackageHandler()
self.package_handler.register(connection) self.package_handler.register(connection)
from plinth.modules.letsencrypt.dbus import LetsEncrypt from freedombox.modules.letsencrypt.dbus import LetsEncrypt
lets_encrypt = LetsEncrypt() lets_encrypt = LetsEncrypt()
lets_encrypt.register(connection) lets_encrypt.register(connection)

View File

@ -9,7 +9,7 @@ from typing import TypeAlias
from django.utils.translation import gettext from django.utils.translation import gettext
from plinth.utils import SafeFormatter from freedombox.utils import SafeFormatter
DiagnosticCheckParameters: TypeAlias = dict[str, str | int | bool | None] DiagnosticCheckParameters: TypeAlias = dict[str, str | int | bool | None]

View File

@ -4,22 +4,22 @@ Project specific errors
""" """
class PlinthError(Exception): class FbxError(Exception):
"""Base class for all FreedomBox specific errors.""" """Base class for all FreedomBox specific errors."""
class PackageNotInstalledError(PlinthError): class PackageNotInstalledError(FbxError):
"""Could not complete module setup due to missing package.""" """Could not complete module setup due to missing package."""
class DomainNotRegisteredError(PlinthError): class DomainNotRegisteredError(FbxError):
""" """
An action couldn't be performed because this An action couldn't be performed because this
FreedomBox doesn't have a registered domain FreedomBox doesn't have a registered domain
""" """
class MissingPackageError(PlinthError): class MissingPackageError(FbxError):
"""Package is not available to be installed at this time.""" """Package is not available to be installed at this time."""
def __init__(self, name): def __init__(self, name):

View File

@ -11,12 +11,12 @@ from django.utils import translation
from django.utils.translation import get_language_info from django.utils.translation import get_language_info
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
import plinth import freedombox
def _get_repository_choices(): def _get_repository_choices():
"""Return the list of available repositories.""" """Return the list of available repositories."""
import plinth.modules.backups.repository as repository_module import freedombox.modules.backups.repository as repository_module
choices = [(repository.uuid, repository.name) choices = [(repository.uuid, repository.name)
for repository in repository_module.get_repositories() for repository in repository_module.get_repositories()
if repository.is_usable()] if repository.is_usable()]
@ -54,7 +54,7 @@ class DomainSelectionForm(forms.Form):
def __init__(self, show_none=False, *args, **kwargs): def __init__(self, show_none=False, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
from plinth.modules.names.components import DomainName from freedombox.modules.names.components import DomainName
domains = list(DomainName.list_names()) domains = list(DomainName.list_names())
choices = list(zip(domains, domains)) choices = list(zip(domains, domains))
@ -70,7 +70,7 @@ class DomainSelectionForm(forms.Form):
def _get_domain_choices(): def _get_domain_choices():
"""Double domain entries for inclusion in the choice field.""" """Double domain entries for inclusion in the choice field."""
from plinth.modules.names import get_available_tls_domains from freedombox.modules.names import get_available_tls_domains
return ((domain, domain) for domain in get_available_tls_domains()) return ((domain, domain) for domain in get_available_tls_domains())
@ -109,9 +109,9 @@ class LanguageSelectionFormMixin:
for language_code, language_name in settings.LANGUAGES: for language_code, language_name in settings.LANGUAGES:
locale_code = translation.to_locale(language_code) locale_code = translation.to_locale(language_code)
plinth_dir = os.path.dirname(plinth.__file__) freedombox_dir = os.path.dirname(freedombox.__file__)
if language_code == 'en' or os.path.exists( if language_code == 'en' or os.path.exists(
os.path.join(plinth_dir, 'locale', locale_code)): os.path.join(freedombox_dir, 'locale', locale_code)):
supported_languages.append( supported_languages.append(
(language_code, (language_code,
_get_local_name(language_code, language_name))) _get_local_name(language_code, language_name)))

View File

@ -6,8 +6,8 @@ import logging
import pathlib import pathlib
from typing import ClassVar from typing import ClassVar
from plinth import app, cfg from freedombox import app, cfg
from plinth.modules.users import privileged as users_privileged from freedombox.modules.users import privileged as users_privileged
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -7,8 +7,8 @@ import logging
import random import random
import threading import threading
from plinth import dbus, network from freedombox import dbus, network
from plinth.utils import import_from_gi from freedombox.utils import import_from_gi
from . import cfg from . import cfg

View File

@ -8,7 +8,7 @@ from . import db
def get(key): def get(key):
"""Return the value of a key""" """Return the value of a key"""
from plinth.models import KVStore from freedombox.models import KVStore
with db.lock: with db.lock:
# pylint: disable-msg=E1101 # pylint: disable-msg=E1101
@ -26,7 +26,7 @@ def get_default(key, default_value):
def set(key, value): # pylint: disable-msg=W0622 def set(key, value): # pylint: disable-msg=W0622
"""Store the value of a key""" """Store the value of a key"""
from plinth.models import KVStore from freedombox.models import KVStore
with db.lock: with db.lock:
store = KVStore(key=key, value=value) store = KVStore(key=key, value=value)
store.save() store.save()
@ -34,7 +34,7 @@ def set(key, value): # pylint: disable-msg=W0622
def delete(key, ignore_missing=False): def delete(key, ignore_missing=False):
"""Delete a key""" """Delete a key"""
from plinth.models import KVStore from freedombox.models import KVStore
with db.lock: with db.lock:
try: try:
return KVStore.objects.get(key=key).delete() return KVStore.objects.get(key=key).delete()

Some files were not shown because too many files have changed in this diff Show More