freedombox release 26.12 for unstable

[dgit distro=debian split]
 [dgit please-upload source=freedombox version=26.12]
 -----BEGIN PGP SIGNATURE-----
 
 iQJKBAABCgA0FiEEfWrbdQ+RCFWJSEvmd8DHXntlCAgFAmqoloQWHGp2YWxsZXJv
 eUBtYWlsYm94Lm9yZwAKCRB3wMdee2UICCTHEACYWHi2sQlV6ZLQmskRW0wV1l7O
 96I3n8EZiaNvd1g5jKXKCG/dlRPh3IT/amFlOyH/XlSUfTHk2tr4qULQXkgONbry
 YdFnXYcl33cV+3EjzOcZTGPbbmPW9cxBFOdbIMGRFVs2Fj46chNjfPlYh172MUBU
 IqAcWWv5UaTtgxXMzgBOoG6Agg5NRZPKIL7YZVvquHHlM+ds7dvn6fHm71YCx53P
 GipIJzN0smhRppOMM1YNPGH2ZDglQId9FCdiLsoG9ZTz+mDKChpyH7hNOhlybHqT
 3TWHy4XcBozmToVawDQTTl3xsKqfQOxdn4T1zpdsdAfy7yQj8lKueYReV1ovwP9O
 /g8hkEnRWX79oV5ijwdHqlUXzn3tFI9LhXZ+eIz0fCCTdDjuezLtjPP/tRPLeCY9
 kMZIyXrJfrjlLxmtHQnc2F3KzKTbW0+C/0aUvtOy7YE/hgry0Jrlrv/m2pB4VLAK
 /sfFMbg87TYRvBDnlKxES7BtpsZKahfp9xxU4lAB0i1Cg7m3ocBXvw4h0zrOsLir
 IA62+KnJ/xaMQS2Rqxe/WLeUd4tBSuhdzzyoCcFo0/ihKUmX62DGcITOC50k5H+F
 BmlBh3FJMGhaMlj0ITpgsRkrICuTVNTtgugg0kiWbYswwTjVoOWE+1UU69h5CMIN
 v0SUo5+dyo81ZHHe3g==
 =jXOR
 -----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
 
 iQJKBAABCgA0FiEEfWrbdQ+RCFWJSEvmd8DHXntlCAgFAmque9QWHGp2YWxsZXJv
 eUBtYWlsYm94Lm9yZwAKCRB3wMdee2UICESCD/9LMIMdVKySWJ34fpGo1F/5Lsvq
 CyEBnv1GZ0Kuk2wUyDlSRFZtkGJFPxnZxRmjXSc1xtWN5f8XOltxINJu2lXeLx2e
 Z+FD36YHDCJKo0ijFsKiAyh7pTyxKbKJItRWSfu0rL8gwS4rjDE/GBvR+QykkmFz
 E3GJHdNyuppOLr/e8I69+M7+zVUm7ZJQCBkaV//vuvGO53g64FLRYUqFoWdyjYNl
 J00Eor+n6yk0AKV9h4wrgUsWnEovB1YKDQRi40riMSjTyQ8Cd+JVm+qtpsT/NtDD
 1m/dUxgnXZdb9a0Q353PG/ymJAgQ5YqMBKA3UBYoEhIsj6yXMWmydFMKF9Cv4VmL
 DBKD9M03prdOU7x7bdcUITXr7E+8KvfS/h1LmEBU+G8NkD/R4IK7hGapjP38BY9I
 UCQhhezPEI/FoYzqZo4mQxkiGO7bbWh/2GhLLgKCSS9SnEgN9WAs1LnzVnFv983j
 i0vEYIeOxQLcsMRMaBp/nt8LjIMavXgi8Z1GQ7LOiIqCPYvkZ3elyYStI5SAbmFq
 uG2JwrdJKmzD+EbMjSxkPuYP5EzMh5AXQ7cYqTSttr/5JHnQEkJprc8ztTmaGEpZ
 QWZZYHcNxV3+M9ah5Co1JMh8T1fKUEcNlk1IEvAx+PaKpZOP7koVKGjAG9akAZp4
 KQC+peg2P/LDQ2+68A==
 =ZjN5
 -----END PGP SIGNATURE-----

Merge tag 'debian/26.12' into debian/trixie-backports

freedombox release 26.12 for unstable
This commit is contained in:
James Valleroy 2026-09-19 08:10:48 -04:00
commit 32733532fa
1394 changed files with 121743 additions and 105587 deletions

View File

@ -78,7 +78,7 @@ development environment inside a systemd-nspawn container.
1. To run unit and functional tests for an app:
```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
@ -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.
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)).
In that case, consider introducing yourself on #freedombox IRC (irc.debian.org),
because some work may have been done already on the [Debian translators
discussion lists](https://www.debian.org/MailingLists/subscribe)
or the Weblate localization platform.
`freedombox/freedombox/locale/` and create a pull request (see
[CONTRIBUTING.md](CONTRIBUTING.md)). In that case, consider introducing yourself
on #freedombox IRC (irc.debian.org), because some work may have been done
already on the [Debian translators discussion
lists](https://www.debian.org/MailingLists/subscribe) or the Weblate
localization platform.
For more information on translations: https://wiki.debian.org/FreedomBox/Translate
@ -449,16 +450,16 @@ options. See pytest documentation for further filter options.
```bash
# Run tests in a directory
guest$ py.test-3 plinth/tests
guest$ py.test-3 freedombox/tests
# 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
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
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:
@ -489,13 +490,13 @@ guest$ sudo EXTENDED_TESTING=1 py.test-3
To run the coverage tool in the container/VM:
```bash
guest$ py.test-3 --cov=plinth
guest$ py.test-3 --cov=freedombox
```
To collect HTML report:
```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.
@ -519,7 +520,7 @@ executed (red).
Inside the container run
```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
@ -565,13 +566,14 @@ on the guest.
#### 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
* Password: testingtesting
This step is optional if a fresh install of Plinth is being tested. Functional
tests will create the required user using FreedomBox's first boot process.
This step is optional if a fresh install of FreedomBox is being tested.
Functional tests will create the required user using FreedomBox's first boot
process.
#### Running Functional Tests
@ -620,7 +622,7 @@ In the VM or container, run the following command:
```
guest$ cd /freedombox
guest$ sudo make build install
guest$ plinth/tests/functional/enable-all-apps
guest$ freedombox/tests/functional/enable-all-apps
```
[back to index](#hacking)

View File

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

View File

@ -58,14 +58,14 @@ 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:
$(DJANGO_ADMIN) makemessages --all --domain django --keep-pot \
--verbosity=1 --ignore conftest.py --ignore doc --ignore build \
--ignore htmlcov --ignore screenshots --ignore debian --ignore \
actions --ignore preseed --ignore static --ignore data \
--settings plinth.settings --pythonpath .
--settings freedombox.settings --pythonpath .
configure:
# Nothing to do
@ -78,7 +78,7 @@ build:
$(MAKE) -C doc -j 8
# Build .whl package
rm -f dist/plinth-*.whl
rm -f dist/freedombox-*.whl
$(PYTHON) -m build --no-isolation --skip-dependency-check --wheel
install:
@ -96,15 +96,15 @@ install:
# Python package
temp=$$(mktemp -d) && \
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 \
--ignore-installed --target=$${temp} && \
$(INSTALL) -d $(DESTDIR)$${lib_dir} && \
rm -rf $(DESTDIR)$${lib_dir}/plinth $(DESTDIR)$${lib_dir}/plinth*.dist-info && \
mv $${temp}/plinth $${temp}/plinth*.dist-info $(DESTDIR)$${lib_dir} && \
rm -f $(DESTDIR)$${lib_dir}/plinth*.dist-info/licenses/COPYING.md && \
rm -f $(DESTDIR)$${lib_dir}/plinth*.dist-info/direct_url.json && \
$(INSTALL) -D -t $(BIN_DIR) bin/plinth
rm -rf $(DESTDIR)$${lib_dir}/freedombox $(DESTDIR)$${lib_dir}/freedombox*.dist-info && \
mv $${temp}/freedombox $${temp}/freedombox*.dist-info $(DESTDIR)$${lib_dir} && \
rm -f $(DESTDIR)$${lib_dir}/freedombox*.dist-info/licenses/COPYING.md && \
rm -f $(DESTDIR)$${lib_dir}/freedombox*.dist-info/direct_url.json && \
$(INSTALL) -D -t $(BIN_DIR) bin/freedombox
$(INSTALL) -D -t $(LIB_DIR)/freedombox bin/freedombox-privileged
$(INSTALL) -D -t $(BIN_DIR) bin/freedombox-cmd
$(INSTALL) -D -t $(BIN_DIR) bin/freedombox-change-password
@ -121,7 +121,7 @@ install:
cp $(CP_ARGS) $${file} $${target} ; \
done
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} ; \
cp $(CP_ARGS) $${file} $${target} ; \
done
@ -137,12 +137,12 @@ check-tests:
# Tests with coverage report
check-tests-cov:
$(PYTHON) -m pytest $(PYTEST_ARGS) --cov=plinth \
$(PYTHON) -m pytest $(PYTEST_ARGS) --cov=freedombox \
--cov-report=html:./htmlcov --cov-report=term
# Code quality checking using flake8
check-code:
$(PYTHON) -m flake8 plinth container
$(PYTHON) -m flake8 freedombox container
# Static type checking using mypy
check-type:
@ -154,8 +154,8 @@ check-doc:
clean:
make -C doc clean
rm -rf Plinth.egg-info
find plinth/locale -name *.mo -delete
rm -rf Freedombox.egg-info
find freedombox/locale -name *.mo -delete
define DEVELOP_SERVICE_CONF
[Service]

5
Vagrantfile vendored
View File

@ -17,15 +17,12 @@ Vagrant.configure(2) do |config|
config.vm.provision "shell", run: 'always', inline: <<-SHELL
# Disable automatic 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
config.vm.provision "shell", inline: <<-SHELL
cd /freedombox/
make provision-dev
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
for development. To get the IP address:
$ vagrant ssh

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3
# 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 sys
import plinth.web_framework
from plinth.modules.users import privileged
import freedombox.web_framework
from freedombox.modules.users import privileged
def main():
"""Ask for new password, setup Django and update a user's password."""
try:
plinth.web_framework.init()
freedombox.web_framework.init()
except Exception:
_print('Error initializing Django.')
return

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3
# 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
# 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
if ! [[ -e /usr/local/bin/geckodriver ]]
then
/freedombox/plinth/tests/functional/install.sh
/freedombox/freedombox/tests/functional/install.sh
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" ]]
then
make -C /freedombox wait-while-first-setup
@ -1392,6 +1392,7 @@ class VM(Machine):
with tempfile.NamedTemporaryFile() as file_handle:
file_handle.write(domain_xml.encode())
file_handle.flush()
logger.info('Running `virsh define %s`', file_handle.name)
self._virsh(['define', file_handle.name],
stdout=subprocess.DEVNULL)

View File

@ -39,9 +39,9 @@
</If>
##
## Redirect traffic on home to /freedombox as part of turning the machine
## into FreedomBox server. Plinth then acts as a portal to reach all
## other services.
## Redirect traffic on home to /freedombox as part of turning the machine into
## FreedomBox server. FreedomBox then acts as a portal to reach all other
## services.
##
<IfFile !/etc/apache2/conf-enabled/freedombox-apache-homepage.conf>
RedirectMatch "^/$" "/freedombox"
@ -58,7 +58,7 @@
<Location /freedombox>
ProxyPass http://127.0.0.1:8000/freedombox
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.
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS

View File

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

45
debian/changelog vendored
View File

@ -1,3 +1,48 @@
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~bpo13+1) trixie-backports; urgency=medium
* Rebuild for trixie-backports.

170
debian/copyright vendored
View File

@ -5,8 +5,8 @@ Files: *
Copyright: 2011-2026 FreedomBox Authors
License: AGPL-3+
Files: plinth/modules/jsxc/static/icons/jsxc.png
plinth/modules/jsxc/static/icons/jsxc.svg
Files: freedombox/modules/jsxc/static/icons/jsxc.png
freedombox/modules/jsxc/static/icons/jsxc.svg
Copyright: 2011-2019 FreedomBox Authors
License: AGPL-3+
@ -42,42 +42,42 @@ Copyright: 2011-2025 The Bootstrap Authors
Comment: https://getbootstrap.com/docs/5.3/customize/color-modes/
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.
Comment: https://github.com/bepasty/bepasty-server/blob/master/src/bepasty/static/app/bepasty.svg
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)
Comment: https://github.com/cockpit-project/cockpit/blob/master/src/branding/default/logo.svg
License: LGPL-2.1+
Files: plinth/modules/coturn/static/icons/coturn.png
plinth/modules/coturn/static/icons/coturn.svg
Files: freedombox/modules/coturn/static/icons/coturn.png
freedombox/modules/coturn/static/icons/coturn.svg
Copyright: Kmg Design (https://thenounproject.com/kmgdesignid/)
Comment: Video Call by Kmg Design from the Noun Project https://thenounproject.com/term/video-call/3256092/
License: CC-BY-3.0-US
Files: plinth/modules/deluge/static/icons/deluge.png
plinth/modules/deluge/static/icons/deluge.svg
Files: freedombox/modules/deluge/static/icons/deluge.png
freedombox/modules/deluge/static/icons/deluge.svg
Copyright: 2007 Andrew Wedderburn
Comment: https://commons.wikimedia.org/wiki/File:Deluge-Logo.svg
License: GPL-2+
Files: plinth/modules/ejabberd/static/icons/ejabberd.png
plinth/modules/ejabberd/static/icons/ejabberd.svg
plinth/modules/email/static/icons/email.png
plinth/modules/email/static/icons/email.svg
plinth/modules/gnome/static/icons/gnome.png
plinth/modules/gnome/static/icons/gnome.svg
plinth/modules/matrixsynapse/static/icons/matrixsynapse.svg
plinth/modules/privoxy/static/icons/privoxy.png
plinth/modules/privoxy/static/icons/privoxy.svg
plinth/modules/radicale/static/icons/radicale.svg
plinth/modules/rssbridge/static/icons/rssbridge.png
plinth/modules/rssbridge/static/icons/rssbridge.svg
plinth/modules/zoph/static/icons/zoph.png
plinth/modules/zoph/static/icons/zoph.svg
Files: freedombox/modules/ejabberd/static/icons/ejabberd.png
freedombox/modules/ejabberd/static/icons/ejabberd.svg
freedombox/modules/email/static/icons/email.png
freedombox/modules/email/static/icons/email.svg
freedombox/modules/gnome/static/icons/gnome.png
freedombox/modules/gnome/static/icons/gnome.svg
freedombox/modules/matrixsynapse/static/icons/matrixsynapse.svg
freedombox/modules/privoxy/static/icons/privoxy.png
freedombox/modules/privoxy/static/icons/privoxy.svg
freedombox/modules/radicale/static/icons/radicale.svg
freedombox/modules/rssbridge/static/icons/rssbridge.png
freedombox/modules/rssbridge/static/icons/rssbridge.svg
freedombox/modules/zoph/static/icons/zoph.png
freedombox/modules/zoph/static/icons/zoph.svg
static/themes/default/img/application.svg
static/themes/default/img/network-connection.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
License: LGPL-3 or CC-BY-SA-3.0-US
Files: plinth/modules/featherwiki/static/icons/featherwiki.png
plinth/modules/featherwiki/static/icons/featherwiki.svg
Files: freedombox/modules/featherwiki/static/icons/featherwiki.png
freedombox/modules/featherwiki/static/icons/featherwiki.svg
Copyright: 2022 Robbie Antenesse <dev@alamantus.com>
Comment: https://codeberg.org/Alamantus/FeatherWiki/src/branch/main/logo.svg
License: AGPL-3+
Files: plinth/modules/gitweb/static/icons/gitweb.png
plinth/modules/gitweb/static/icons/gitweb.svg
Files: freedombox/modules/gitweb/static/icons/gitweb.png
freedombox/modules/gitweb/static/icons/gitweb.svg
Copyright: 2010 Git Authors
Comment: https://github.com/git/git/blob/master/gitweb/static/git-logo.png
License: GPL-2
Files: plinth/modules/homeassistant/static/icons/homeassistant.png
plinth/modules/homeassistant/static/icons/homeassistant.svg
Files: freedombox/modules/homeassistant/static/icons/homeassistant.png
freedombox/modules/homeassistant/static/icons/homeassistant.svg
Copyright: Home Assistant Core Developers
Comment: https://github.com/home-assistant/core/blob/dev/tests/components/image_upload/logo.png
License: Apache-2.0
Files: plinth/modules/ikiwiki/static/icons/ikiwiki.png
plinth/modules/ikiwiki/static/icons/ikiwiki.svg
Files: freedombox/modules/ikiwiki/static/icons/ikiwiki.png
freedombox/modules/ikiwiki/static/icons/ikiwiki.svg
Copyright: 2006 Recai Oktaş <roktas@debian.org>
Comment: https://commons.wikimedia.org/wiki/File:Ikiwiki.svg
License: GPL-2+
Files: plinth/modules/infinoted/static/icons/infinoted.png
plinth/modules/infinoted/static/icons/infinoted.svg
Files: freedombox/modules/infinoted/static/icons/infinoted.png
freedombox/modules/infinoted/static/icons/infinoted.svg
Copyright: 2008-2014 Armin Burgmeier <armin@arbur.net>
License: ISC
Files: plinth/modules/janus/static/icons/janus.png
plinth/modules/janus/static/icons/janus.svg
plinth/modules/janus/static/janus-video-room.css
plinth/modules/janus/static/janus-video-room.js
plinth/modules/janus/templates/janus_video_room.html
Files: freedombox/modules/janus/static/icons/janus.png
freedombox/modules/janus/static/icons/janus.svg
freedombox/modules/janus/static/janus-video-room.css
freedombox/modules/janus/static/janus-video-room.js
freedombox/modules/janus/templates/janus_video_room.html
Copyright: 2014-2025 Meetecho
License: GPL-3 with OpenSSL exception
Files: plinth/modules/kiwix/static/icons/kiwix.png
plinth/modules/kiwix/static/icons/kiwix.svg
Files: freedombox/modules/kiwix/static/icons/kiwix.png
freedombox/modules/kiwix/static/icons/kiwix.svg
Copyright: 2020 The other Kiwix guy
Comment: https://commons.wikimedia.org/wiki/File:Kiwix_logo_v3.svg
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
Comment: https://github.com/thekishanraval/Logos
License: GPL-3+
Files: plinth/modules/mediawiki/static/icons/mediawiki.png
plinth/modules/mediawiki/static/icons/mediawiki.svg
Files: freedombox/modules/mediawiki/static/icons/mediawiki.png
freedombox/modules/mediawiki/static/icons/mediawiki.svg
Copyright: 2020 Serhio Magpie
Comment: https://commons.wikimedia.org/wiki/File:MediaWiki-2020-icon.svg
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
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
Comment: https://github.com/luanti-org/luanti/blob/master/misc/luanti.svg
License: CC-BY-SA-3.0
Files: plinth/modules/miniflux/static/icons/miniflux.png
plinth/modules/miniflux/static/icons/miniflux.svg
Files: freedombox/modules/miniflux/static/icons/miniflux.png
freedombox/modules/miniflux/static/icons/miniflux.svg
Copyright: 2018, 2019 Frédéric Guillot
Comment: https://github.com/miniflux/logo
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
Comment: https://commons.wikimedia.org/wiki/File:Icons_mumble.svg
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
Comment: https://github.com/mumble-voip/mumble/blob/master/icons/mumble.svg
https://github.com/mumble-voip/mumble/blob/master/LICENSE
License: BSD-3-clause
Files: plinth/modules/nextcloud/static/icons/nextcloud.png
plinth/modules/nextcloud/static/icons/nextcloud.svg
Files: freedombox/modules/nextcloud/static/icons/nextcloud.png
freedombox/modules/nextcloud/static/icons/nextcloud.svg
Copyright: 2016 Nextcloud GmbH.
Comment: https://nextcloud.com/trademarks/
License: AGPL-3+
Files: plinth/modules/openvpn/static/icons/openvpn.png
Files: freedombox/modules/openvpn/static/icons/openvpn.png
Copyright: 2017 Kishan Raval
Comment: https://github.com/thekishanraval/Logos
License: GPL-3+
Files: plinth/modules/openvpn/static/icons/openvpn.svg
Files: freedombox/modules/openvpn/static/icons/openvpn.svg
Copyright: OpenVPN Technologies, Inc.
Comment: https://commons.wikimedia.org/wiki/File:Ovpntech_logo-s_REVISED.png
License: CC-BY-SA-3.0
Files: plinth/modules/quassel/static/icons/quassel.png
plinth/modules/quassel/static/icons/quassel.svg
Files: freedombox/modules/quassel/static/icons/quassel.png
freedombox/modules/quassel/static/icons/quassel.svg
Copyright: 2005-2019 Quassel Project <devel@quassel-irc.org>
Comment: https://github.com/quassel/quassel/blob/master/pics/quassel-64.svg
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
2008, Pascal Halter
2008-2017, Guillaume Ayoub <guillaume.ayoub@kozea.fr>
@ -210,7 +210,7 @@ Copyright: 2008, Nicolas Kandel
2017, Unrud <unrud@outlook.com>
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>
2013 Thomas Yu - Sian, Liu
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>
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)
Aleksander Machniak (https://github.com/alecpl)
Comment: https://raw.githubusercontent.com/roundcube/roundcubemail/master/skins/elastic/images/logo.svg
License: CC-BY-SA-3.0
Files: plinth/modules/samba/static/icons/samba.png
plinth/modules/samba/static/icons/samba.svg
Files: freedombox/modules/samba/static/icons/samba.png
freedombox/modules/samba/static/icons/samba.svg
Copyright: None
Comment: 2010 Samba Team
https://commons.wikimedia.org/wiki/File:Samba_logo_2010.svg
License: public-domain
Files: plinth/modules/searx/static/icons/searx.png
plinth/modules/searx/static/icons/searx.svg
Files: freedombox/modules/searx/static/icons/searx.png
freedombox/modules/searx/static/icons/searx.svg
Copyright:
2013-2017 Adam Tauber <asciimoo@gmail.com>
2016 Alexandre Flament <alex@al-f.net>
@ -240,84 +240,84 @@ Copyright:
2014 Thomas Pointhuber <thomas.pointhuber@gmx.at>
License: AGPL-3+
Files: plinth/modules/shaarli/static/icons/shaarli.png
plinth/modules/shaarli/static/icons/shaarli.svg
Files: freedombox/modules/shaarli/static/icons/shaarli.png
freedombox/modules/shaarli/static/icons/shaarli.svg
Copyright: 2011-2015 Sébastien SAUVAGE <sebsauvage@sebsauvage.net>
2011-2018 The Shaarli Community
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
License: Zlib
Files: plinth/modules/shadowsocks/static/icons/shadowsocks.png
plinth/modules/shadowsocksserver/static/icons/shadowsocks.png
Files: freedombox/modules/shadowsocks/static/icons/shadowsocks.png
freedombox/modules/shadowsocksserver/static/icons/shadowsocks.png
Copyright: 2014-2018 Symeon Huang (librehat) <hzwhuang@gmail.com>
Comment: https://commons.wikimedia.org/wiki/File:Shadowsocks_logo.png
License: LGPL-3+
Files: plinth/modules/shadowsocks/static/icons/shadowsocks.svg
plinth/modules/shadowsocksserver/static/icons/shadowsocks.svg
Files: freedombox/modules/shadowsocks/static/icons/shadowsocks.svg
freedombox/modules/shadowsocksserver/static/icons/shadowsocks.svg
Copyright: Clowwindy
Comment: https://commons.wikimedia.org/wiki/File:Shadowsocks-Logo.svg
License: Apache-2.0
Files: plinth/modules/sharing/static/icons/sharing.png
plinth/modules/sharing/static/icons/sharing.svg
Files: freedombox/modules/sharing/static/icons/sharing.png
freedombox/modules/sharing/static/icons/sharing.svg
Copyright: Interface (https://www.shareicon.net/author/interface)
Comment: https://www.shareicon.net/universal-interface-interface-sharing-share-697502
License: CC-BY-3.0
Files: plinth/modules/sogo/static/icons/sogo.png
plinth/modules/sogo/static/icons/sogo.svg
Files: freedombox/modules/sogo/static/icons/sogo.png
freedombox/modules/sogo/static/icons/sogo.svg
Copyright: 2024 Inverse inc./Alinto
Comment: https://github.com/Alinto/sogo/blob/master/COPYING.GPL
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>
2014 The Syncthing Authors
2015 Audrius Butkevicius and Contributors
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
Comment: https://commons.wikimedia.org/wiki/File:SyncthingLogoHorizontal.svg
License: MPL-2.0
Files: plinth/modules/tiddlywiki/static/icons/tiddlywiki.svg
plinth/modules/tiddlywiki/static/icons/tiddlywiki.png
Files: freedombox/modules/tiddlywiki/static/icons/tiddlywiki.svg
freedombox/modules/tiddlywiki/static/icons/tiddlywiki.png
Copyright: 2004-2007 Jeremy Ruston <jeremy@jermolene.com>
2007-2016 UnaMesa Association
Comment: https://github.com/Jermolene/TiddlyWiki5/blob/086506012d98e9db34c7d96dc27aea249a9bdbc8/editions/introduction/tiddlers/images/Motovun%20Jack.svg
License: BSD-3-clause
Files: plinth/modules/tor/static/icons/tor.png
plinth/modules/tor/static/icons/tor.svg
Files: freedombox/modules/tor/static/icons/tor.png
freedombox/modules/tor/static/icons/tor.svg
Copyright: The Tor Project, Inc.
Comment: https://commons.wikimedia.org/wiki/File:Tor_logo1.png
https://commons.wikimedia.org/wiki/File:Tor-logo-2011-flat.svg
License: CC-BY-3.0-US
Files: plinth/modules/transmission/static/icons/transmission.png
plinth/modules/transmission/static/icons/transmission.svg
Files: freedombox/modules/transmission/static/icons/transmission.png
freedombox/modules/transmission/static/icons/transmission.svg
Copyright: Transmission Authors
Comment: https://github.com/transmission/transmission/blob/master/gtk/icons/hicolor_apps_scalable_transmission.svg
License: GPL-3
Files: plinth/modules/upgrades/data/usr/share/augeas/lenses/aptsources.aug
plinth/modules/upgrades/data/usr/share/augeas/lenses/tests/test_aptsources.aug
Files: freedombox/modules/upgrades/data/usr/share/augeas/lenses/aptsources.aug
freedombox/modules/upgrades/data/usr/share/augeas/lenses/tests/test_aptsources.aug
Copyright: 2007-2025 David Lutterkort
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
License: LGPL-2.1+
Files: plinth/modules/wordpress/static/icons/wordpress.png
plinth/modules/wordpress/static/icons/wordpress.svg
Files: freedombox/modules/wordpress/static/icons/wordpress.png
freedombox/modules/wordpress/static/icons/wordpress.svg
Copyright: 2011-2021 WordPress Contributors
Comment: https://github.com/WordPress/wordpress-develop/blob/master/src/wp-admin/images/wordpress-logo.svg
License: GPL-2+
Files: plinth/modules/wireguard/static/icons/wireguard.png
plinth/modules/wireguard/static/icons/wireguard.svg
Files: freedombox/modules/wireguard/static/icons/wireguard.png
freedombox/modules/wireguard/static/icons/wireguard.svg
Copyright: 2019 WireGuard LLC
Comment: https://git.zx2c4.com/wireguard-windows/plain/ui/icon/wireguard.svg
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
# name plinth.conf. However, due to the nature of the package, Plinth
# takes the responsibility of configuring various other services
# behind Apache. The upstream hence ships various Apache
# configuration files which are enabled and disabled when user
# requests.
# Apache configuration for the FreedomBox service itself is shipped with proper
# name freedombox.conf. However, due to the nature of the package, FreedomBox
# takes the responsibility of configuring various other services behind Apache.
# The upstream hence ships various Apache configuration files which are enabled
# and disabled when user requests.
freedombox binary: non-standard-apache2-configuration-name *
# Plinth depends on Apache2 and cannot work with just any web server. Instead of
# being a simple web application it is an administration console that configures
# web servers. At some point we would like to work with other web servers but
# that requires significant effort.
# FreedomBox depends on Apache2 and cannot work with just any web server.
# Instead of being a simple web application it is an administration console that
# configures web servers. At some point we would like to work with other web
# servers but that requires significant effort.
freedombox binary: web-application-works-only-with-apache
# 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/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
# meant for user. However, don't install to /usr/libexec and follow systemd

View File

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

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:
# - Python runtime
# - Python library dependencies
@ -13,7 +13,7 @@ Restrictions: needs-root, breaks-testbed
#
# 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, @
Restrictions: breaks-testbed

View File

@ -13,7 +13,7 @@ SCRIPTS_DIR=scripts
manual-pdfs=$(foreach lang,$(MANUAL_LANGUAGES),manual/$(lang)/freedombox-manual.pdf)
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
@ -33,7 +33,7 @@ endif
all: $(OUTPUTS) manual-pages
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 \
install $(INSTALL_OPTS) -t $(INSTALL_DIR)/$$(dirname $${file}) \
$${file} ; \

View File

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

View File

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

View File

@ -1,16 +1,14 @@
.. SPDX-License-Identifier: CC-BY-SA-4.0
Actions
^^^^^^^
Privileged Actions
^^^^^^^^^^^^^^^^^^
FreedomBox's web front does not directly change any aspect of the underlying
operating system. Instead, it calls upon **actions**, as shell commands. Actions
live in ``/usr/share/plinth/actions`` directory. They require no interaction
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.
FreedomBox Service performs most changes to the underlying operating system
using remote calls into the **freedombox-privileged** daemon or other daemons
such as NetworkManager and UDisks.
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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,56 +6,56 @@ Full Code
Transmission app is already included in FreedomBox. Here is the full source for
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
plinth/modules/transmission/forms.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
freedombox/modules/transmission/forms.py
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.. literalinclude:: ../../../plinth/modules/transmission/forms.py
.. literalinclude:: ../../../freedombox/modules/transmission/forms.py
: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
plinth/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
freedombox/modules/transmission/privileged.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

View File

@ -3,11 +3,11 @@
Part 4: Components
------------------
Each :class:`~plinth.app.App` contains various :class:`~plinth.app.Component`
components that each provide one small functionality needed by the app. Each of
these components are instantiated and added to the app as children. The
:class:`~plinth.menu.Menu` object added in the previous step is one such
component.
Each :class:`~freedombox.app.App` contains various
:class:`~freedombox.app.Component` components that each provide one small
functionality needed by the app. Each of these components are instantiated and
added to the app as children. The :class:`~freedombox.menu.Menu` object added in
the previous step is one such component.
Providing basic information about the app
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -20,7 +20,7 @@ function normally.
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
@ -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
donation_url encourages our users to contribute to upstream projects in order
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
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
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
:class:`~plinth.daemon.Daemon` component is added to the app. Let us do that in
our app's class.
:class:`~freedombox.daemon.Daemon` component is added to the app. Let us do that
in our app's class.
.. code-block:: python3
:caption: ``__init__.py``
from plinth.daemon import Daemon
from freedombox.daemon import Daemon
class TransmissionApp(app_module.App):
...
@ -101,8 +101,8 @@ our app's class.
self.add(daemon)
The first argument to instantiate the :class:`~plinth.daemon.Daemon` class is a
unique ID. The second is the name of the `systemd
The first argument to instantiate the :class:`~freedombox.daemon.Daemon` class
is a unique ID. The second is the name of the `systemd
<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.
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
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
Debian packages to be installed.
.. code-block:: python3
:caption: ``__init__.py``
from plinth.package import Packages
from freedombox.package import Packages
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
configuration snippet needs to be deactivated when our app is disabled. All of
these concerns are automatically handled by the framework if a
:class:`~plinth.modules.apache.components.Webserver` component is added to the
app. Let us do that in our app's class.
:class:`~freedombox.modules.apache.components.Webserver` component is added to
the app. Let us do that in our app's class.
.. code-block:: python3
:caption: ``__init__.py``
from plinth.modules.apache.components import Webserver
from freedombox.modules.apache.components import Webserver
class TransmissionApp(app_module.App):
...
@ -165,13 +165,13 @@ app. Let us do that in our app's class.
self.add(webserver)
The first argument to instantiate the
:class:`~plinth.modules.apache.components.Webserver` class is a unique ID. The
second is the name of the Apache2 web server configuration snippet that contains
the directives to proxy Transmission web interface via Apache2. We then need to
create the configuration file itself in ``transmission-plinth.conf``. The
final argument is the list of URLs that the app exposes to the users of the app.
This information is used to check if the URLs are accessible as expected when
the user requests diagnostic tests on the app.
:class:`~freedombox.modules.apache.components.Webserver` class is a unique ID.
The second is the name of the Apache2 web server configuration snippet that
contains the directives to proxy Transmission web interface via Apache2. We then
need to create the configuration file itself in ``transmission-plinth.conf``.
The final argument is the list of URLs that the app exposes to the users of the
app. This information is used to check if the URLs are accessible as expected
when the user requests diagnostic tests on the app.
Simply creating and shipping a configuration file into ``/etc`` folder creates
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
during package upgrade process. In case of unattended upgrades, the package is
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.
.. code-block:: python3
:caption: ``__init__.py``
from plinth.config import DropinConfigs
from freedombox.config import DropinConfigs
class TransmissionApp(app_module.App):
...
@ -200,9 +200,9 @@ class.
])
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
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
``/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/``
@ -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
this information along with additional information on whether the service is
available over Internet. Create the
:class:`~plinth.modules.firewall.components.Firewall` component during app
:class:`~freedombox.modules.firewall.components.Firewall` component during app
initialization.
.. code-block:: python3
:caption: ``__init__.py``
from plinth.modules.firewall.components import Firewall
from freedombox.modules.firewall.components import Firewall
class TransmissionApp(app_module.App):
...
@ -268,7 +268,7 @@ with the FreedomBox framework in ``__init.py__``.
.. code-block:: python3
:caption: ``__init__.py``
from plinth.modules.users.components import UsersAndGroups
from freedombox.modules.users.components import UsersAndGroups
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
the front page of FreedomBox web interface. This is the page that user's see
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
:caption: ``__init__.py``
from plinth import frontpage
from freedombox import frontpage
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
allows the user to migrate from one machine to another. FreedomBox framework
provides a component for handling these operations. Create the
:class:`~plinth.modules.backups.components.BackupRestore` component during app
initialization.
:class:`~freedombox.modules.backups.components.BackupRestore` component during
app initialization.
In ``__init__.py``, add:
.. code-block:: python3
:caption: ``__init__.py``
from plinth.modules.backups.components import BackupRestore
from freedombox.modules.backups.components import BackupRestore
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 plinth import actions, views
from freedombox import actions, views
from .forms import TransmissionForm
@ -161,8 +161,8 @@ for transmission daemon. We will do this by creating a file ``privileged.py``.
import json
import pathlib
from plinth import action_utils
from plinth.actions import privileged
from freedombox import action_utils
from freedombox.actions import privileged
_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')
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
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
easily perform it's duties.
utilities provided by the FreedomBox framework in :obj:`freedombox.action_utils`
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.
To implement additional diagnostic tests on top of those provided by the
framework, the method :meth:`plinth.app.App.diagnose` has to be overridden or in
a component that belongs to the app, the method
:meth:`plinth.app.Component.diagnose` has to be overridden. The methods must
framework, the method :meth:`freedombox.app.App.diagnose` has to be overridden
or in a component that belongs to the app, the method
: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
itself is a two-tuple containing the display name of the test followed by the
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**
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
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
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
in a step-by-step manner::
─┬ <plinth_root>/
└─┬ plinth/
─┬ <freedombox_root>/
└─┬ freedombox/
└─┬ modules/
└─┬ transmission/
├─ __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.
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
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
``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
``plinth/modules/`` directory structure into any Python path and still be
discovered as ``plinth.modules.*``.
``freedombox/modules/`` directory structure into any Python path and still be
discovered as ``freedombox.modules.*``.
Tell FreedomBox that our app exists
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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
``plinth/modules/transmission/data/usr/share/freedombox/modules-enabled/``. Let
us create this file ``transmission``:
``freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/``.
Let us create this file ``transmission``:
.. 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
``/usr/share/freedombox/modules-enabled/`` by FreedomBox's build system. If we
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
is not necessary for the app to be part of the ``plinth.modules`` namespace. It
can, for example, be ``freedombox_transmission``.
is not necessary for the app to be part of the ``freedombox.modules`` namespace.
It can, for example, be ``freedombox_transmission``.
Creating the App class
^^^^^^^^^^^^^^^^^^^^^^
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 later.
:class:`freedombox.app.App`. Let us do that in ``__init__.py``. We will fill up
the class later.
.. code-block:: python3
:caption: ``__init__.py``
from plinth import app as app_module
from freedombox import app as app_module
class TransmissionApp(app_module.App):
"""FreedomBox app for Transmission."""

View File

@ -22,7 +22,7 @@ write the following:
]
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
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
:caption: ``__init__.py``
from plinth import menu
from freedombox import menu
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
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.
@ -87,15 +87,15 @@ view to show the app page for our app. In ``views.py``, let us add a view.
.. code-block:: python3
:caption: ``views.py``
from plinth import views
from plinth.modules import transmission
from freedombox import views
from freedombox.modules import transmission
class TransmissionAppView(views.AppView):
"""Serve configuration page."""
app_id = 'transmission'
The base view :class:`~plinth.views.AppView` takes care of a lot of details for
us. First, it shows basic information about the app like name, description,
The base view :class:`~freedombox.views.AppView` takes care of a lot of details
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
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

View File

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

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.
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.
@ -21,13 +21,15 @@ This page describes the process of installing !FreedomBox on a Debian system. Cu
'''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.
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.
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.
@ -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.
=== 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 ===
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,38 @@ For more technical details, see the [[https://salsa.debian.org/freedombox-team/f
The following are the release notes for each !FreedomBox version.
== 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

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 ===
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 ===

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 \
home page, you can only navigate to the !FreedomBox Service (Plinth) by \
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 \
as the home page, you can only navigate to the FreedomBox Service (Plinth) by \
typing '), Url('https://myfreedombox.rocks/freedombox/'), PlainText(' into the \
browser. ')]), Paragraph([PlainText('/freedombox can also be used as an alias \
to /plinth ')])])]
browser. ')]), Paragraph([PlainText('/plinth can also be used as an alias \
to /freedombox ')])])]
>>> parse_wiki('{{{\\nmulti-line\\n\
preformatted text (source code)\\n}}}''')
@ -1773,8 +1773,8 @@ Code</ulink>'
'<ulink url="https://bugs.debian.org/1234#">Bug</ulink>'
>>> generate_inner_docbook([Link('DebianPkg:freedombox', \
[PlainText('Plinth')])])
'<ulink url="https://packages.debian.org/freedombox#">Plinth</ulink>'
[PlainText('FreedomBox')])])
'<ulink url="https://packages.debian.org/freedombox#">FreedomBox</ulink>'
>>> generate_inner_docbook([Link('AliothList:freedombox-discuss', \
[PlainText('Discuss')])])

View File

@ -3,4 +3,4 @@
Package init file.
"""
__version__ = '26.11.1'
__version__ = '26.12'

View File

@ -29,7 +29,7 @@ def parse_arguments():
help='web server path under which to serve')
parser.add_argument(
'--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'))
parser.add_argument('--setup', default=False, nargs='*',
help='run setup tasks on all essential apps and exit')

View File

@ -18,9 +18,9 @@ from . import actions
logger = logging.getLogger(__name__)
# Flag on disk to indicate if freedombox package was held by
# plinth. This is a backup in case the process is interrupted and hold
# is not released.
# Flag on disk to indicate if freedombox package was held by FreedomBox
# Service. This is a backup in case the process is interrupted and hold is not
# released.
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
exception is raised.
"""
from plinth import settings
from freedombox import settings
if isinstance(source, str):
source = pathlib.Path(source)

View File

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

View File

@ -9,9 +9,9 @@ import inspect
import logging
from typing import ClassVar, TypeAlias
from plinth import cfg
from plinth.diagnostic_check import DiagnosticCheck
from plinth.signals import post_app_loading
from freedombox import cfg
from freedombox.diagnostic_check import DiagnosticCheck
from freedombox.signals import post_app_loading
from . import clients as clients_module
from . import db
@ -130,7 +130,7 @@ class App:
def info(self):
"""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
this property without having the Info component will result in a
KeyError exception being raised. The lookup for the Info component is
@ -230,7 +230,7 @@ class App:
"""Run diagnostics and return results.
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,
test parameters, and the component ID. The test result is a string
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.
"""
from plinth import log
from freedombox import log
for component in self.components.values():
if isinstance(component, log.LogEmitter):
return True
@ -323,7 +323,7 @@ class App:
def get_logs(self) -> _list_type[dict[str, str]]:
"""Return the logs in a dictionary format."""
from plinth import log
from freedombox import log
logs: list[dict[str, str]] = []
for component in self.components.values():
if isinstance(component, log.LogEmitter):
@ -380,7 +380,7 @@ class Component:
"""Run diagnostics and return results.
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,
test parameters, and the component ID. The test result is a string
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
services provided by this app. This is used to suggest installation 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
donate to the upstream project.
@ -611,17 +611,17 @@ class EnableState(LeaderComponent):
def is_enabled(self):
"""Return whether the app/component is enabled."""
from plinth import kvstore
from freedombox import kvstore
return kvstore.get_default(self.key, False)
def enable(self):
"""Store that the app/component is enabled."""
from plinth import kvstore
from freedombox import kvstore
kvstore.set(self.key, True)
def disable(self):
"""Store that the app/component is disabled."""
from plinth import kvstore
from freedombox import kvstore
kvstore.set(self.key, False)

View File

@ -22,7 +22,7 @@ server_dir = '/freedombox'
host = '127.0.0.1'
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:
# X-Forwarded-For
# X-Forwarded-Host

View File

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

View File

@ -62,7 +62,7 @@ def pytest_collection_modifyitems(config, items):
@pytest.fixture(name='load_cfg')
def fixture_load_cfg():
"""Load test configuration."""
from plinth import cfg
from freedombox import cfg
keys = ('file_root', 'data_dir', 'custom_static_dir', 'store_file',
'doc_dir', 'server_dir', 'host', 'port', 'use_x_forwarded_for',
@ -73,7 +73,7 @@ def fixture_load_cfg():
saved_state[key] = getattr(cfg, key)
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))
yield cfg
@ -187,10 +187,10 @@ def fixture_mock_run_as_user():
"""A fixture to override action_utils.run_as_user."""
def _bypass_runuser(*args, username, **kwargs):
from plinth import action_utils
from freedombox import action_utils
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
yield
@ -287,7 +287,7 @@ def fixture_host_sudo(host):
@pytest.fixture(name='test_menu')
def fixture_test_menu():
"""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.init()

View File

@ -5,10 +5,10 @@ import contextlib
from django.utils.translation import gettext_noop
from plinth import app, log, privileged
from plinth.daemon import diagnose_port_listening
from plinth.diagnostic_check import (DiagnosticCheck,
DiagnosticCheckParameters, Result)
from freedombox import app, log, privileged
from freedombox.daemon import diagnose_port_listening
from freedombox.diagnostic_check import (DiagnosticCheck,
DiagnosticCheckParameters, Result)
class Container(app.LeaderComponent, log.LogEmitter):
@ -89,7 +89,7 @@ class Container(app.LeaderComponent, log.LogEmitter):
@contextlib.contextmanager
def ensure_running(self):
"""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()
if not starting_state:
service_privileged.enable(self.name)
@ -121,7 +121,7 @@ class Container(app.LeaderComponent, log.LogEmitter):
def diagnose(self) -> list[DiagnosticCheck]:
"""Check if the container is running..
See :py:meth:`plinth.app.Component.diagnose`.
See :py:meth:`freedombox.app.Component.diagnose`.
"""
results = []
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_noop
from plinth import cfg, views, web_server
from plinth.utils import is_user_admin
from freedombox import cfg, views, web_server
from freedombox.utils import is_user_admin
def common(request):
@ -20,7 +20,7 @@ def common(request):
# the brand name 'FreedomBox' itself to be translated.
gettext_noop('FreedomBox')
from plinth.notification import Notification
from freedombox.notification import Notification
notifications_context = Notification.get_display_context(
request, user=request.user)

View File

@ -8,9 +8,9 @@ import subprocess
import psutil
from django.utils.translation import gettext_noop
from plinth import action_utils, app, log
from plinth.diagnostic_check import (DiagnosticCheck,
DiagnosticCheckParameters, Result)
from freedombox import action_utils, app, log
from freedombox.diagnostic_check import (DiagnosticCheck,
DiagnosticCheckParameters, Result)
class Daemon(app.LeaderComponent, log.LogEmitter):
@ -71,14 +71,14 @@ class Daemon(app.LeaderComponent, log.LogEmitter):
def enable(self):
"""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)
if self.alias:
service_privileged.enable(self.alias)
def disable(self):
"""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)
if self.alias:
service_privileged.disable(self.alias)
@ -90,7 +90,7 @@ class Daemon(app.LeaderComponent, log.LogEmitter):
@contextlib.contextmanager
def ensure_running(self):
"""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':
# 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]:
"""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 = []

View File

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

View File

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

View File

@ -9,7 +9,7 @@ from typing import TypeAlias
from django.utils.translation import gettext
from plinth.utils import SafeFormatter
from freedombox.utils import SafeFormatter
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."""
class PackageNotInstalledError(PlinthError):
class PackageNotInstalledError(FbxError):
"""Could not complete module setup due to missing package."""
class DomainNotRegisteredError(PlinthError):
class DomainNotRegisteredError(FbxError):
"""
An action couldn't be performed because this
FreedomBox doesn't have a registered domain
"""
class MissingPackageError(PlinthError):
class MissingPackageError(FbxError):
"""Package is not available to be installed at this time."""
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 gettext_lazy as _
import plinth
import freedombox
def _get_repository_choices():
"""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)
for repository in repository_module.get_repositories()
if repository.is_usable()]
@ -54,7 +54,7 @@ class DomainSelectionForm(forms.Form):
def __init__(self, show_none=False, *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())
choices = list(zip(domains, domains))
@ -70,7 +70,7 @@ class DomainSelectionForm(forms.Form):
def _get_domain_choices():
"""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())
@ -109,9 +109,9 @@ class LanguageSelectionFormMixin:
for language_code, language_name in settings.LANGUAGES:
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(
os.path.join(plinth_dir, 'locale', locale_code)):
os.path.join(freedombox_dir, 'locale', locale_code)):
supported_languages.append(
(language_code,
_get_local_name(language_code, language_name)))

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

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