mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-09-19 04:59:01 +00:00
Compare commits
83 Commits
main
...
v25.9_bpo1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
649788bd09 | ||
|
|
2669ea94bb | ||
|
|
80eaa8fa62 | ||
|
|
450458ed03 | ||
|
|
029a5e6408 | ||
|
|
d89be5d769 | ||
|
|
1e994b4e9a | ||
|
|
29936c4ba6 | ||
|
|
1e4494f5c4 | ||
|
|
ce4c9e58a9 | ||
|
|
9e36f77cc7 | ||
|
|
ae2659e1e1 | ||
|
|
36238323ad | ||
|
|
e5a3d8c91e | ||
|
|
2157c29edc | ||
|
|
9ac4384135 | ||
|
|
8cc9ad192f | ||
|
|
ec0ba5df3c | ||
|
|
7fc288a2d1 | ||
|
|
561d43d61f | ||
|
|
8ba182ef00 | ||
|
|
5b3f8e4b11 | ||
|
|
6e7884a544 | ||
|
|
b960aa49d5 | ||
|
|
44af7807e1 | ||
|
|
9761c7ba47 | ||
|
|
f0fc5e1d6b | ||
|
|
6fc223746a | ||
|
|
2e5010f66c | ||
|
|
19d0e64cee | ||
|
|
aca91a0f5e | ||
|
|
ed50f172a2 | ||
|
|
e083aa06b7 | ||
|
|
63a7236050 | ||
|
|
32cdbe1f30 | ||
|
|
778e6fbf3a | ||
|
|
5636ddbea4 | ||
|
|
7c9f070b6d | ||
|
|
0f799c0688 | ||
|
|
9de7a8b808 | ||
|
|
534724e7f0 | ||
|
|
8973a3c0b1 | ||
|
|
2d8a207606 | ||
|
|
5121e542c5 | ||
|
|
700862d86a | ||
|
|
34efa913dc | ||
|
|
e0917d3c1b | ||
|
|
41cdeeefd2 | ||
|
|
2c7bb233b0 | ||
|
|
3d14d4a56c | ||
|
|
cf9decbd6d | ||
|
|
4175fb5920 | ||
|
|
625b77c922 | ||
|
|
738eff2ff2 | ||
|
|
b09e2f42ff | ||
|
|
14d69e2cf7 | ||
|
|
819754e277 | ||
|
|
b4db509204 | ||
|
|
860bffac86 | ||
|
|
94789388ec | ||
|
|
d8a69d002f | ||
|
|
12c888046b | ||
|
|
40bf5005cb | ||
|
|
c64a643882 | ||
|
|
9d4a568429 | ||
|
|
a0b7f66994 | ||
|
|
f60eb635a6 | ||
|
|
b111c67e32 | ||
|
|
f7c0062ddd | ||
|
|
5abe6171c8 | ||
|
|
c9d6da6c0a | ||
|
|
4a62d4fc77 | ||
|
|
32942a65a5 | ||
|
|
814b16764b | ||
|
|
01f059c8df | ||
|
|
28473a96be | ||
|
|
d9a09f3266 | ||
|
|
c866100dc0 | ||
|
|
61d9fa1ff9 | ||
|
|
3aac407176 | ||
|
|
196122716f | ||
|
|
e81c4471c6 | ||
|
|
674523d06f |
@ -7,7 +7,7 @@ USER root:root
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN echo "deb http://deb.debian.org/debian trixie-backports main" > /etc/apt/sources.list.d/backports.list; echo "deb-src http://deb.debian.org/debian trixie-backports main" >> /etc/apt/sources.list.d/backports.list
|
||||
RUN echo "deb http://deb.debian.org/debian bookworm-backports main" > /etc/apt/sources.list.d/backports.list; echo "deb-src http://deb.debian.org/debian bookworm-backports main" >> /etc/apt/sources.list.d/backports.list
|
||||
|
||||
RUN apt-get update
|
||||
|
||||
@ -15,14 +15,14 @@ RUN apt-get update
|
||||
RUN apt-get dist-upgrade -y
|
||||
|
||||
# Install freedombox package so that plint:plinth user/group are created etc.
|
||||
RUN apt-get install -y freedombox/trixie-backports
|
||||
RUN systemctl disable plinth.service
|
||||
RUN apt-get install -y freedombox/bookworm-backports
|
||||
RUN systemctl mask plinth.service
|
||||
|
||||
# Don't ask for the secret in first wizard
|
||||
RUN rm -f /var/lib/plinth/firstboot-wizard-secret
|
||||
|
||||
# Dependencies of the freedombox Debian package
|
||||
RUN apt-get build-dep -y freedombox/trixie-backports
|
||||
RUN apt-get build-dep -y freedombox/bookworm-backports
|
||||
|
||||
# Build and test dependencies
|
||||
RUN apt-get install -y \
|
||||
|
||||
@ -14,9 +14,9 @@
|
||||
- $GITLAB_USER_LOGIN == "weblate"
|
||||
before_script:
|
||||
- apt-get update
|
||||
- apt-get -y install make
|
||||
- make provision-dev
|
||||
- make wait-while-first-setup
|
||||
- sudo -u plinth ./run --develop > plinth.log 2>&1 &
|
||||
- 'echo -e "Cmnd_Alias FREEDOMBOX_ACTION_DEV = /usr/share/plinth/actions/actions, `pwd`/actions/actions\nDefaults!FREEDOMBOX_ACTION_DEV closefrom_override\nplinth ALL=(ALL:ALL) NOPASSWD:SETENV : FREEDOMBOX_ACTION_DEV\n" > /etc/sudoers.d/01-freedombox-development'
|
||||
- while ! grep -q "Setup thread finished" plinth.log; do sleep 1; echo -n .; done
|
||||
script:
|
||||
- FREDOMBOX_URL=https://localhost FREEDOMBOX_SSH_PORT=22 FREEDOMBOX_SAMBA_PORT=445 pytest -v --durations=10 --include-functional --splinter-headless --instafail --template=html1/index.html --report=functional-tests.html
|
||||
artifacts:
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -4,7 +4,7 @@
|
||||
doc/manual/*/*.pdf
|
||||
doc/manual/*/*.html
|
||||
doc/manual/*/*.xml
|
||||
doc/*.1
|
||||
doc/plinth.1
|
||||
doc/dev/_build
|
||||
\#*
|
||||
.#*
|
||||
|
||||
@ -50,13 +50,16 @@ doc-tests:
|
||||
run-functional-tests-stable:
|
||||
extends: .run-functional-tests
|
||||
|
||||
extract-source:
|
||||
extends: .provisioning-extract-source
|
||||
|
||||
build:
|
||||
extends: .build-package
|
||||
|
||||
build-backports:
|
||||
extends: .build-package
|
||||
variables:
|
||||
RELEASE: trixie-backports
|
||||
RELEASE: bookworm-backports
|
||||
|
||||
build i386:
|
||||
extends: .build-package-i386
|
||||
|
||||
16
.vagrant-scripts/plinth-user-permissions.py
Executable file
16
.vagrant-scripts/plinth-user-permissions.py
Executable file
@ -0,0 +1,16 @@
|
||||
#!/usr/bin/python3
|
||||
# -*- mode: python -*-
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
"""Set required permissions for user "plinth" to run plinth in dev setup."""
|
||||
|
||||
import pathlib
|
||||
|
||||
content = '''
|
||||
Cmnd_Alias FREEDOMBOX_ACTION_DEV = /usr/share/plinth/actions/actions, /freedombox/actions/actions
|
||||
Defaults!FREEDOMBOX_ACTION_DEV closefrom_override
|
||||
plinth ALL=(ALL:ALL) NOPASSWD:SETENV : FREEDOMBOX_ACTION_DEV
|
||||
fbx ALL=(ALL:ALL) NOPASSWD : ALL
|
||||
'''
|
||||
|
||||
sudoers_file = pathlib.Path('/etc/sudoers.d/01-freedombox-development')
|
||||
sudoers_file.write_text(content)
|
||||
@ -1,9 +1,9 @@
|
||||
# License to Copy FreedomBox Service (Plinth)
|
||||
|
||||
FreedomBox Service (Plinth) is Copyright 2011, 2012, 2013, 2014, 2015, 2016,
|
||||
2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 FreedomBox Authors. See Git
|
||||
log in the source repository for a full list of authors. It is distributed under
|
||||
the GNU Affero General Public License, Version 3 or later. A copy of AGPLv3 is
|
||||
2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 FreedomBox Authors. See Git log
|
||||
in the source repository for a full list of authors. It is distributed under the
|
||||
GNU Affero General Public License, Version 3 or later. A copy of AGPLv3 is
|
||||
available [from the Free Software
|
||||
Foundation](http://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
|
||||
92
HACKING.md
92
HACKING.md
@ -66,7 +66,7 @@ development environment inside a systemd-nspawn container.
|
||||
folder: (This step requires at least 16GB of free disk space)
|
||||
|
||||
```bash
|
||||
host$ ./container start
|
||||
host$ ./container up
|
||||
```
|
||||
|
||||
1. To run unit tests:
|
||||
@ -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 freedombox/modules/{app-name}
|
||||
host$ ./container run-tests --pytest-args -v --include-functional --splinter-headless plinth/modules/{app-name}
|
||||
```
|
||||
|
||||
Drop the option `--splinter-headless` if you want to see the tests running
|
||||
@ -97,43 +97,23 @@ development environment inside a systemd-nspawn container.
|
||||
1. Using an environment variable.
|
||||
|
||||
```bash
|
||||
host$ DISTRIBUTION=stable ./container start
|
||||
host$ DISTRIBUTION=stable ./container up
|
||||
host$ DISTRIBUTION=stable ./container ssh
|
||||
```
|
||||
|
||||
```bash
|
||||
host$ export DISTRIBUTION=stable
|
||||
host$ ./container start
|
||||
host$ ./container up
|
||||
host$ ./container ssh
|
||||
```
|
||||
|
||||
2. Using the `--distribution` option for each command.
|
||||
|
||||
```bash
|
||||
host$ ./container start --distribution=stable
|
||||
host$ ./container up --distribution=stable
|
||||
host$ ./container ssh --distribution=stable
|
||||
```
|
||||
|
||||
#### Using KVM Virtual Machine
|
||||
|
||||
The `./container` script, shipped with FreedomBox source code, can manage the
|
||||
development environment inside a KVM-based virtual machine using libvirt. This
|
||||
is an alternative to using containers described above (but the name of the
|
||||
script is still 'container' even when managing virtual machines). Some hardware,
|
||||
such as additional disks, can be better tested with virtual machine than with
|
||||
containers.
|
||||
|
||||
Containers and a virtual machines of the same or different distribution all be
|
||||
used simultaneously as they all use different disk images.
|
||||
|
||||
1. To use virtual machines instead of container, append the option
|
||||
'--machine-type=vm' to all the ./container commands described above. For
|
||||
example, to bring up a virtual machine instead of a container run:
|
||||
|
||||
```bash
|
||||
host$ ./container start --machine-type=vm
|
||||
```
|
||||
|
||||
#### Using after Setup
|
||||
|
||||
After logging into the container, the source code is available in `/freedombox`
|
||||
@ -143,12 +123,12 @@ directory:
|
||||
guest$ cd /freedombox
|
||||
```
|
||||
|
||||
FreedomBox Service runs as plinth.service in the container. This service
|
||||
restarts when it detects a change to the source code file. This provides a quick
|
||||
feedback cycle during development. To watch service logs run:
|
||||
Run the development version of FreedomBox Service in the container using the
|
||||
following command. This command continuously deploys your code changes into the
|
||||
container providing a quick feedback cycle during development.
|
||||
|
||||
```bash
|
||||
guest$ sudo freedombox-logs
|
||||
guest$ freedombox-develop
|
||||
```
|
||||
|
||||
If you have changed any system configuration files during your development,
|
||||
@ -156,17 +136,16 @@ you will need to run the following to install those files properly on to the
|
||||
system and their changes to reflect properly.
|
||||
|
||||
```bash
|
||||
guest$ sudo make build install ;
|
||||
guest$ sudo systemctl restart plinth.service
|
||||
guest$ sudo make build install
|
||||
```
|
||||
|
||||
Note: This development container has automatic upgrades disabled by default.
|
||||
|
||||
#### Troubleshooting
|
||||
|
||||
* Sometimes `host$ ./container destroy && ./container start` doesn't work. In such
|
||||
* Sometimes `host$ ./container destroy && ./container up` doesn't work. In such
|
||||
cases, try to delete the hidden `.container` folder and then `host$
|
||||
./container start`.
|
||||
./container up`.
|
||||
* Not all kinds of changes are automatically updated. Try `guest$ sudo mount -o
|
||||
remount /freedombox`.
|
||||
* I am getting an error that says `lo` is not managed by Network Manager
|
||||
@ -178,7 +157,7 @@ Note: This development container has automatic upgrades disabled by default.
|
||||
```bash
|
||||
host$ sudo touch /etc/NetworkManager/conf.d/10-globally-managed-devices.conf
|
||||
host$ sudo service network-manager restart
|
||||
host$ ./container destroy && ./container start
|
||||
host$ ./container destroy && ./container up
|
||||
```
|
||||
* File/directory not found errors when running tests can be fixed by clearing `__pycache__` directories.
|
||||
|
||||
@ -374,12 +353,13 @@ After logging into the virtual machine (VM), the source code is available in
|
||||
vm$ cd /freedombox
|
||||
```
|
||||
|
||||
FreedomBox Service runs as plinth.service in the virtual machine. This service
|
||||
restarts when it detects a change to the source code file. This provides a quick
|
||||
feedback cycle during development. To watch service logs run:
|
||||
Run the development version of FreedomBox Service (Plinth) from your source
|
||||
directory in the virtual machine using the following command. This command
|
||||
continuously deploys your code changes into the virtual machine providing a
|
||||
quick feedback cycle during development.
|
||||
|
||||
```bash
|
||||
vm$ sudo freedombox-logs
|
||||
vm$ freedombox-develop
|
||||
```
|
||||
|
||||
If you have changed any system configuration files during your development,
|
||||
@ -416,16 +396,15 @@ for more details.
|
||||
### Translating literals (contributing translations)
|
||||
|
||||
The easiest way to start translating is with your browser, by using
|
||||
[Weblate](https://hosted.weblate.org/projects/freedombox/freedombox/).
|
||||
[Weblate](https://hosted.weblate.org/projects/freedombox/plinth/).
|
||||
Your changes will automatically get pushed to the code repository.
|
||||
|
||||
Alternatively, you can directly edit the `.po` file in your language directory
|
||||
`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.
|
||||
`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.
|
||||
|
||||
For more information on translations: https://wiki.debian.org/FreedomBox/Translate
|
||||
|
||||
@ -450,16 +429,16 @@ options. See pytest documentation for further filter options.
|
||||
|
||||
```bash
|
||||
# Run tests in a directory
|
||||
guest$ py.test-3 freedombox/tests
|
||||
guest$ py.test-3 plinth/tests
|
||||
|
||||
# Run tests in a module
|
||||
guest$ py.test-3 freedombox/tests/test_actions.py
|
||||
guest$ py.test-3 plinth/tests/test_actions.py
|
||||
|
||||
# Run tests of one class in test module
|
||||
guest$ py.test-3 freedombox/tests/test_actions.py::TestActions
|
||||
guest$ py.test-3 plinth/tests/test_actions.py::TestActions
|
||||
|
||||
# Run one test in a class or module
|
||||
guest$ py.test-3 freedombox/tests/test_actions.py::TestActions::test_is_package_manager_busy
|
||||
guest$ py.test-3 plinth/tests/test_actions.py::TestActions::test_is_package_manager_busy
|
||||
```
|
||||
|
||||
Some tests are skipped by default:
|
||||
@ -490,13 +469,13 @@ guest$ sudo EXTENDED_TESTING=1 py.test-3
|
||||
To run the coverage tool in the container/VM:
|
||||
|
||||
```bash
|
||||
guest$ py.test-3 --cov=freedombox
|
||||
guest$ py.test-3 --cov=plinth
|
||||
```
|
||||
|
||||
To collect HTML report:
|
||||
|
||||
```bash
|
||||
guest$ py.test-3 --cov=freedombox --cov-report=html
|
||||
guest$ py.test-3 --cov=plinth --cov-report=html
|
||||
```
|
||||
|
||||
Invoking this command generates a HTML report to the `htmlcov` directory.
|
||||
@ -520,7 +499,7 @@ executed (red).
|
||||
Inside the container run
|
||||
|
||||
```bash
|
||||
guest$ cd /freedombox ; sudo freedombox/tests/functional/install.sh
|
||||
guest$ cd /freedombox ; sudo plinth/tests/functional/install.sh
|
||||
```
|
||||
|
||||
##### For running tests inside the VM
|
||||
@ -566,14 +545,13 @@ on the guest.
|
||||
|
||||
#### Setup FreedomBox Service for tests
|
||||
|
||||
Via FreedomBox web interface, create a new user as follows:
|
||||
Via Plinth, create a new user as follows:
|
||||
|
||||
* Username: tester
|
||||
* Password: testingtesting
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
#### Running Functional Tests
|
||||
|
||||
@ -622,7 +600,7 @@ In the VM or container, run the following command:
|
||||
```
|
||||
guest$ cd /freedombox
|
||||
guest$ sudo make build install
|
||||
guest$ freedombox/tests/functional/enable-all-apps
|
||||
guest$ plinth/tests/functional/enable-all-apps
|
||||
```
|
||||
|
||||
[back to index](#hacking)
|
||||
|
||||
@ -30,12 +30,12 @@ FreedomBox [Manual](https://wiki.debian.org/FreedomBox/Manual/)'s
|
||||
2. Run FreedomBox Service (Plinth):
|
||||
|
||||
```
|
||||
$ sudo systemctl start plinth.service
|
||||
$ sudo plinth
|
||||
```
|
||||
|
||||
3. Access FreedomBox UI:
|
||||
|
||||
UI should be accessible at http://localhost:8000/freedombox
|
||||
UI should be accessible at http://localhost:8000/plinth
|
||||
|
||||
If you are installing FreedomBox Service (Plinth) for development purposes, see
|
||||
HACKING.md instead.
|
||||
|
||||
89
Makefile
89
Makefile
@ -20,9 +20,7 @@ DISABLED_APPS_TO_REMOVE := \
|
||||
repro \
|
||||
tahoe \
|
||||
mldonkey \
|
||||
i2p \
|
||||
ttrss \
|
||||
sso
|
||||
i2p
|
||||
|
||||
APP_FILES_TO_REMOVE := $(foreach app,$(DISABLED_APPS_TO_REMOVE),$(ENABLED_APPS_PATH)/$(app))
|
||||
|
||||
@ -39,7 +37,6 @@ DIRECTORIES_TO_CREATE := \
|
||||
|
||||
STATIC_FILES_DIRECTORY := $(DESTDIR)/usr/share/plinth/static
|
||||
BIN_DIR := $(DESTDIR)/usr/bin
|
||||
LIB_DIR := $(DESTDIR)/usr/lib
|
||||
|
||||
FIND_ARGS := \
|
||||
-not -iname "*.log" \
|
||||
@ -58,14 +55,10 @@ FIND_ARGS := \
|
||||
|
||||
|
||||
ROOT_DATA_FILES := $(shell find data -type f $(FIND_ARGS))
|
||||
MODULE_DATA_FILES := $(shell find $(wildcard freedombox/modules/*/data) -type f $(FIND_ARGS))
|
||||
MODULE_DATA_FILES := $(shell find $(wildcard plinth/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 freedombox.settings --pythonpath .
|
||||
cd plinth; $(DJANGO_ADMIN) makemessages --all --domain django --keep-pot --verbosity=1
|
||||
|
||||
configure:
|
||||
# Nothing to do
|
||||
@ -78,7 +71,7 @@ build:
|
||||
$(MAKE) -C doc -j 8
|
||||
|
||||
# Build .whl package
|
||||
rm -f dist/freedombox-*.whl
|
||||
rm -f dist/plinth-*.whl
|
||||
$(PYTHON) -m build --no-isolation --skip-dependency-check --wheel
|
||||
|
||||
install:
|
||||
@ -96,18 +89,18 @@ 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/freedombox-*.whl --break-system-packages \
|
||||
$(PYTHON) -m pip install dist/plinth-*.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}/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
|
||||
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/COPYING.md && \
|
||||
rm -f $(DESTDIR)$${lib_dir}/plinth*.dist-info/direct_url.json && \
|
||||
$(INSTALL) -D -t $(BIN_DIR) bin/plinth
|
||||
|
||||
# Actions
|
||||
$(INSTALL) -D -t $(DESTDIR)/usr/share/plinth/actions actions/actions
|
||||
|
||||
# Static web server files
|
||||
rm -rf $(STATIC_FILES_DIRECTORY)
|
||||
@ -121,7 +114,7 @@ install:
|
||||
cp $(CP_ARGS) $${file} $${target} ; \
|
||||
done
|
||||
for file in $(MODULE_DATA_FILES) ; do \
|
||||
target=$$(dirname $(DESTDIR)$$(echo $${file} | sed -e 's|^freedombox/modules/[^/]*/data||')) ; \
|
||||
target=$$(dirname $(DESTDIR)$$(echo $${file} | sed -e 's|^plinth/modules/[^/]*/data||')) ; \
|
||||
$(INSTALL) --directory --mode=755 $${target} ; \
|
||||
cp $(CP_ARGS) $${file} $${target} ; \
|
||||
done
|
||||
@ -137,12 +130,12 @@ check-tests:
|
||||
|
||||
# Tests with coverage report
|
||||
check-tests-cov:
|
||||
$(PYTHON) -m pytest $(PYTEST_ARGS) --cov=freedombox \
|
||||
$(PYTHON) -m pytest $(PYTEST_ARGS) --cov=plinth \
|
||||
--cov-report=html:./htmlcov --cov-report=term
|
||||
|
||||
# Code quality checking using flake8
|
||||
check-code:
|
||||
$(PYTHON) -m flake8 freedombox container
|
||||
$(PYTHON) -m flake8 plinth actions/actions container
|
||||
|
||||
# Static type checking using mypy
|
||||
check-type:
|
||||
@ -154,25 +147,8 @@ check-doc:
|
||||
|
||||
clean:
|
||||
make -C doc clean
|
||||
rm -rf Freedombox.egg-info
|
||||
find freedombox/locale -name *.mo -delete
|
||||
|
||||
define DEVELOP_SERVICE_CONF
|
||||
[Service]
|
||||
Environment=FREEDOMBOX_DEVELOP=1
|
||||
Environment=PYTHONPATH=/freedombox/
|
||||
endef
|
||||
export DEVELOP_SERVICE_CONF
|
||||
|
||||
define DEVELOP_LOGS_SCRIPT
|
||||
#!/usr/bin/bash
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
journalctl --follow --unit=plinth.service --unit=freedombox-privileged.service
|
||||
endef
|
||||
export DEVELOP_LOGS_SCRIPT
|
||||
rm -rf Plinth.egg-info
|
||||
find plinth/locale -name *.mo -delete
|
||||
|
||||
# Run basic setup for a developer environment (VM or container)
|
||||
provision-dev:
|
||||
@ -183,29 +159,9 @@ provision-dev:
|
||||
# Install latest code over .deb
|
||||
$(MAKE) build install
|
||||
|
||||
# Configure privileged and web daemon for development setup
|
||||
mkdir -p /etc/systemd/system/freedombox-privileged.service.d/
|
||||
echo "$$DEVELOP_SERVICE_CONF" > /etc/systemd/system/freedombox-privileged.service.d/develop.conf
|
||||
mkdir -p /etc/systemd/system/plinth.service.d/
|
||||
echo "$$DEVELOP_SERVICE_CONF" > /etc/systemd/system/plinth.service.d/develop.conf
|
||||
|
||||
# Create a command to easily watch service logs
|
||||
echo "$$DEVELOP_LOGS_SCRIPT" > /usr/bin/freedombox-logs
|
||||
chmod 755 /usr/bin/freedombox-logs
|
||||
|
||||
# Reload newer systemd units, ignore failure
|
||||
-systemctl daemon-reload
|
||||
|
||||
# Enable privileged daemon
|
||||
-systemctl stop freedombox-privileged.service
|
||||
|
||||
-test -d /run/systemd/system && \
|
||||
systemctl enable --now freedombox-privileged.socket
|
||||
|
||||
# Enable and restart plinth service if it is running
|
||||
-systemctl enable plinth.service
|
||||
-systemctl restart plinth.service
|
||||
|
||||
# Stop any ongoing upgrade, ignore failure
|
||||
-killall -9 unattended-upgr
|
||||
|
||||
@ -230,12 +186,6 @@ provision-dev:
|
||||
DEBIAN_FRONTEND=noninteractive apt-get install --yes ncurses-term \
|
||||
sshpass bash-completion
|
||||
|
||||
wait-while-first-setup:
|
||||
while [ x$$(curl -k https://localhost/freedombox/status/ 2> /dev/null | \
|
||||
json_pp 2> /dev/null | grep 'is_first_setup_running' | \
|
||||
tr -d '[:space:]' | cut -d':' -f2 ) != 'xfalse' ] ; do \
|
||||
sleep 1; echo -n .; done
|
||||
|
||||
.PHONY: \
|
||||
build \
|
||||
check \
|
||||
@ -248,5 +198,4 @@ wait-while-first-setup:
|
||||
configure \
|
||||
install \
|
||||
provision \
|
||||
update-translations \
|
||||
wait-while-first-setup
|
||||
update-translations
|
||||
|
||||
@ -62,7 +62,7 @@ See the [HACKING.md](https://salsa.debian.org/freedombox-team/freedombox/blob/ma
|
||||
|
||||
# Localization
|
||||
|
||||
[](https://hosted.weblate.org/engage/freedombox/)
|
||||
[](https://hosted.weblate.org/engage/freedombox/?utm_source=widget)
|
||||
|
||||
# License
|
||||
|
||||
|
||||
31
Vagrantfile
vendored
31
Vagrantfile
vendored
@ -6,33 +6,42 @@ require 'etc'
|
||||
|
||||
Vagrant.configure(2) do |config|
|
||||
config.vm.box = "freedombox/freedombox-testing-dev"
|
||||
config.vm.network "public_network"
|
||||
config.vm.network "forwarded_port", guest: 443, host: 4430
|
||||
config.vm.network "forwarded_port", guest: 445, host: 4450
|
||||
config.vm.synced_folder ".", "/freedombox", owner: "plinth", group: "plinth"
|
||||
config.vm.provider "virtualbox" do |vb|
|
||||
vb.cpus = Etc.nprocessors
|
||||
vb.memory = 2048
|
||||
vb.linked_clone = true
|
||||
vb.customize ["modifyvm", :id, "--firmware", "efi"]
|
||||
end
|
||||
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: "freedombox/tests/functional/install.sh"
|
||||
config.vm.post_up_message = "FreedomBox virtual machine is ready
|
||||
for development. To get the IP address:
|
||||
$ vagrant ssh
|
||||
$ ip address show
|
||||
|
||||
FreedomBox interface will be available at https://<ip address>/freedombox
|
||||
(with an invalid SSL certificate). To watch logs:
|
||||
echo 'alias freedombox-develop="cd /freedombox; sudo -u plinth /freedombox/run --develop"' >> /home/vagrant/.bashrc
|
||||
SHELL
|
||||
config.vm.provision "tests", run: "never", type: "shell", path: "plinth/tests/functional/install.sh"
|
||||
config.vm.post_up_message = "FreedomBox virtual machine is ready
|
||||
for development. You can run the development version of Plinth using
|
||||
the following command.
|
||||
$ vagrant ssh
|
||||
$ sudo freedombox-logs
|
||||
$ freedombox-develop
|
||||
Plinth will be available at https://localhost:4430/plinth (with
|
||||
an invalid SSL certificate).
|
||||
"
|
||||
|
||||
config.trigger.after [:up, :resume, :reload] do |trigger|
|
||||
trigger.info = "Set plinth user permissions for development environment"
|
||||
trigger.run_remote = {
|
||||
path: ".vagrant-scripts/plinth-user-permissions.py"
|
||||
}
|
||||
end
|
||||
config.vm.boot_timeout=1200
|
||||
end
|
||||
|
||||
7
actions/actions
Executable file
7
actions/actions
Executable file
@ -0,0 +1,7 @@
|
||||
#!/usr/bin/python3
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
from plinth.actions import privileged_main
|
||||
|
||||
if __name__ == '__main__':
|
||||
privileged_main()
|
||||
@ -1,61 +0,0 @@
|
||||
#!/usr/bin/python3
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
"""
|
||||
Utility to change user password in FreedomBox's Django database.
|
||||
|
||||
Usage:
|
||||
$ freedombox-change-password <username>
|
||||
"""
|
||||
|
||||
import argparse
|
||||
import getpass
|
||||
import sys
|
||||
|
||||
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:
|
||||
freedombox.web_framework.init()
|
||||
except Exception:
|
||||
_print('Error initializing Django.')
|
||||
return
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('username',
|
||||
help='Username of the account to change password for')
|
||||
args = parser.parse_args()
|
||||
|
||||
username = args.username
|
||||
password = getpass.getpass('Enter new password: ')
|
||||
|
||||
try:
|
||||
_change_password(username, password)
|
||||
privileged._set_user_password(username, password)
|
||||
privileged._set_samba_user(username, password)
|
||||
_print('Password updated in web interface, LDAP, and samba databases.')
|
||||
except Exception as exception:
|
||||
_print('Error setting password:', str(exception))
|
||||
|
||||
|
||||
def _print(*args, **kwargs):
|
||||
"""Write to stderr."""
|
||||
print(*args, **kwargs, file=sys.stderr)
|
||||
|
||||
|
||||
def _change_password(username: str, password: str):
|
||||
"""Update the password in SQLite database file."""
|
||||
from django.contrib.auth.models import User
|
||||
try:
|
||||
user = User.objects.get(username=username)
|
||||
user.set_password(password)
|
||||
user.save()
|
||||
except User.DoesNotExist:
|
||||
_print('User account does not exist:', username)
|
||||
raise
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@ -1,6 +0,0 @@
|
||||
#!/usr/bin/python3
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import freedombox.privileged_daemon
|
||||
|
||||
freedombox.privileged_daemon.client_main()
|
||||
@ -1,6 +0,0 @@
|
||||
#!/usr/bin/python3
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import freedombox.privileged_daemon
|
||||
|
||||
freedombox.privileged_daemon.main()
|
||||
@ -1,6 +1,6 @@
|
||||
#!/usr/bin/python3
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
import freedombox.__main__
|
||||
import plinth.__main__
|
||||
|
||||
freedombox.__main__.main()
|
||||
plinth.__main__.main()
|
||||
168
container
168
container
@ -160,10 +160,8 @@ from typing import Callable
|
||||
from urllib.request import urlopen
|
||||
|
||||
URLS_AMD64 = {
|
||||
'oldstable': 'https://ftp.freedombox.org/pub/freedombox/hardware/'
|
||||
'amd64/bookworm/freedombox-bookworm_all-amd64.img.xz',
|
||||
'stable': 'https://ftp.freedombox.org/pub/freedombox/hardware/'
|
||||
'amd64/trixie/freedombox-trixie_all-amd64.img.xz',
|
||||
'amd64/bookworm/freedombox-bookworm_all-amd64.img.xz',
|
||||
'testing': 'https://ftp.freedombox.org/pub/freedombox/hardware/'
|
||||
'amd64/testing/freedombox-testing_dev_all-amd64.img.xz',
|
||||
'unstable': 'https://ftp.freedombox.org/pub/freedombox/hardware/'
|
||||
@ -171,10 +169,8 @@ URLS_AMD64 = {
|
||||
}
|
||||
|
||||
URLS_ARM64 = {
|
||||
'oldstable': 'https://ftp.freedombox.org/pub/freedombox/hardware/'
|
||||
'arm64/bookworm/freedombox-bookworm_all-arm64.img.xz',
|
||||
'stable': 'https://ftp.freedombox.org/pub/freedombox/hardware/'
|
||||
'arm64/trixie/freedombox-trixie_all-arm64.img.xz',
|
||||
'arm64/bookworm/freedombox-bookworm_all-arm64.img.xz',
|
||||
'testing': 'https://ftp.freedombox.org/pub/freedombox/hardware/'
|
||||
'arm64/testing/freedombox-testing_dev_all-arm64.img.xz',
|
||||
'unstable': 'https://ftp.freedombox.org/pub/freedombox/hardware/'
|
||||
@ -196,6 +192,9 @@ cd /freedombox/
|
||||
sudo apt-get -y install make
|
||||
sudo make provision-dev
|
||||
|
||||
echo 'alias freedombox-develop="cd /freedombox; sudo -u plinth /freedombox/run --develop"' \
|
||||
>> /home/fbx/.bashrc
|
||||
|
||||
# Make some pytest related files and directories writable to the fbx user
|
||||
sudo touch geckodriver.log
|
||||
sudo chmod a+rw geckodriver.log
|
||||
@ -222,24 +221,41 @@ mount -o remount /freedombox
|
||||
if [[ "{distribution}" == "stable" && ! -e $BACKPORTS_SOURCES_LIST ]]
|
||||
then
|
||||
echo "> In machine: Enable backports"
|
||||
/freedombox/bin/freedombox-cmd upgrades activate_backports --no-args
|
||||
/freedombox/actions/actions upgrades activate_backports --no-args
|
||||
fi
|
||||
|
||||
echo "> In machine: Upgrade packages"
|
||||
apt-get update
|
||||
apt-mark hold freedombox freedombox-doc-en freedombox-doc-es
|
||||
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/freedombox/tests/functional/install.sh
|
||||
/freedombox/plinth/tests/functional/install.sh
|
||||
fi
|
||||
|
||||
# Wait for the server to start if functional tests are requested
|
||||
# Run the plinth server if functional tests are requested
|
||||
if [[ "{pytest_command}" =~ "--include-functional" ]]
|
||||
then
|
||||
make -C /freedombox wait-while-first-setup
|
||||
is_plinth_running=0
|
||||
ps -ax -o cmd | grep -q "^sudo -u plinth /freedombox/run" && \
|
||||
is_plinth_running=1
|
||||
ps -ax -o cmd | grep -q "^/usr/bin/python3 /usr/bin/plinth" && \
|
||||
is_plinth_running=1
|
||||
|
||||
if [[ $is_plinth_running -eq 1 ]]
|
||||
then
|
||||
echo "> In machine: Plinth is already running"
|
||||
else
|
||||
echo -n "> In machine: Starting plinth ... "
|
||||
sudo -u plinth /freedombox/run --develop > plinth.log 2>&1 &
|
||||
while ! grep -q "Setup finished" plinth.log
|
||||
do
|
||||
sleep 1
|
||||
echo -n .
|
||||
done
|
||||
echo
|
||||
fi
|
||||
|
||||
if [[ "{pytest_command}" != *"--splinter-headless"* ]]
|
||||
then
|
||||
@ -277,7 +293,7 @@ LIBVIRT_DOMAIN_XML_TEMPLATE = '''<domain type="kvm">
|
||||
<access mode="shared"/>
|
||||
</memoryBacking>
|
||||
<vcpu placement="static">{cpus}</vcpu>
|
||||
<os {firmware}>
|
||||
<os>
|
||||
<type arch="x86_64" machine="pc-q35-7.2">hvm</type>
|
||||
<boot dev="hd"/>
|
||||
</os>
|
||||
@ -475,18 +491,14 @@ def parse_arguments() -> argparse.Namespace:
|
||||
help='Type of the machine, container to virtual machine, to run '
|
||||
'operation on')
|
||||
|
||||
# Start
|
||||
subparser = subparsers.add_parser('start', help='Bring up the container',
|
||||
formatter_class=formatter_class,
|
||||
aliases=['up'])
|
||||
# Up
|
||||
subparser = subparsers.add_parser('up', help='Bring up the container',
|
||||
formatter_class=formatter_class)
|
||||
_add_common_args(subparser)
|
||||
subparser.add_argument('--image-size', default='16G',
|
||||
help='Disk image size to resize to after download')
|
||||
subparser.add_argument('--hkp-client', choices=('gpg', 'wget'),
|
||||
default='gpg', help='Client for key retrieval')
|
||||
subparser.add_argument(
|
||||
'--skip-install', action='store_true',
|
||||
help='Skip running make provision-dev in the container')
|
||||
|
||||
# Print IP address
|
||||
subparser = subparsers.add_parser(
|
||||
@ -510,8 +522,7 @@ def parse_arguments() -> argparse.Namespace:
|
||||
|
||||
# Stop
|
||||
subparser = subparsers.add_parser('stop', help='Stop the container',
|
||||
formatter_class=formatter_class,
|
||||
aliases=['down'])
|
||||
formatter_class=formatter_class)
|
||||
_add_common_args(subparser)
|
||||
|
||||
# Destroy
|
||||
@ -689,27 +700,10 @@ def _verify_signature(hkp_client: str, data_file: pathlib.Path,
|
||||
|
||||
def _extract_image(compressed_file: pathlib.Path):
|
||||
"""Extract the image file."""
|
||||
# Strip the .xz extension, then replace .img with .raw
|
||||
decompressed_file = compressed_file.with_suffix('').with_suffix('.raw')
|
||||
older_image = compressed_file.with_suffix('')
|
||||
|
||||
decompressed_file = compressed_file.with_suffix('')
|
||||
if decompressed_file.exists():
|
||||
return decompressed_file
|
||||
|
||||
# Rename older image and its corresponding state files.
|
||||
if older_image.exists():
|
||||
logger.info('Renaming .img file to .raw')
|
||||
older_image.rename(decompressed_file)
|
||||
|
||||
for ext in ['.setup', '.provisioned']:
|
||||
old_state = older_image.with_suffix(older_image.suffix + ext)
|
||||
new_state = decompressed_file.with_suffix(
|
||||
decompressed_file.suffix + ext)
|
||||
if old_state.exists():
|
||||
old_state.rename(new_state)
|
||||
|
||||
return decompressed_file
|
||||
|
||||
logger.info('Decompressing file %s', compressed_file)
|
||||
partial_file = compressed_file.with_suffix('.partial')
|
||||
with partial_file.open('w', encoding='utf-8') as file_handle:
|
||||
@ -732,8 +726,7 @@ def _get_compressed_image_path(distribution: str) -> pathlib.Path:
|
||||
def _get_image_file(distribution: str) -> pathlib.Path:
|
||||
"""Return the path of the image file."""
|
||||
compressed_image = _get_compressed_image_path(distribution)
|
||||
# Strip the .xz extension, then replace .img with .raw
|
||||
return compressed_image.with_suffix('').with_suffix('.raw')
|
||||
return compressed_image.with_suffix('')
|
||||
|
||||
|
||||
def _get_project_folder() -> pathlib.Path:
|
||||
@ -784,8 +777,7 @@ def _get_partition_info(image_file: pathlib.Path) -> tuple[str, str]:
|
||||
return partition_table_type, last_partition_number
|
||||
|
||||
|
||||
def _resize_disk_image(image_file: pathlib.Path, new_size: str,
|
||||
distribution: str):
|
||||
def _resize_disk_image(image_file: pathlib.Path, new_size: str):
|
||||
"""Resize the disk image if has not already been."""
|
||||
if new_size[-1] != 'G':
|
||||
raise ValueError(f'Invalid size: {new_size}')
|
||||
@ -828,11 +820,10 @@ def _resize_disk_image(image_file: pathlib.Path, new_size: str,
|
||||
with tempfile.TemporaryDirectory(
|
||||
dir=_get_work_directory().resolve()) as mount_point:
|
||||
subprocess.run(['sudo', 'mount', partition, mount_point], check=True)
|
||||
time.sleep(2) # Mount may trigger some re-balancing
|
||||
subprocess.run(
|
||||
['sudo', 'btrfs', 'filesystem', 'resize', 'max', mount_point],
|
||||
check=True, stdout=subprocess.DEVNULL)
|
||||
_update_fsid(mount_point, partition, old_fsid, new_fsid, distribution)
|
||||
_update_fsid(mount_point, partition, old_fsid, new_fsid)
|
||||
subprocess.run(['sudo', 'umount', mount_point], check=True)
|
||||
|
||||
subprocess.run(
|
||||
@ -850,26 +841,17 @@ def _get_fsid(partition: str) -> str:
|
||||
|
||||
|
||||
def _update_fsid(mount_point: str, partition: str, old_fsid: str,
|
||||
new_fsid: str, distribution: str):
|
||||
new_fsid: str):
|
||||
"""After changing btrfs fsid, run grub-install to keep image bootable."""
|
||||
is_efi = (platform.machine() in ('aarch64', 'arm64')
|
||||
or distribution != 'oldstable')
|
||||
|
||||
# Guess the loopback device for the filesystem
|
||||
matches = re.match(r'^/dev/mapper/loop(\d+)p(\d+)$', partition)
|
||||
matches = re.match(r'^/dev/mapper/loop(\d+)p\d+$', partition)
|
||||
assert matches
|
||||
loop_device = f'/dev/loop{matches[1]}'
|
||||
if is_efi:
|
||||
efi_device = f'/dev/mapper/loop{matches[1]}p{int(matches[2]) - 1}'
|
||||
|
||||
# Mount /dev, /proc and run grub commands in chroot
|
||||
grub_args = []
|
||||
if platform.machine() in ('aarch64', 'arm64'):
|
||||
grub_args += ['--no-nvram']
|
||||
elif distribution != 'oldstable':
|
||||
grub_args += [
|
||||
'--target=x86_64-efi', '--no-nvram', '--uefi-secure-boot'
|
||||
]
|
||||
|
||||
subprocess.run(
|
||||
['sudo', 'mount', '-o', 'bind', '/dev/', f'{mount_point}/dev'],
|
||||
@ -877,11 +859,6 @@ def _update_fsid(mount_point: str, partition: str, old_fsid: str,
|
||||
subprocess.run(
|
||||
['sudo', 'mount', '-o', 'bind', '/proc/', f'{mount_point}/proc'],
|
||||
check=True)
|
||||
if is_efi:
|
||||
subprocess.run(
|
||||
['sudo', 'mount', efi_device, f'{mount_point}/boot/efi'],
|
||||
check=True)
|
||||
|
||||
subprocess.run(['sudo', 'chroot', mount_point, 'update-grub'], check=True)
|
||||
subprocess.run(
|
||||
['sudo', 'chroot', mount_point, 'grub-install', loop_device] +
|
||||
@ -890,10 +867,6 @@ def _update_fsid(mount_point: str, partition: str, old_fsid: str,
|
||||
'sudo', 'chroot', mount_point, 'sed', '-ie',
|
||||
f's|UUID={old_fsid}|UUID={new_fsid}|', '/etc/fstab'
|
||||
], check=True)
|
||||
if is_efi:
|
||||
subprocess.run(['sudo', 'umount', f'{mount_point}/boot/efi'],
|
||||
check=True)
|
||||
|
||||
subprocess.run(['sudo', 'umount', f'{mount_point}/proc'], check=True)
|
||||
subprocess.run(['sudo', 'umount', f'{mount_point}/dev'], check=True)
|
||||
|
||||
@ -930,7 +903,11 @@ def _setup_users(image_file: pathlib.Path):
|
||||
str(gid), 'plinth'], stdout=subprocess.DEVNULL)
|
||||
|
||||
logger.info('In image: Setting up sudo for users "fbx" and "plinth"')
|
||||
sudo_config = 'fbx ALL=(ALL:ALL) NOPASSWD : ALL\n'
|
||||
sudo_config = 'Cmnd_Alias FREEDOMBOX_ACTION_DEV = /usr/share/plinth/' \
|
||||
'actions/actions, /freedombox/actions/actions\n' \
|
||||
'Defaults!FREEDOMBOX_ACTION_DEV closefrom_override\n' \
|
||||
'plinth ALL=(ALL:ALL) NOPASSWD:SETENV : FREEDOMBOX_ACTION_DEV\n' \
|
||||
'fbx ALL=(ALL:ALL) NOPASSWD : ALL\n'
|
||||
_runc(image_file, ['tee', '/etc/sudoers.d/01-freedombox-development'],
|
||||
input=sudo_config.encode(), stdout=subprocess.DEVNULL)
|
||||
|
||||
@ -967,7 +944,7 @@ def _setup_ssh(image_file: pathlib.Path):
|
||||
_runc(image_file, ['chown', 'fbx:fbx', '/home/fbx/.ssh/authorized_keys'])
|
||||
|
||||
|
||||
def _setup_image(image_file: pathlib.Path, skip_install: bool = False):
|
||||
def _setup_image(image_file: pathlib.Path):
|
||||
"""Prepare the image for execution."""
|
||||
setup_file = image_file.with_suffix(image_file.suffix + '.setup')
|
||||
if setup_file.exists():
|
||||
@ -979,10 +956,9 @@ def _setup_image(image_file: pathlib.Path, skip_install: bool = False):
|
||||
_runc(image_file, ['tee', '/etc/apt/apt.conf.d/20auto-upgrades'],
|
||||
input=contents.encode())
|
||||
|
||||
if not skip_install:
|
||||
logger.info('In image: Disabling FreedomBox service')
|
||||
_runc(image_file, ['systemctl', 'disable', 'plinth'],
|
||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
logger.info('In image: Disabling FreedomBox service')
|
||||
_runc(image_file, ['systemctl', 'disable', 'plinth'],
|
||||
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
|
||||
|
||||
logger.info('In image: Creating virtiofs mount at /freedombox')
|
||||
mount = '''[Unit]
|
||||
@ -1040,19 +1016,15 @@ def _is_provisioned(distribution: str) -> bool:
|
||||
return provision_file.exists()
|
||||
|
||||
|
||||
def _provision(image_file: pathlib.Path, machine_type: str, distribution: str,
|
||||
skip_install: bool = False):
|
||||
def _provision(image_file: pathlib.Path, machine_type: str, distribution: str):
|
||||
"""Run app setup inside the container."""
|
||||
if _is_provisioned(distribution):
|
||||
return
|
||||
|
||||
if skip_install:
|
||||
logger.info('Skipping provision step (--skip-install)')
|
||||
else:
|
||||
machine = Machine.get_instance(machine_type, distribution)
|
||||
ssh_command = machine.get_ssh_command()
|
||||
subprocess.run(ssh_command + ['bash'], check=True,
|
||||
input=PROVISION_SCRIPT.encode())
|
||||
machine = Machine.get_instance(machine_type, distribution)
|
||||
ssh_command = machine.get_ssh_command()
|
||||
subprocess.run(ssh_command + ['bash'], check=True,
|
||||
input=PROVISION_SCRIPT.encode())
|
||||
|
||||
provision_file = image_file.with_suffix(image_file.suffix + '.provisioned')
|
||||
provision_file.touch()
|
||||
@ -1082,7 +1054,7 @@ Folder overlay : (host, read-only){project_folder}
|
||||
|
||||
SSH easily : {script} ssh {options}
|
||||
Run tests : {script} run-tests {options} [ --pytest-args ... ]
|
||||
Watch FreedomBox logs : sudo freedombox-logs
|
||||
Run FreedomBox inside : freedombox-develop
|
||||
|
||||
Web access : https://{ip_address}/
|
||||
Ports access : Any port on {ip_address}
|
||||
@ -1091,7 +1063,7 @@ Terminal login : sudo machinectl login fbx-{distribution}
|
||||
Open a root shell : sudo machinectl shell fbx-{distribution}
|
||||
Shutdown : {script} stop {options}
|
||||
Destroy : {script} destroy {options}
|
||||
Reset : {script} destroy {options}; {script} start {options}'''
|
||||
Reset : {script} destroy {options}; {script} up {options}'''
|
||||
logger.info(message)
|
||||
|
||||
|
||||
@ -1355,8 +1327,9 @@ VirtualEthernet=yes
|
||||
if result.returncode:
|
||||
raise Exception(f'Image file {image_link} is not a symlink.')
|
||||
|
||||
# May be linked to wrong place (such as old .img file)
|
||||
subprocess.run(['sudo', 'rm', '--force', str(image_link)], check=False)
|
||||
subprocess.run(['sudo', 'rm', '--force',
|
||||
str(image_link)], check=False)
|
||||
|
||||
subprocess.run([
|
||||
'sudo', 'ln', '--symbolic',
|
||||
str(image_file.resolve()),
|
||||
@ -1384,15 +1357,12 @@ class VM(Machine):
|
||||
pass
|
||||
|
||||
qcow_image = self._create_qcow_image()
|
||||
firmware = 'firmware="efi"' if self.distribution != 'oldstable' else ''
|
||||
domain_xml = LIBVIRT_DOMAIN_XML_TEMPLATE.format(
|
||||
domain_name=self.machine_name, memory_mib='2048', cpus='4',
|
||||
firmware=firmware, image_file=qcow_image,
|
||||
source_dir=_get_project_folder())
|
||||
image_file=qcow_image, source_dir=_get_project_folder())
|
||||
|
||||
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)
|
||||
@ -1420,7 +1390,7 @@ class VM(Machine):
|
||||
|
||||
logger.info('Running `virsh destroy %s`', self.machine_name)
|
||||
try:
|
||||
self._virsh(['undefine', '--nvram', self.machine_name],
|
||||
self._virsh(['undefine', self.machine_name],
|
||||
stdout=subprocess.DEVNULL)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
@ -1429,7 +1399,7 @@ class VM(Machine):
|
||||
"""Remove all traces of the VM from the host."""
|
||||
logger.info('Running `virsh undefine %s`', self.machine_name)
|
||||
try:
|
||||
self._virsh(['undefine', '--nvram', self.machine_name],
|
||||
self._virsh(['undefine', self.machine_name],
|
||||
stdout=subprocess.DEVNULL)
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
@ -1488,7 +1458,7 @@ class VM(Machine):
|
||||
qcow_image.unlink(missing_ok=True)
|
||||
|
||||
|
||||
def subcommand_start(arguments: argparse.Namespace):
|
||||
def subcommand_up(arguments: argparse.Namespace):
|
||||
"""Download, setup and bring up the container."""
|
||||
machine = Machine.get_instance(arguments.machine_type,
|
||||
arguments.distribution)
|
||||
@ -1500,13 +1470,11 @@ def subcommand_start(arguments: argparse.Namespace):
|
||||
_verify_dependencies()
|
||||
image_file = _download_disk_image(arguments.distribution,
|
||||
arguments.hkp_client)
|
||||
_resize_disk_image(image_file, arguments.image_size,
|
||||
arguments.distribution)
|
||||
_setup_image(image_file, arguments.skip_install)
|
||||
_resize_disk_image(image_file, arguments.image_size)
|
||||
_setup_image(image_file)
|
||||
machine.setup()
|
||||
machine.launch()
|
||||
_provision(image_file, arguments.machine_type, arguments.distribution,
|
||||
arguments.skip_install)
|
||||
_provision(image_file, arguments.machine_type, arguments.distribution)
|
||||
_print_banner(arguments.machine_type, arguments.distribution)
|
||||
|
||||
|
||||
@ -1593,13 +1561,7 @@ def main():
|
||||
logging.basicConfig(level='INFO', format='> %(message)s')
|
||||
arguments = parse_arguments()
|
||||
|
||||
aliases = {
|
||||
'up': 'start',
|
||||
'down': 'stop',
|
||||
}
|
||||
|
||||
subcommand: str = arguments.subcommand.replace('-', '_')
|
||||
subcommand = aliases.get(subcommand, subcommand)
|
||||
subcommand = arguments.subcommand.replace('-', '_')
|
||||
subcommand_method = globals()['subcommand_' + subcommand]
|
||||
subcommand_method(arguments)
|
||||
|
||||
|
||||
@ -16,14 +16,8 @@
|
||||
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
|
||||
|
||||
# Automatically obtained certificates from Let's Encrypt
|
||||
<IfFile /etc/letsencrypt/live/$domain/privkey.pem>
|
||||
SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem
|
||||
</IfFile>
|
||||
<IfFile !/etc/letsencrypt/live/$domain/privkey.pem>
|
||||
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
|
||||
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
|
||||
</IfFile>
|
||||
SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem
|
||||
SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem
|
||||
|
||||
<FilesMatch "\.(cgi|shtml|phtml|php)$">
|
||||
SSLOptions +StdEnvVars
|
||||
@ -31,19 +25,6 @@
|
||||
<Directory /usr/lib/cgi-bin>
|
||||
SSLOptions +StdEnvVars
|
||||
</Directory>
|
||||
|
||||
<IfFile /etc/apache2/includes/all-domains-include-freedombox.conf>
|
||||
Include includes/all-domains-include-freedombox.conf
|
||||
</IfFile>
|
||||
<IfFile /etc/apache2/includes/all-domains-include.conf>
|
||||
Include includes/all-domains-include.conf
|
||||
</IfFile>
|
||||
<IfFile /etc/apache2/includes/$domain-include-freedombox.conf>
|
||||
Include includes/$domain-include-freedombox.conf
|
||||
</IfFile>
|
||||
<IfFile /etc/apache2/includes/$domain-include.conf>
|
||||
Include includes/$domain-include.conf
|
||||
</IfFile>
|
||||
</VirtualHost>
|
||||
</IfModule>
|
||||
</Macro>
|
||||
|
||||
@ -12,7 +12,6 @@
|
||||
# Don't redirect for onion sites as it is not needed and leads to
|
||||
# unnecessary warning.
|
||||
RewriteCond %{HTTP_HOST} !^.*\.onion$ [NC]
|
||||
RewriteCond %{REQUEST_URI} !^/freedombox/apache/discover-idp/$ [NC]
|
||||
ReWriteCond %{HTTPS} !=on
|
||||
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
|
||||
</LocationMatch>
|
||||
|
||||
@ -39,16 +39,56 @@
|
||||
</If>
|
||||
|
||||
##
|
||||
## 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.
|
||||
## Redirect traffic on home to /plinth as part of turning the machine
|
||||
## into FreedomBox server. Plinth then acts as a portal to reach all
|
||||
## other services.
|
||||
##
|
||||
<IfFile !/etc/apache2/conf-enabled/freedombox-apache-homepage.conf>
|
||||
RedirectMatch "^/$" "/freedombox"
|
||||
</IfFile>
|
||||
RedirectMatch "^/$" "/plinth"
|
||||
|
||||
##
|
||||
## On all sites, provide FreedomBox on a default path: /freedombox
|
||||
## Disable sending Referer (sic) header from FreedomBox web interface to
|
||||
## external websites. This improves privacy by not disclosing FreedomBox
|
||||
## domains/URLs to external domains. Apps such as blogs which want to popularize
|
||||
## themselves with referrer header may still do so.
|
||||
##
|
||||
## A strict Content Security Policy.
|
||||
## - @fonts are allowed only from FreedomBox itself.
|
||||
## - <frame>/<iframe> sources are disabled.
|
||||
## - <img> sources are allowed only from FreedomBox itself.
|
||||
## - Manifest file is not allowed as there is none yet.
|
||||
## - <audio>, <video>, <track> tags are not allowed yet.
|
||||
## - <object>, <embed>, <applet> tags are not allowed yet.
|
||||
## - Allow JS from FreedomBox itself (no inline and attribute scripts).
|
||||
## - Allow inline CSS and CSS files from Freedombox itself.
|
||||
## - Web worker sources are allowed only from FreedomBox itself (for JSXC).
|
||||
## - All other fetch sources including Ajax are not allowed from FreedomBox
|
||||
## itself.
|
||||
## - <base> tag is not allowed.
|
||||
## - No plugins types are alllowed since object-src is 'none'.
|
||||
## - Form action should be to FreedomBox itself.
|
||||
## - This interface may be not embedded in <frame>, <iframe>, etc. tags.
|
||||
## - When serving HTTPS, don't allow HTTP assets.
|
||||
##
|
||||
## Enable strict sandboxing enabled with some exceptions:
|
||||
## - Allow running Javascript.
|
||||
## - Allow popups as sometimes we use <a target=_blank>
|
||||
## - Allow popups to have different sandbox requirements as we launch apps' web
|
||||
## clients.
|
||||
## - Allow forms to support configuration forms.
|
||||
## - Allow policies to treat same origin differently from other origins
|
||||
## - Allow downloads such as backup tarballs.
|
||||
##
|
||||
## Disable browser guessing of MIME types. FreedoBox already sets good content
|
||||
## types for all the common file types.
|
||||
##
|
||||
<LocationMatch "^/(plinth|freedombox)">
|
||||
Header set Referrer-Policy 'same-origin'
|
||||
Header set Content-Security-Policy "font-src 'self'; frame-src 'none'; img-src 'self' data:; manifest-src 'none'; media-src 'none'; object-src 'none'; script-src 'self'; style-src 'self'; worker-src 'self'; default-src 'self'; base-uri 'none'; sandbox allow-scripts allow-popups allow-popups-to-escape-sandbox allow-forms allow-same-origin allow-downloads; form-action 'self'; frame-ancestors 'none'; block-all-mixed-content;"
|
||||
Header set X-Content-Type-Options 'nosniff'
|
||||
</LocationMatch>
|
||||
|
||||
##
|
||||
## On all sites, provide FreedomBox on a default path: /plinth
|
||||
##
|
||||
## Requires the following Apache modules to be enabled:
|
||||
## mod_headers
|
||||
@ -56,9 +96,8 @@
|
||||
## mod_proxy_http
|
||||
##
|
||||
<Location /freedombox>
|
||||
ProxyPass http://127.0.0.1:8000/freedombox
|
||||
ProxyPreserveHost On
|
||||
## Send the scheme from user's request to enable FreedomBox to redirect
|
||||
ProxyPass http://127.0.0.1:8000/plinth
|
||||
## Send the scheme from user's request to enable Plinth to redirect
|
||||
## URLs, set cookies, set absolute URLs (if any) properly.
|
||||
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS
|
||||
|
||||
@ -71,20 +110,7 @@
|
||||
RequestHeader unset X-Forwarded-For
|
||||
</Location>
|
||||
<Location /plinth>
|
||||
ProxyPass http://127.0.0.1:8000/freedombox
|
||||
ProxyPreserveHost On
|
||||
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS
|
||||
RequestHeader unset X-Forwarded-For
|
||||
</Location>
|
||||
<Location /.well-known/openid-configuration>
|
||||
ProxyPass http://127.0.0.1:8000/freedombox/o/.well-known/openid-configuration
|
||||
ProxyPreserveHost On
|
||||
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS
|
||||
RequestHeader unset X-Forwarded-For
|
||||
</Location>
|
||||
<Location /.well-known/jwks.json>
|
||||
ProxyPass http://127.0.0.1:8000/freedombox/o/.well-known/jwks.json
|
||||
ProxyPreserveHost On
|
||||
ProxyPass http://127.0.0.1:8000/plinth
|
||||
RequestHeader set X-Forwarded-Proto 'https' env=HTTPS
|
||||
RequestHeader unset X-Forwarded-For
|
||||
</Location>
|
||||
@ -96,7 +122,7 @@
|
||||
<Location ~ ^/favicon\.ico$>
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine On
|
||||
RewriteRule /favicon\.ico$ "/freedombox/static/theme/img/favicon.ico" [PT]
|
||||
RewriteRule /favicon\.ico$ "/plinth/static/theme/img/favicon.ico" [PT]
|
||||
</IfModule>
|
||||
</Location>
|
||||
|
||||
@ -126,12 +152,3 @@ ErrorLog "|/usr/bin/systemd-cat --identifier=apache-error"
|
||||
# records its own timestamp.
|
||||
ErrorLogFormat "[%-m:%l] [pid %P:tid %{g}T] %7F: %E: [client\ %a] %M% ,\ referer\ %{Referer}i"
|
||||
CustomLog "|/usr/bin/systemd-cat --identifier=apache-access" vhost_combined
|
||||
|
||||
## When showing an index page for a directory listing, ensure that viewport's
|
||||
## width is the same as the device's width. Directory index pages generated by
|
||||
## mod_autoindex are reasonably suitable for mobile devices. However, without
|
||||
## the directive, mobile devices will assume the page to be not-mobile friendly
|
||||
## and use a larger view port than the device size.
|
||||
<IfModule mod_autoindex.c>
|
||||
IndexHeadInsert "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
|
||||
</IfModule>
|
||||
|
||||
@ -1,3 +1,11 @@
|
||||
#
|
||||
# Allow plinth user to run plinth action scripts with superuser privileges
|
||||
# without needing a password.
|
||||
#
|
||||
Cmnd_Alias FREEDOMBOX_ACTION = /usr/share/plinth/actions/actions
|
||||
Defaults!FREEDOMBOX_ACTION closefrom_override
|
||||
plinth ALL=(ALL:ALL) NOPASSWD:FREEDOMBOX_ACTION
|
||||
|
||||
#
|
||||
# On FreedomBox, allow all users in the 'admin' LDAP group to execute
|
||||
# commands as root.
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
[Unit]
|
||||
Description=FreedomBox Privileged Service
|
||||
Documentation=https://wiki.debian.org/FreedomBox/
|
||||
# Don't hit the start rate limiting.
|
||||
StartLimitIntervalSec=0
|
||||
# Stop/restart along with .socket unit (invoked from dpkg scripts).
|
||||
PartOf=freedombox-privileged.socket
|
||||
# Uploaded files in /var/tmp/ are shared with FreedomBox web service.
|
||||
JoinsNamespaceOf=plinth.service
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
ExecStart=/usr/lib/freedombox/freedombox-privileged
|
||||
TimeoutSec=300s
|
||||
User=root
|
||||
Group=root
|
||||
NotifyAccess=main
|
||||
# Uploaded files in /var/tmp/ are shared with FreedomBox web service by joining
|
||||
# namespaces.
|
||||
PrivateTmp=yes
|
||||
Restart=on-failure
|
||||
# Don't restart too fast
|
||||
RestartSec=1
|
||||
RestartSteps=3
|
||||
RestartMaxDelaySec=5
|
||||
@ -1,16 +0,0 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
|
||||
[Unit]
|
||||
Description=FreedomBox Privileged Service Socket
|
||||
Documentation=https://wiki.debian.org/FreedomBox/
|
||||
|
||||
[Socket]
|
||||
Accept=no
|
||||
ListenStream=/run/freedombox/privileged.socket
|
||||
SocketUser=root
|
||||
SocketGroup=root
|
||||
SocketMode=0666
|
||||
DirectoryMode=755
|
||||
|
||||
[Install]
|
||||
WantedBy=sockets.target
|
||||
@ -2,24 +2,22 @@
|
||||
|
||||
[Unit]
|
||||
Description=FreedomBox Service (Plinth)
|
||||
Documentation=man:freedombox(1)
|
||||
Documentation=man:plinth(1)
|
||||
After=network.target
|
||||
StartLimitIntervalSec=0
|
||||
# Uploaded files in /var/tmp/ are shared with FreedomBox privileged service.
|
||||
JoinsNamespaceOf=freedombox-privileged.service
|
||||
|
||||
[Service]
|
||||
Type=notify
|
||||
ExecStart=/usr/bin/freedombox
|
||||
ExecStart=/usr/bin/plinth
|
||||
TimeoutSec=300s
|
||||
Restart=on-failure
|
||||
RestartSec=5
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
User=plinth
|
||||
Group=plinth
|
||||
StandardOutput=null
|
||||
StandardError=null
|
||||
NotifyAccess=main
|
||||
# Uploaded files in /var/tmp/ are shared with FreedomBox privileged service by
|
||||
# joining namespaces.
|
||||
PrivateTmp=yes
|
||||
|
||||
[Install]
|
||||
|
||||
1479
debian/changelog
vendored
1479
debian/changelog
vendored
File diff suppressed because it is too large
Load Diff
61
debian/control
vendored
61
debian/control
vendored
@ -1,66 +1,69 @@
|
||||
Source: freedombox
|
||||
Section: web
|
||||
Priority: optional
|
||||
Maintainer: FreedomBox packaging team <freedombox-pkg-team@lists.alioth.debian.org>
|
||||
Uploaders:
|
||||
Tzafrir Cohen <tzafrir@debian.org>,
|
||||
Piotr Ożarowski <piotr@debian.org>,
|
||||
Petter Reinholdtsen <pere@debian.org>,
|
||||
Sunil Mohan Adapa <sunil@medhas.org>,
|
||||
Nick Daly <Nick.M.Daly@gmail.com>,
|
||||
Federico Ceratto <federico@debian.org>,
|
||||
James Valleroy <jvalleroy@mailbox.org>,
|
||||
Build-Depends:
|
||||
debhelper-compat (= 13),
|
||||
dh-sequence-installsysusers,
|
||||
dblatex,
|
||||
dh-python,
|
||||
docbook-xsl,
|
||||
e2fsprogs <!nocheck>,
|
||||
e2fsprogs,
|
||||
gir1.2-nm-1.0,
|
||||
libjs-bootstrap5 <!nocheck>,
|
||||
libjs-htmx <!nocheck>,
|
||||
libjs-bootstrap5,
|
||||
# Older libjs-bootstrap5 does not have proper dependency on popper.js >= 2.0
|
||||
node-popper2 <!nocheck>,
|
||||
node-popper2,
|
||||
pybuild-plugin-pyproject,
|
||||
python3-all:any,
|
||||
python3-apt <!nocheck>,
|
||||
python3-apt,
|
||||
python3-augeas,
|
||||
python3-bootstrapform <!nocheck>,
|
||||
python3-bootstrapform,
|
||||
python3-build,
|
||||
python3-cherrypy3,
|
||||
python3-configobj <!nocheck>,
|
||||
python3-cryptography <!nocheck>,
|
||||
python3-configobj,
|
||||
python3-cryptography,
|
||||
python3-dbus,
|
||||
python3-django,
|
||||
python3-django-axes <!nocheck>,
|
||||
python3-django-captcha <!nocheck>,
|
||||
python3-django-axes,
|
||||
python3-django-captcha,
|
||||
# Explictly depend on ipware as it is optional dependecy of django-axes
|
||||
python3-django-ipware <!nocheck>,
|
||||
python3-django-oauth-toolkit <!nocheck>,
|
||||
python3-django-stronghold <!nocheck>,
|
||||
python3-fido2 <!nocheck>,
|
||||
python3-django-ipware,
|
||||
python3-django-stronghold,
|
||||
python3-gi,
|
||||
python3-markupsafe,
|
||||
python3-mypy <!nocheck>,
|
||||
python3-pampy <!nocheck>,
|
||||
python3-mypy,
|
||||
python3-pampy,
|
||||
python3-pexpect,
|
||||
python3-pip,
|
||||
python3-psutil,
|
||||
python3-pytest <!nocheck>,
|
||||
python3-pytest-cov <!nocheck>,
|
||||
python3-pytest-django <!nocheck>,
|
||||
python3-pytest-runner <!nocheck>,
|
||||
python3-pytest,
|
||||
python3-pytest-cov,
|
||||
python3-pytest-django,
|
||||
python3-pytest-runner,
|
||||
python3-requests,
|
||||
python3-ruamel.yaml,
|
||||
python3-segno <!nocheck>,
|
||||
python3-setuptools,
|
||||
python3-setuptools-git,
|
||||
python3-systemd,
|
||||
python3-typeshed <!nocheck>,
|
||||
# python3-tomli is needed by python3-coverage when pyproject.toml is used
|
||||
python3-tomli,
|
||||
python3-typeshed,
|
||||
python3-yaml,
|
||||
sshpass <!nocheck>,
|
||||
sshpass,
|
||||
xmlto,
|
||||
xsltproc
|
||||
Standards-Version: 4.7.3
|
||||
Standards-Version: 4.6.2
|
||||
Homepage: https://salsa.debian.org/freedombox-team/freedombox
|
||||
Vcs-Git: https://salsa.debian.org/freedombox-team/freedombox.git
|
||||
Vcs-Browser: https://salsa.debian.org/freedombox-team/freedombox
|
||||
Rules-Requires-Root: no
|
||||
|
||||
Package: freedombox
|
||||
Breaks:
|
||||
@ -73,10 +76,13 @@ Depends:
|
||||
${python3:Depends},
|
||||
${misc:Depends},
|
||||
${freedombox:Depends},
|
||||
adduser,
|
||||
augeas-tools,
|
||||
bind9-dnsutils,
|
||||
curl,
|
||||
debconf,
|
||||
fonts-fork-awesome,
|
||||
fonts-lato,
|
||||
# sgdisk is used in storage app to expand GPT disks
|
||||
gdisk,
|
||||
gettext,
|
||||
@ -87,7 +93,6 @@ Depends:
|
||||
# For gdbus used to call hooks into service
|
||||
libglib2.0-bin,
|
||||
libjs-bootstrap5,
|
||||
libjs-htmx,
|
||||
lsof,
|
||||
netcat-openbsd,
|
||||
network-manager,
|
||||
@ -107,9 +112,7 @@ Depends:
|
||||
python3-django-captcha,
|
||||
# Explictly depend on ipware as it is optional dependecy of django-axes
|
||||
python3-django-ipware,
|
||||
python3-django-oauth-toolkit,
|
||||
python3-django-stronghold,
|
||||
python3-fido2,
|
||||
python3-gi,
|
||||
python3-markupsafe,
|
||||
python3-pampy,
|
||||
@ -135,6 +138,8 @@ Recommends:
|
||||
libnss-mdns,
|
||||
# Resolve current hostname without /etc/hosts
|
||||
libnss-myhostname,
|
||||
# Block repeated failed PAM login attempts
|
||||
libpam-abl,
|
||||
# Priority: standard
|
||||
locales,
|
||||
# Precompiled data for all locales
|
||||
|
||||
479
debian/copyright
vendored
479
debian/copyright
vendored
@ -2,11 +2,11 @@ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Source: https://salsa.debian.org/freedombox-team/freedombox
|
||||
|
||||
Files: *
|
||||
Copyright: 2011-2026 FreedomBox Authors
|
||||
Copyright: 2011-2024 FreedomBox Authors
|
||||
License: AGPL-3+
|
||||
|
||||
Files: freedombox/modules/jsxc/static/icons/jsxc.png
|
||||
freedombox/modules/jsxc/static/icons/jsxc.svg
|
||||
Files: plinth/modules/jsxc/static/icons/jsxc.png
|
||||
plinth/modules/jsxc/static/icons/jsxc.svg
|
||||
Copyright: 2011-2019 FreedomBox Authors
|
||||
License: AGPL-3+
|
||||
|
||||
@ -15,7 +15,7 @@ Files: doc/*.xml
|
||||
doc/*.png
|
||||
doc/*.jpg
|
||||
doc/*.wiki
|
||||
Copyright: 2011-2025 FreedomBox Authors
|
||||
Copyright: 2011-2023 FreedomBox Authors
|
||||
License: CC-BY-SA-4.0
|
||||
|
||||
Files: doc/visual_design/apple-touch-icon*
|
||||
@ -32,53 +32,48 @@ Copyright: 2012 FreedomBox Foundation
|
||||
Comment: Original Author: Robert Martinez
|
||||
License: GPL-3+
|
||||
|
||||
Files: static/themes/default/icons/app-store.svg
|
||||
Files: static/themes/default/icons/app-store.png
|
||||
static/themes/default/icons/app-store.svg
|
||||
Copyright: Marie Van den Broeck (https://thenounproject.com/marie49/)
|
||||
Comment: https://thenounproject.com/icon/162372/
|
||||
License: CC-BY-SA-3.0
|
||||
|
||||
Files: static/themes/default/js/color-modes.js
|
||||
Copyright: 2011-2025 The Bootstrap Authors
|
||||
Comment: https://getbootstrap.com/docs/5.3/customize/color-modes/
|
||||
License: CC-BY-3.0
|
||||
|
||||
Files: freedombox/modules/bepasty/static/icons/bepasty.svg
|
||||
Files: plinth/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: freedombox/modules/cockpit/static/icons/cockpit.svg
|
||||
Files: plinth/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: freedombox/modules/coturn/static/icons/coturn.png
|
||||
freedombox/modules/coturn/static/icons/coturn.svg
|
||||
Files: plinth/modules/coturn/static/icons/coturn.png
|
||||
plinth/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: freedombox/modules/deluge/static/icons/deluge.png
|
||||
freedombox/modules/deluge/static/icons/deluge.svg
|
||||
Files: plinth/modules/deluge/static/icons/deluge.png
|
||||
plinth/modules/deluge/static/icons/deluge.svg
|
||||
Copyright: 2007 Andrew Wedderburn
|
||||
Comment: https://commons.wikimedia.org/wiki/File:Deluge-Logo.svg
|
||||
License: GPL-2+
|
||||
|
||||
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
|
||||
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
|
||||
static/themes/default/img/network-connection.svg
|
||||
static/themes/default/img/network-connection-vertical.svg
|
||||
static/themes/default/img/network-ethernet.svg
|
||||
@ -100,109 +95,123 @@ 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: freedombox/modules/featherwiki/static/icons/featherwiki.png
|
||||
freedombox/modules/featherwiki/static/icons/featherwiki.svg
|
||||
Files: static/themes/default/icons/f-droid.png
|
||||
static/themes/default/icons/f-droid.svg
|
||||
Copyright: 2012 William Theaker
|
||||
2013 Robert Martinez
|
||||
2015 Andrew Nayenko
|
||||
Comment: https://gitlab.com/fdroid/artwork/blob/master/fdroid-logo-2015/fdroid-logo.svg
|
||||
License: CC-BY-SA-3.0 or GPL-3+
|
||||
|
||||
Files: plinth/modules/featherwiki/static/icons/featherwiki.png
|
||||
plinth/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: freedombox/modules/gitweb/static/icons/gitweb.png
|
||||
freedombox/modules/gitweb/static/icons/gitweb.svg
|
||||
Files: plinth/modules/gitweb/static/icons/gitweb.png
|
||||
plinth/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: 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: static/themes/default/icons/google-play.png
|
||||
Copyright: Chameleon Design (https://thenounproject.com/Chamedesign/)
|
||||
Comment: https://thenounproject.com/icon/887917/
|
||||
License: CC-BY-3.0-US
|
||||
|
||||
Files: freedombox/modules/ikiwiki/static/icons/ikiwiki.png
|
||||
freedombox/modules/ikiwiki/static/icons/ikiwiki.svg
|
||||
Files: static/themes/default/icons/gnu-linux.png
|
||||
Copyright: 2017 Cowemoji
|
||||
License: CC0-1.0
|
||||
|
||||
Files: plinth/modules/ikiwiki/static/icons/ikiwiki.png
|
||||
plinth/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: freedombox/modules/infinoted/static/icons/infinoted.png
|
||||
freedombox/modules/infinoted/static/icons/infinoted.svg
|
||||
Files: plinth/modules/infinoted/static/icons/infinoted.png
|
||||
plinth/modules/infinoted/static/icons/infinoted.svg
|
||||
Copyright: 2008-2014 Armin Burgmeier <armin@arbur.net>
|
||||
License: ISC
|
||||
|
||||
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
|
||||
Files: plinth/modules/janus/static/icons/janus.png
|
||||
plinth/modules/janus/static/icons/janus.svg
|
||||
Copyright: 2014-2022 Meetecho
|
||||
License: GPL-3 with OpenSSL exception
|
||||
|
||||
Files: freedombox/modules/kiwix/static/icons/kiwix.png
|
||||
freedombox/modules/kiwix/static/icons/kiwix.svg
|
||||
Files: plinth/modules/kiwix/static/icons/kiwix.png
|
||||
plinth/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: freedombox/modules/matrixsynapse/static/icons/matrixsynapse.png
|
||||
Files: static/themes/default/icons/macos.png
|
||||
static/themes/default/icons/macos.svg
|
||||
Copyright: Vectors Market (https://thenounproject.com/vectorsmarket/)
|
||||
Comment: https://thenounproject.com/icon/1203053/
|
||||
License: CC-BY-SA-3.0
|
||||
|
||||
Files: plinth/modules/matrixsynapse/static/icons/matrixsynapse.png
|
||||
Copyright: 2017 Kishan Raval
|
||||
Comment: https://github.com/thekishanraval/Logos
|
||||
License: GPL-3+
|
||||
|
||||
Files: freedombox/modules/mediawiki/static/icons/mediawiki.png
|
||||
freedombox/modules/mediawiki/static/icons/mediawiki.svg
|
||||
Files: plinth/modules/mediawiki/static/icons/mediawiki.png
|
||||
plinth/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: freedombox/modules/minetest/static/icons/minetest.png
|
||||
Files: plinth/modules/minetest/static/icons/minetest.png
|
||||
Copyright: 2011 erlehmann
|
||||
License: CC-BY-SA-3.0
|
||||
|
||||
Files: freedombox/modules/minetest/static/icons/minetest.svg
|
||||
Files: plinth/modules/minetest/static/icons/minetest.svg
|
||||
Copyright: 2015 Calinou, Nils Dagsson Moskopp
|
||||
Comment: https://github.com/luanti-org/luanti/blob/master/misc/luanti.svg
|
||||
Comment: https://github.com/minetest/minetest/blob/master/misc/minetest.svg
|
||||
License: CC-BY-SA-3.0
|
||||
|
||||
Files: freedombox/modules/miniflux/static/icons/miniflux.png
|
||||
freedombox/modules/miniflux/static/icons/miniflux.svg
|
||||
Files: plinth/modules/miniflux/static/icons/miniflux.png
|
||||
plinth/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: freedombox/modules/mumble/static/icons/mumble.png
|
||||
Files: plinth/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: freedombox/modules/mumble/static/icons/mumble.svg
|
||||
Files: plinth/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: freedombox/modules/nextcloud/static/icons/nextcloud.png
|
||||
freedombox/modules/nextcloud/static/icons/nextcloud.svg
|
||||
Files: plinth/modules/nextcloud/static/icons/nextcloud.png
|
||||
plinth/modules/nextcloud/static/icons/nextcloud.svg
|
||||
Copyright: 2016 Nextcloud GmbH.
|
||||
Comment: https://nextcloud.com/trademarks/
|
||||
License: AGPL-3+
|
||||
|
||||
Files: freedombox/modules/openvpn/static/icons/openvpn.png
|
||||
Files: plinth/modules/openvpn/static/icons/openvpn.png
|
||||
Copyright: 2017 Kishan Raval
|
||||
Comment: https://github.com/thekishanraval/Logos
|
||||
License: GPL-3+
|
||||
|
||||
Files: freedombox/modules/openvpn/static/icons/openvpn.svg
|
||||
Files: plinth/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: freedombox/modules/quassel/static/icons/quassel.png
|
||||
freedombox/modules/quassel/static/icons/quassel.svg
|
||||
Files: plinth/modules/quassel/static/icons/quassel.png
|
||||
plinth/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: freedombox/modules/radicale/static/icons/radicale.png
|
||||
Files: plinth/modules/radicale/static/icons/radicale.png
|
||||
Copyright: 2008, Nicolas Kandel
|
||||
2008, Pascal Halter
|
||||
2008-2017, Guillaume Ayoub <guillaume.ayoub@kozea.fr>
|
||||
@ -210,7 +219,7 @@ Copyright: 2008, Nicolas Kandel
|
||||
2017, Unrud <unrud@outlook.com>
|
||||
License: GPL-3+
|
||||
|
||||
Files: freedombox/modules/roundcube/static/icons/roundcube.png
|
||||
Files: plinth/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 +227,21 @@ Copyright: 2000 Edmund Grimley Evans <edmundo@rano.org>
|
||||
2005-2007, Jon Abernathy <jon@chuggnutt.com>
|
||||
License: GPL-3+
|
||||
|
||||
Files: freedombox/modules/roundcube/static/icons/roundcube.svg
|
||||
Files: plinth/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: freedombox/modules/samba/static/icons/samba.png
|
||||
freedombox/modules/samba/static/icons/samba.svg
|
||||
Files: plinth/modules/samba/static/icons/samba.png
|
||||
plinth/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: freedombox/modules/searx/static/icons/searx.png
|
||||
freedombox/modules/searx/static/icons/searx.svg
|
||||
Files: plinth/modules/searx/static/icons/searx.png
|
||||
plinth/modules/searx/static/icons/searx.svg
|
||||
Copyright:
|
||||
2013-2017 Adam Tauber <asciimoo@gmail.com>
|
||||
2016 Alexandre Flament <alex@al-f.net>
|
||||
@ -240,84 +249,92 @@ Copyright:
|
||||
2014 Thomas Pointhuber <thomas.pointhuber@gmx.at>
|
||||
License: AGPL-3+
|
||||
|
||||
Files: freedombox/modules/shaarli/static/icons/shaarli.png
|
||||
freedombox/modules/shaarli/static/icons/shaarli.svg
|
||||
Files: plinth/modules/shaarli/static/icons/shaarli.png
|
||||
plinth/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: freedombox/modules/shadowsocks/static/icons/shadowsocks.png
|
||||
freedombox/modules/shadowsocksserver/static/icons/shadowsocks.png
|
||||
Files: plinth/modules/shadowsocks/static/icons/shadowsocks.png
|
||||
plinth/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: freedombox/modules/shadowsocks/static/icons/shadowsocks.svg
|
||||
freedombox/modules/shadowsocksserver/static/icons/shadowsocks.svg
|
||||
Files: plinth/modules/shadowsocks/static/icons/shadowsocks.svg
|
||||
plinth/modules/shadowsocksserver/static/icons/shadowsocks.svg
|
||||
Copyright: Clowwindy
|
||||
Comment: https://commons.wikimedia.org/wiki/File:Shadowsocks-Logo.svg
|
||||
License: Apache-2.0
|
||||
|
||||
Files: freedombox/modules/sharing/static/icons/sharing.png
|
||||
freedombox/modules/sharing/static/icons/sharing.svg
|
||||
Files: plinth/modules/sharing/static/icons/sharing.png
|
||||
plinth/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: freedombox/modules/sogo/static/icons/sogo.png
|
||||
freedombox/modules/sogo/static/icons/sogo.svg
|
||||
Files: plinth/modules/sogo/static/icons/sogo.png
|
||||
plinth/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: freedombox/modules/syncthing/static/icons/syncthing.png
|
||||
Files: plinth/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: freedombox/modules/syncthing/static/icons/syncthing.svg
|
||||
Files: plinth/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: freedombox/modules/tiddlywiki/static/icons/tiddlywiki.svg
|
||||
freedombox/modules/tiddlywiki/static/icons/tiddlywiki.png
|
||||
Files: plinth/modules/tiddlywiki/static/icons/tiddlywiki.svg
|
||||
plinth/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: freedombox/modules/tor/static/icons/tor.png
|
||||
freedombox/modules/tor/static/icons/tor.svg
|
||||
Files: plinth/modules/tor/static/icons/tor.png
|
||||
plinth/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: freedombox/modules/transmission/static/icons/transmission.png
|
||||
freedombox/modules/transmission/static/icons/transmission.svg
|
||||
Files: plinth/modules/transmission/static/icons/transmission.png
|
||||
plinth/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: 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/ttrss/static/icons/ttrss.png
|
||||
Copyright: Mark James <mjames@gmail.com>
|
||||
License: CC-BY-3.0
|
||||
|
||||
Files: freedombox/modules/wordpress/static/icons/wordpress.png
|
||||
freedombox/modules/wordpress/static/icons/wordpress.svg
|
||||
Files: plinth/modules/ttrss/static/icons/ttrss.svg
|
||||
Copyright: 2005 Andrew Dolgov
|
||||
Comment: https://git.tt-rss.org/fox/tt-rss/src/master/images/favicon-72px.png
|
||||
License: GPL-3+
|
||||
|
||||
Files: plinth/modules/wordpress/static/icons/wordpress.png
|
||||
plinth/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: freedombox/modules/wireguard/static/icons/wireguard.png
|
||||
freedombox/modules/wireguard/static/icons/wireguard.svg
|
||||
Files: static/themes/default/icons/windows.png
|
||||
static/themes/default/icons/windows.svg
|
||||
Copyright: 2007 ruli (https://thenounproject.com/2007ruli/)
|
||||
Comment: https://thenounproject.com/icon/1206946/
|
||||
License: CC-BY-SA-3.0
|
||||
|
||||
Files: plinth/modules/wireguard/static/icons/wireguard.png
|
||||
plinth/modules/wireguard/static/icons/wireguard.svg
|
||||
Copyright: 2019 WireGuard LLC
|
||||
Comment: https://git.zx2c4.com/wireguard-windows/plain/ui/icon/wireguard.svg
|
||||
License: Expat
|
||||
@ -327,88 +344,13 @@ Copyright: 2008 GNOME icon artists
|
||||
Comment: https://commons.wikimedia.org/wiki/File:Gnome-computer.svg
|
||||
License: LGPL-3+ or CC-BY-SA-3.0
|
||||
|
||||
Files: static/themes/default/icons/adjust.svg
|
||||
static/themes/default/icons/android.svg
|
||||
static/themes/default/icons/arrow-right.svg
|
||||
static/themes/default/icons/ban.svg
|
||||
static/themes/default/icons/bar-chart.svg
|
||||
static/themes/default/icons/bars.svg
|
||||
static/themes/default/icons/bell-o.svg
|
||||
static/themes/default/icons/book.svg
|
||||
static/themes/default/icons/check-circle.svg
|
||||
static/themes/default/icons/check.svg
|
||||
static/themes/default/icons/chevron-right.svg
|
||||
static/themes/default/icons/clock-o.svg
|
||||
static/themes/default/icons/cog.svg
|
||||
static/themes/default/icons/comments.svg
|
||||
static/themes/default/icons/compass.svg
|
||||
static/themes/default/icons/debian.svg
|
||||
static/themes/default/icons/download.svg
|
||||
static/themes/default/icons/eject.svg
|
||||
static/themes/default/icons/exclamation-triangle.svg
|
||||
static/themes/default/icons/external-link.svg
|
||||
static/themes/default/icons/eye-slash.svg
|
||||
static/themes/default/icons/eye.svg
|
||||
static/themes/default/icons/f-droid.svg
|
||||
static/themes/default/icons/files-o.svg
|
||||
static/themes/default/icons/film.svg
|
||||
static/themes/default/icons/flag.svg
|
||||
static/themes/default/icons/freedombox.svg
|
||||
static/themes/default/icons/frown-o.svg
|
||||
static/themes/default/icons/globe-w.svg
|
||||
static/themes/default/icons/gnu-linux.svg
|
||||
static/themes/default/icons/google-play.svg
|
||||
static/themes/default/icons/hdd-o.svg
|
||||
static/themes/default/icons/heartbeat.svg
|
||||
static/themes/default/icons/heart.svg
|
||||
static/themes/default/icons/home.svg
|
||||
static/themes/default/icons/hourglass-o.svg
|
||||
static/themes/default/icons/info-circle.svg
|
||||
static/themes/default/icons/key.svg
|
||||
static/themes/default/icons/life-ring.svg
|
||||
static/themes/default/icons/line-chart.svg
|
||||
static/themes/default/icons/lock.svg
|
||||
static/themes/default/icons/macos.svg
|
||||
static/themes/default/icons/moon.svg
|
||||
static/themes/default/icons/pencil-square-o.svg
|
||||
static/themes/default/icons/plus.svg
|
||||
static/themes/default/icons/power-off.svg
|
||||
static/themes/default/icons/question-circle.svg
|
||||
static/themes/default/icons/refresh.svg
|
||||
static/themes/default/icons/repeat.svg
|
||||
static/themes/default/icons/rocket.svg
|
||||
static/themes/default/icons/shield.svg
|
||||
static/themes/default/icons/signal.svg
|
||||
static/themes/default/icons/smile-o.svg
|
||||
static/themes/default/icons/spinner.svg
|
||||
static/themes/default/icons/star.svg
|
||||
static/themes/default/icons/sun.svg
|
||||
static/themes/default/icons/tags.svg
|
||||
static/themes/default/icons/tag.svg
|
||||
static/themes/default/icons/terminal.svg
|
||||
static/themes/default/icons/th.svg
|
||||
static/themes/default/icons/times.svg
|
||||
static/themes/default/icons/trash-o.svg
|
||||
static/themes/default/icons/trash.svg
|
||||
static/themes/default/icons/upload.svg
|
||||
static/themes/default/icons/user.svg
|
||||
static/themes/default/icons/users.svg
|
||||
static/themes/default/icons/wifi.svg
|
||||
static/themes/default/icons/windows.svg
|
||||
static/themes/default/icons/wrench.svg
|
||||
Copyright: 2018, Fork Awesome
|
||||
Comment: https://github.com/ForkAwesome/Fork-Awesome/tree/master/src/icons/svg/
|
||||
Files: static/themes/default/lato/*
|
||||
Copyright: (c) 2010-2014, Łukasz Dziedzic
|
||||
License: OFL-1.1
|
||||
|
||||
Files: static/themes/default/icons/fedora.svg
|
||||
static/themes/default/icons/homebrew.svg
|
||||
Copyright: 2026, Simple Icons
|
||||
Comment: https://github.com/simple-icons/simple-icons/
|
||||
License: CC0-1.0
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2013 Tzafrir Cohen
|
||||
2013-2026 FreedomBox Authors
|
||||
2013-2024 FreedomBox Authors
|
||||
License: GPL-2+
|
||||
|
||||
License: AGPL-3+
|
||||
@ -2875,6 +2817,90 @@ License: MPL-2.0
|
||||
On Debian systems, the complete text of the Mozilla Public License, v. 2.0 can
|
||||
be found in "/usr/share/common-licenses/MPL-2.0".
|
||||
|
||||
License: OFL-1.1
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font creation
|
||||
efforts of academic and linguistic communities, and to provide a free and
|
||||
open framework in which fonts may be shared and improved in partnership
|
||||
with others.
|
||||
.
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply
|
||||
to any document created using the fonts or their derivatives.
|
||||
.
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
.
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
.
|
||||
"Original Version" refers to the collection of Font Software components as
|
||||
distributed by the Copyright Holder(s).
|
||||
.
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting -- in part or in whole -- any of the components of the
|
||||
Original Version, by changing formats or by porting the Font Software to a
|
||||
new environment.
|
||||
.
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
.
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
.
|
||||
1) Neither the Font Software nor any of its individual components,
|
||||
in Original or Modified Versions, may be sold by itself.
|
||||
.
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
.
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the corresponding
|
||||
Copyright Holder. This restriction only applies to the primary font
|
||||
name as presented to the users.
|
||||
.
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
.
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created
|
||||
using the Font Software.
|
||||
.
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
.
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
License: public-domain
|
||||
This software has been placed into the public domain by its authors.
|
||||
|
||||
@ -2897,94 +2923,3 @@ License: Zlib
|
||||
.
|
||||
3. This notice may not be removed or altered from any source
|
||||
distribution.
|
||||
|
||||
License: OFL-1.1
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
.
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
.
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
.
|
||||
PREAMBLE The goals of the Open Font License (OFL) are to stimulate
|
||||
worldwide development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to provide
|
||||
a free and open framework in which fonts may be shared and improved in
|
||||
partnership with others.
|
||||
.
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves.
|
||||
The fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
.
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such.
|
||||
This may include source files, build scripts and documentation.
|
||||
.
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
.
|
||||
"Original Version" refers to the collection of Font Software components
|
||||
as distributed by the Copyright Holder(s).
|
||||
.
|
||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
||||
or substituting ? in part or in whole ?
|
||||
any of the components of the Original Version, by changing formats or
|
||||
by porting the Font Software to a new environment.
|
||||
.
|
||||
"Author" refers to any designer, engineer, programmer, technical writer
|
||||
or other person who contributed to the Font Software.
|
||||
.
|
||||
PERMISSION & CONDITIONS
|
||||
.
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of the Font Software, to use, study, copy, merge, embed, modify,
|
||||
redistribute, and sell modified and unmodified copies of the Font
|
||||
Software, subject to the following conditions:
|
||||
.
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
.
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
.
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
.
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
.
|
||||
5) The Font Software, modified or unmodified, in part or in whole, must
|
||||
be distributed entirely under this license, and must not be distributed
|
||||
under any other license. The requirement for fonts to remain under
|
||||
this license does not apply to any document created using the Font
|
||||
Software.
|
||||
.
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are not met.
|
||||
.
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
|
||||
DEALINGS IN THE FONT SOFTWARE.
|
||||
|
||||
2
debian/freedombox.links
vendored
2
debian/freedombox.links
vendored
@ -1,2 +0,0 @@
|
||||
usr/bin/freedombox usr/bin/plinth
|
||||
usr/share/man/man1/freedombox.1.gz usr/share/man/man1/plinth.1.gz
|
||||
34
debian/freedombox.lintian-overrides
vendored
34
debian/freedombox.lintian-overrides
vendored
@ -1,25 +1,21 @@
|
||||
# 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.
|
||||
# debconf is used only to display a message, and not to get
|
||||
# configuration.
|
||||
freedombox binary: no-debconf-config
|
||||
|
||||
# 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.
|
||||
freedombox binary: non-standard-apache2-configuration-name *
|
||||
|
||||
# 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.
|
||||
# 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 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/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
|
||||
# convention instead.
|
||||
freedombox: executable-in-usr-lib [usr/lib/freedombox/freedombox-privileged]
|
||||
|
||||
# [Install] section is missing for the privileged daemon service because it is
|
||||
# socket activated.
|
||||
freedombox: systemd-service-file-missing-install-key [usr/lib/systemd/system/freedombox-privileged.service]
|
||||
freedombox: package-contains-documentation-outside-usr-share-doc [usr/lib/python3/dist-packages/plinth-*.dist-info/top_level.txt]
|
||||
|
||||
3
debian/freedombox.manpages
vendored
3
debian/freedombox.manpages
vendored
@ -1,2 +1 @@
|
||||
./doc/freedombox-cmd.1
|
||||
./doc/freedombox.1
|
||||
./doc/plinth.1
|
||||
|
||||
40
debian/freedombox.postinst
vendored
Executable file
40
debian/freedombox.postinst
vendored
Executable file
@ -0,0 +1,40 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
# Source debconf library.
|
||||
. /usr/share/debconf/confmodule
|
||||
|
||||
# Due to a change in sudo, now it runs PAM modules even on password-less
|
||||
# invocations. This leads to plinth not being able to run root privileges. This
|
||||
# is because of our own restrictions in /etc/security/access.conf. Since Plinth
|
||||
# is locked out after upgrade, we need to do this in postinst.
|
||||
sed -i 's+-:ALL EXCEPT root fbx (admin) (sudo):ALL+-:ALL EXCEPT root fbx plinth (admin) (sudo):ALL+' /etc/security/access.conf
|
||||
|
||||
case "$1" in
|
||||
configure)
|
||||
if ! getent group plinth >/dev/null; then
|
||||
addgroup --system --quiet plinth
|
||||
fi
|
||||
|
||||
if ! getent passwd plinth >/dev/null; then
|
||||
adduser --system --quiet --ingroup plinth --no-create-home --home /var/lib/plinth plinth
|
||||
fi
|
||||
|
||||
chown plinth: /var/lib/plinth
|
||||
chown plinth: /var/lib/plinth/sessions
|
||||
|
||||
if [ ! -e '/var/lib/freedombox/is-freedombox-disk-image' ]; then
|
||||
umask 377
|
||||
base64 < /dev/urandom | head -c 16 | sed -e 's+$+\n+' > /var/lib/plinth/firstboot-wizard-secret
|
||||
chown plinth:plinth /var/lib/plinth/firstboot-wizard-secret
|
||||
db_subst plinth/firstboot_wizard_secret secret $(cat /var/lib/plinth/firstboot-wizard-secret)
|
||||
db_input high plinth/firstboot_wizard_secret || true
|
||||
db_go
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
1
debian/freedombox.postrm
vendored
1
debian/freedombox.postrm
vendored
@ -4,6 +4,7 @@ set -e
|
||||
|
||||
case "$1" in
|
||||
purge)
|
||||
deluser --system --quiet plinth || true
|
||||
rm -rf /var/lib/plinth
|
||||
|
||||
# Remove legacy directory too
|
||||
|
||||
43
debian/freedombox.preinst
vendored
Executable file
43
debian/freedombox.preinst
vendored
Executable file
@ -0,0 +1,43 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
case "$1" in
|
||||
upgrade)
|
||||
# Handle removing freedombox-setup-repositories.timer from 20.5.
|
||||
if dpkg --compare-versions "$2" le 20.7; then
|
||||
if [ -x "/usr/bin/deb-systemd-invoke" ]; then
|
||||
deb-systemd-invoke stop freedombox-setup-repositories.timer >/dev/null 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -x "/usr/bin/deb-systemd-helper" ]; then
|
||||
deb-systemd-helper purge freedombox-setup-repositories.timer >/dev/null || true
|
||||
deb-systemd-helper unmask freedombox-setup-repositories.timer >/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -d /run/systemd/system ]; then
|
||||
systemctl daemon-reload
|
||||
fi
|
||||
fi
|
||||
|
||||
# Handle removing freedombox-udiskie.service from 20.9.
|
||||
if dpkg --compare-versions "$2" le 20.9; then
|
||||
if [ -x "/usr/bin/deb-systemd-invoke" ]; then
|
||||
deb-systemd-invoke stop freedombox-udiskie.service >/dev/null 2>/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -x "/usr/bin/deb-systemd-helper" ]; then
|
||||
deb-systemd-helper purge freedombox-udiskie.service >/dev/null || true
|
||||
deb-systemd-helper unmask freedombox-udiskie.service >/dev/null || true
|
||||
fi
|
||||
|
||||
if [ -d /run/systemd/system ]; then
|
||||
systemctl daemon-reload
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
#DEBHELPER#
|
||||
|
||||
exit 0
|
||||
1
debian/freedombox.sysusers
vendored
1
debian/freedombox.sysusers
vendored
@ -1 +0,0 @@
|
||||
u! plinth - "FreedomBox service" /var/lib/plinth
|
||||
9
debian/freedombox.templates
vendored
Normal file
9
debian/freedombox.templates
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
Template: plinth/firstboot_wizard_secret
|
||||
Type: note
|
||||
#flag:translate!:3
|
||||
_Description: FreedomBox first wizard secret - ${secret}
|
||||
Please note down the above secret. You will be asked to enter this in the
|
||||
first screen after you launch the FreedomBox web interface. In case you lose
|
||||
it, you can retrieve it by running the following command:
|
||||
.
|
||||
$ sudo cat /var/lib/plinth/firstboot-wizard-secret
|
||||
2
debian/freedombox.tmpfiles
vendored
2
debian/freedombox.tmpfiles
vendored
@ -1,2 +0,0 @@
|
||||
d /var/lib/plinth 0755 plinth plinth
|
||||
d /var/lib/plinth/sessions 0755 plinth plinth
|
||||
3
debian/gbp.conf
vendored
3
debian/gbp.conf
vendored
@ -1,9 +1,6 @@
|
||||
[DEFAULT]
|
||||
debian-branch = main
|
||||
|
||||
[buildpackage]
|
||||
export-dir = ../build-area/
|
||||
|
||||
[dch]
|
||||
git-log = --no-merges
|
||||
multimaint-merge = True
|
||||
|
||||
1
debian/po/POTFILES.in
vendored
Normal file
1
debian/po/POTFILES.in
vendored
Normal file
@ -0,0 +1 @@
|
||||
[type: gettext/rfc822deb] freedombox.templates
|
||||
36
debian/po/ca.po
vendored
Normal file
36
debian/po/ca.po
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
# Catalan translation of plinth's debconf messages
|
||||
# Copyright © 2024 Free Software Foundation, Inc.
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# poc senderi <pocsenderi@protonmail.com>, 2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth\n"
|
||||
"Report-Msgid-Bugs-To: plinth@packages.debian.org\n"
|
||||
"POT-Creation-Date: 2019-11-18 18:11-0500\n"
|
||||
"PO-Revision-Date: 2024-11-05 22:18+0100\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Last-Translator: poc senderi <pocsenderi@protonmail.com>\n"
|
||||
"Language-Team: Catalan <debian-l10n-catalan@lists.debian.org>\n"
|
||||
"X-Generator: Poedit 2.4.2\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Secret per a l'engegada inicial del «wizard» de FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Anoteu el secret anterior. Us serà demanat a la primera pantalla després "
|
||||
"d'engegar la interfície web del FreedomBox. En cas que el perdeu, el podeu "
|
||||
"recuperar executant la següent ordre:"
|
||||
37
debian/po/de.po
vendored
Normal file
37
debian/po/de.po
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
# Translation of plinth debconf templates to German
|
||||
# Copyright (C) 2019 FreedomBox packaging team <freedombox-pkg-team@lists.alioth.debian.org>
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# Helge Kreutzmann <debian@helgefjell.de>, 2018, 2019.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth 19.21\n"
|
||||
"Report-Msgid-Bugs-To: plinth@packages.debian.org\n"
|
||||
"POT-Creation-Date: 2019-11-18 18:11-0500\n"
|
||||
"PO-Revision-Date: 2019-11-24 06:46+0100\n"
|
||||
"Last-Translator: Helge Kreutzmann <debian@helgefjell.de>\n"
|
||||
"Language-Team: german <debian-l10n-german@lists.debian.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Passphrase des Ersteinrichtungsprogramms der FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Bitte schreiben Sie diese geheime Zeichenkette auf. Sie werden auf dem "
|
||||
"ersten Bildschirm nach dem Start der FreedomBox-Schnittstelle nach dieser "
|
||||
"Zeichenkette gefragt werden. Falls Sie sie verlieren, können Sie sie durch "
|
||||
"Ausführung des folgenden Befehls wiedererlangen:"
|
||||
37
debian/po/es.po
vendored
Normal file
37
debian/po/es.po
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
# Translation of plinth debconf templates to Spanish
|
||||
# Copyright (C) 2019 FreedomBox packaging team <freedombox-pkg-team@lists.alioth.debian.org>
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# Fioddor Superconcentrado <fioddor@gmail.com>, 2019
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth 19.20\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-07-31 16:07+0000\n"
|
||||
"PO-Revision-Date: 2022-08-01 15:13+0200\n"
|
||||
"Last-Translator: Camaleón <noelamac@gmail.com>\n"
|
||||
"Language-Team: Debian L10n Spanish <debian-l10n-spanish@lists.debian.org>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.4.2\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../freedombox.templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Secreto del asistente al primer arranque de FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../freedombox.templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Por favor, anote esta cadena de texto. Se le pedirá en la primera pantalla "
|
||||
"al iniciar la interfaz web de FreedomBox. Si la pierde, podrá recuperarla "
|
||||
"ejecutando la siguiente orden:"
|
||||
42
debian/po/fr.po
vendored
Normal file
42
debian/po/fr.po
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
# Translation of plinth debconf templates to French
|
||||
# Copyright (C) 2018 FreedomBox packaging team <freedombox-pkg-team@lists.alioth.debian.org>
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
#
|
||||
# Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>, 2018, 2019.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth\n"
|
||||
"Report-Msgid-Bugs-To: plinth@packages.debian.org\n"
|
||||
"POT-Creation-Date: 2019-11-18 18:11-0500\n"
|
||||
"PO-Revision-Date: 2019-12-16 10:23+0100\n"
|
||||
"Last-Translator: Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>\n"
|
||||
"Language-Team: French <debian-l10n-french@lists.debian.org>\n"
|
||||
"Language: fr_FR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
|
||||
"X-Generator: Lokalize 2.0\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Phrase secrète du premier assistant de FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
#| msgid ""
|
||||
#| "Please save this string. You will be asked to enter this in the first "
|
||||
#| "screen after you launch the FreedomBox interface. In case you lose it, "
|
||||
#| "you can find it in the file /var/lib/plinth/firstboot-wizard-secret."
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Veuillez noter cette phrase secrète. Le premier écran après le chargement de "
|
||||
"l'interface web de FreedomBox vous la demandera. Si vous l'avez oubliée, vous "
|
||||
"pourrez la récupérer en exécutant la commande suivante :"
|
||||
|
||||
35
debian/po/it.po
vendored
Normal file
35
debian/po/it.po
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
# freedombox po-debconf italian translation
|
||||
# Copyright (C) 2022 freedombox's copyright holder
|
||||
# This file is distributed under the same license as the freedombox package.
|
||||
# Ceppo <ceppo@oziosi.org>, 2022.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: freedombox\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-08-18 16:09+0000\n"
|
||||
"PO-Revision-Date: 2022-08-25 00:00+0000\n"
|
||||
"Last-Translator: Ceppo <ceppo@oziosi.org>\n"
|
||||
"Language-Team: Italian <debian-l10n-italian@lists.debian.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../freedombox.templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Codice del primo wizard di FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../freedombox.templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Annotare il codice indicato sopra. Sarà richiesto di inserirlo nella prima "
|
||||
"schermata dopo l'avvio dell'interfaccia web di FreedomBox. Qualora venisse "
|
||||
"perso, sarebbe possibile recuperarlo eseguendo il comando seguente:"
|
||||
39
debian/po/nl.po
vendored
Normal file
39
debian/po/nl.po
vendored
Normal file
@ -0,0 +1,39 @@
|
||||
# Dutch translation of plinth debconf templates.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
# Frans Spiesschaert <Frans.Spiesschaert@yucom.be>, 2018.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth_19.21\n"
|
||||
"Report-Msgid-Bugs-To: plinth@packages.debian.org\n"
|
||||
"POT-Creation-Date: 2019-11-18 18:11-0500\n"
|
||||
"PO-Revision-Date: 2019-12-02 21:04+0100\n"
|
||||
"Last-Translator: Frans Spiesschaert <Frans.Spiesschaert@yucom.be>\n"
|
||||
"Language-Team: Debian Dutch l10n Team <debian-l10n-dutch@lists.debian.org>\n"
|
||||
"Language: nl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 2.2.1\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Geheime code voor de initiële wizard van FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Noteer bovenstaande geheime code. Er zal u gevraagd worden om ze in het "
|
||||
"openingsscherm in te voeren wanneer u de FreedomBox-interface opstart. In "
|
||||
"geval u ze kwijtraakt, kunt u ze terughalen door het volgende commando uit "
|
||||
"te voeren:"
|
||||
40
debian/po/pt.po
vendored
Normal file
40
debian/po/pt.po
vendored
Normal file
@ -0,0 +1,40 @@
|
||||
# Translation of plinth debconf templates to Portuguese
|
||||
# Copyright (C) 2019 FreedomBox packaging team <freedombox-pkg-team@lists.alioth.debian.org>
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# Rui Branco - DebianPT <ruipb@debianpt.org>, 2018.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth 0.37.0\n"
|
||||
"Report-Msgid-Bugs-To: plinth@packages.debian.org\n"
|
||||
"POT-Creation-Date: 2019-11-18 18:11-0500\n"
|
||||
"PO-Revision-Date: 2018-09-27 15:33+0100\n"
|
||||
"Last-Translator: Rui Branco - DebianPT <ruipb@debianpt.org>\n"
|
||||
"Language-Team: Portuguese <traduz@debianpt.org>\n"
|
||||
"Language: pt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Primeiro segredo FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
#, fuzzy
|
||||
#| msgid ""
|
||||
#| "Please save this string. You will be asked to enter this in the first "
|
||||
#| "screen after you launch the FreedomBox interface. In case you lose it, "
|
||||
#| "you can find it in the file /var/lib/plinth/firstboot-wizard-secret."
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Por favor guarde esta 'string'. Ser-lhe-á pedido para a introduzir na "
|
||||
"primeira tela assim que lance a interface FreedomBox. No caso de a perder, "
|
||||
"poderá encontrá-la no ficheiro /var/lib/plinth/firstboot-wizard-secret."
|
||||
36
debian/po/pt_BR.po
vendored
Normal file
36
debian/po/pt_BR.po
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
# Debconf translations for plinth.
|
||||
# Copyright (C) 2020 THE plinth'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# Adriano Rafael Gomes <adrianorg@debian.org>, 2020.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth 20.11\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-06-24 18:00+0000\n"
|
||||
"PO-Revision-Date: 2020-06-24 20:14-0300\n"
|
||||
"Last-Translator: Adriano Rafael Gomes <adrianorg@debian.org>\n"
|
||||
"Language-Team: Brazilian Portuguese <debian-l10n-portuguese@lists.debian."
|
||||
"org>\n"
|
||||
"Language: pt_BR\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../freedombox.templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Segredo do primeiro assistente do FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../freedombox.templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Por favor, anote o segredo acima. Você deverá informá-lo na primeira tela "
|
||||
"depois de iniciar a interface web do FreedomBox. Caso você o perca, você "
|
||||
"poderá recuperá-lo executando o seguinte comando:"
|
||||
38
debian/po/ru.po
vendored
Normal file
38
debian/po/ru.po
vendored
Normal file
@ -0,0 +1,38 @@
|
||||
# Russian translation of plinth debconf template.
|
||||
# Copyright (C) 2019 FreedomBox packaging team <freedombox-pkg-team@lists.alioth.debian.org>
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# Lev Lamberov <dogsleg@debian.org>, 2020.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth\n"
|
||||
"Report-Msgid-Bugs-To: plinth@packages.debian.org\n"
|
||||
"POT-Creation-Date: 2019-11-18 18:11-0500\n"
|
||||
"PO-Revision-Date: 2020-02-10 10:17+0500\n"
|
||||
"Last-Translator: Lev Lamberov <dogsleg@debian.org>\n"
|
||||
"Language-Team: Debian L10n Russian <debian-l10n-russian@lists.debian.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.2.4\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Секретная строка мастера настройки FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Запишите эту секретную строку. Вам будет необходимо ввести её на самом "
|
||||
"первом экране после запуска веб-интерфейса FreedomBox. Если вы потеряете эту "
|
||||
"строку, то вы сможете получить её, выполнив следующую команду:"
|
||||
37
debian/po/sq.po
vendored
Normal file
37
debian/po/sq.po
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth\n"
|
||||
"Report-Msgid-Bugs-To: plinth@packages.debian.org\n"
|
||||
"POT-Creation-Date: 2019-11-18 18:11-0500\n"
|
||||
"PO-Revision-Date: 2021-04-14 11:43+0300\n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 2.4.2\n"
|
||||
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"Language: sq\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "E fshehtë për skenën e parë të ndihmësit FreedomBox - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Ju lutemi, mbajeni shënim të fshehtën më sipër. Do t’ju kërkohet ta jepni "
|
||||
"këtë në skenën e parë pasi të vini në punë ndërfaqen web të FreedomBox-it. "
|
||||
"Po e humbët, mund ta rimerrni duke xhiruar urdhrin vijues:"
|
||||
35
debian/po/sv.po
vendored
Normal file
35
debian/po/sv.po
vendored
Normal file
@ -0,0 +1,35 @@
|
||||
# Translation of freedombox 23.13 debconf to Swedish.
|
||||
# Copyright (C) 2011-2023 FreedomBox Authors
|
||||
# This file is distributed under the same license as the freedombox package.
|
||||
# Peter Kvillegård <quat@sdfeu.org>, 2023
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: freedombox 23.13\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-07-21 16:31+0000\n"
|
||||
"PO-Revision-Date: 2023-07-22 15:55+0200\n"
|
||||
"Last-Translator: Peter Kvillegård <quat@sdfeu.org>\n"
|
||||
"Language-Team: Swedish <debian-l10n-swedish@lists.debian.org>\n"
|
||||
"Language: sv\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../freedombox.templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr "Hemlighet för FreedomBox första guidade installerare - ${secret}"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../freedombox.templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
"Skriv ner ovanstående hemlighet. Du kommer att bli ombedd att ange den i "
|
||||
"den första skärmen efter att du startat FreedomBox webbgränssnitt. Om du "
|
||||
"tappar bort den kan den hämtas igen genom att köra följande kommando:"
|
||||
33
debian/po/templates.pot
vendored
Normal file
33
debian/po/templates.pot
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the plinth package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: plinth\n"
|
||||
"Report-Msgid-Bugs-To: plinth@packages.debian.org\n"
|
||||
"POT-Creation-Date: 2019-11-18 18:11-0500\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid "FreedomBox first wizard secret - ${secret}"
|
||||
msgstr ""
|
||||
|
||||
#. Type: note
|
||||
#. Description
|
||||
#: ../templates:1001
|
||||
msgid ""
|
||||
"Please note down the above secret. You will be asked to enter this in the "
|
||||
"first screen after you launch the FreedomBox web interface. In case you lose "
|
||||
"it, you can retrieve it by running the following command:"
|
||||
msgstr ""
|
||||
18
debian/rules
vendored
18
debian/rules
vendored
@ -1,7 +1,5 @@
|
||||
#!/usr/bin/make -f
|
||||
|
||||
include /usr/share/dpkg/pkg-info.mk
|
||||
|
||||
export DH_VERBOSE=1
|
||||
export PYBUILD_DESTDIR=debian/tmp
|
||||
export PYBUILD_SYSTEM=custom
|
||||
@ -11,8 +9,6 @@ export PYBUILD_INSTALL_ARGS=make PYTHON={interpreter} DESTDIR={destdir} install
|
||||
export PYBUILD_CLEAN_ARGS=make clean
|
||||
export PYBUILD_TEST_ARGS=make PYTHON={interpreter} check-tests
|
||||
|
||||
FBX_VERSION := $(shell ./run --develop --version | awk 'NF{ print $$NF }')
|
||||
|
||||
%:
|
||||
dh $@ --with python3 --buildsystem=pybuild
|
||||
|
||||
@ -23,12 +19,10 @@ override_dh_auto_install-indep:
|
||||
# Ensure the list of dependencies is not empty.
|
||||
test -s debian/freedombox.substvars || exit 1
|
||||
|
||||
# Check that FreedomBox version number is matching.
|
||||
ifneq ($(FBX_VERSION),$(DEB_VERSION))
|
||||
>&2 echo "WARNING: FreedomBox version $(FBX_VERSION) does not match package version $(DEB_VERSION)."
|
||||
endif
|
||||
|
||||
override_dh_installsystemd:
|
||||
# Do not enable or start any service other than FreedomBox service.
|
||||
dh_installsystemd --package=freedombox plinth.service \
|
||||
freedombox-privileged.socket
|
||||
# Do not enable or start any service other than FreedomBox service. Use
|
||||
# of --tmpdir is a hack to workaround an issue with dh_installsystemd
|
||||
# (as of debhelper 13.5.2) that still has hardcoded search path of
|
||||
# /lib/systemd/system for searching systemd services. See #987989 and
|
||||
# reversion of its changes.
|
||||
dh_installsystemd --tmpdir=debian/tmp/usr --package=freedombox plinth.service
|
||||
|
||||
3
debian/source/lintian-overrides
vendored
3
debian/source/lintian-overrides
vendored
@ -5,4 +5,7 @@
|
||||
very-long-line-length-in-source-file * [doc/manual/*.raw.wiki:*]
|
||||
|
||||
# Misc. files which can't be fixed to have short line lengths.
|
||||
very-long-line-length-in-source-file * [plinth/modules/deluge/tests/data/sample.torrent:*]
|
||||
very-long-line-length-in-source-file * [plinth/modules/transmission/tests/data/sample.torrent:*]
|
||||
very-long-line-length-in-source-file * [doc/visual_design/FreedomBox-Logo.7z:*]
|
||||
very-long-line-length-in-source-file * [COPYING.md:*]
|
||||
|
||||
38
debian/tests/access-web-interface
vendored
38
debian/tests/access-web-interface
vendored
@ -1,38 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
# Wait for FreedomBox first-boot setup to complete and the web server to
|
||||
# start listening. App setup order is not deterministic, so a fixed sleep can
|
||||
# expire before the apache app configures port 443. Poll instead of guessing.
|
||||
echo "Waiting for first-boot setup to complete..."
|
||||
|
||||
SETUP_COMPLETE=0
|
||||
|
||||
for _ in $(seq 1 120); do
|
||||
if curl --fail --insecure --silent --output /tmp/fbx_status.json \
|
||||
https://localhost/freedombox/status/; then
|
||||
|
||||
if grep -q '"is_first_setup_running"[[:space:]]*:[[:space:]]*false' /tmp/fbx_status.json; then
|
||||
SETUP_COMPLETE=1
|
||||
break
|
||||
fi
|
||||
fi
|
||||
sleep 2
|
||||
done
|
||||
|
||||
# Print final status in test log
|
||||
cat /tmp/fbx_status.json || true
|
||||
|
||||
rm -f /tmp/fbx_status.json
|
||||
|
||||
journalctl --unit=plinth --unit=freedombox-privileged
|
||||
|
||||
# Access FreedomBox interface
|
||||
curl --location --cookie "" --fail --write-out "%{response_code}" --insecure \
|
||||
--stderr - https://localhost/freedombox/
|
||||
|
||||
if [ "$SETUP_COMPLETE" -eq 0 ]; then
|
||||
echo "Error: first-boot setup did not complete in the allotted time." >&2
|
||||
exit 1
|
||||
fi
|
||||
16
debian/tests/control
vendored
16
debian/tests/control
vendored
@ -1,5 +1,5 @@
|
||||
#
|
||||
# Smoke test to check various basics on an installed version of FreedomBox. This
|
||||
# Smoke test to check various basics on an installed version of Plinth. This
|
||||
# checks that the following aspects are working okay:
|
||||
# - Python runtime
|
||||
# - Python library dependencies
|
||||
@ -13,16 +13,6 @@ 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=freedombox --cov-report=html:debci/htmlcov --cov-report=term
|
||||
Depends: e2fsprogs, git, python3-pytest, python3-pytest-cov, python3-pytest-django, @
|
||||
Test-Command: PYTHONPATH='/usr/lib/python3/dist-packages/' py.test-3 -p no:cacheprovider --cov=plinth --cov-report=html:debci/htmlcov --cov-report=term
|
||||
Depends: e2fsprogs, git, python3-pytest, python3-pytest-cov, python3-pytest-django, python3-tomli, @
|
||||
Restrictions: breaks-testbed
|
||||
|
||||
#
|
||||
# Try to access the FreedomBox web interface.
|
||||
#
|
||||
# iptables package installs alternatives files, with iptables-nft as default alternative.
|
||||
# Without it, firewalld has this error: INVALID_IPV: 'ipv4' is not a valid backend or is unavailable
|
||||
#
|
||||
Tests: access-web-interface
|
||||
Depends: iptables, @
|
||||
Restrictions: needs-root, isolation-machine, breaks-testbed
|
||||
|
||||
23
doc/Makefile
23
doc/Makefile
@ -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) freedombox.1 freedombox-cmd.1
|
||||
OUTPUTS=$(manual-pdfs) plinth.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 freedombox.1
|
||||
install $(INSTALL_OPTS) -t $(MAN_INSTALL_DIR)/man1 plinth.1
|
||||
for file in $(manual-pages-part-html) $(manual-pdfs); do \
|
||||
install $(INSTALL_OPTS) -t $(INSTALL_DIR)/$$(dirname $${file}) \
|
||||
$${file} ; \
|
||||
@ -109,25 +109,20 @@ manual-pages-xml:=$(patsubst %.raw.wiki, %.xml, $(manual-pages-raw-wiki))
|
||||
manual-pages: $(manual-pages-part-html)
|
||||
|
||||
$(manual-pdfs): %.pdf: %.xml
|
||||
@echo "[PDF] $<"
|
||||
@xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf -o $(dir $@) $< 2> /dev/null
|
||||
xmlto $(XMLTO_DEBUG_FLAGS) --with-dblatex pdf -o $(dir $@) $<
|
||||
|
||||
$(manual-pages-part-html): %.part.html: %.xml
|
||||
@echo "[XSLT] $<"
|
||||
@xsltproc /usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml5/docbook.xsl $< 2> /dev/null | \
|
||||
xsltproc /usr/share/xml/docbook/stylesheet/docbook-xsl/xhtml5/docbook.xsl $< | \
|
||||
perl -pe 'BEGIN {undef $$/} s/.*<body[^>]*>(.*)<\/body\s*>.*/$$1/si' > $@
|
||||
@rm -f docbook.css
|
||||
@rm -f $(dir $@)docbook.css
|
||||
|
||||
$(manual-xmls) $(manual-pages-xml): %.xml: %.raw.wiki $(SCRIPTS_DIR)/wikiparser.py
|
||||
@echo "[WIKIPARSE] $<"
|
||||
@$(SCRIPTS_DIR)/wikiparser.py $< | xmllint --format - > $@
|
||||
$(SCRIPTS_DIR)/wikiparser.py $< | xmllint --format - > $@
|
||||
|
||||
%.1: %.xml
|
||||
@echo "[MAN] $<"
|
||||
@xmlto man $< 2> /dev/null
|
||||
xmlto man $<
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@echo "[RM] {part-htmls} {xmls} {manuals} {outputs}"
|
||||
@rm -f $(manual-pages-part-html) $(manual-pages-xml) $(manual-xmls)
|
||||
@rm -f $(OUTPUTS)
|
||||
rm -f $(manual-pages-part-html) $(manual-pages-xml) $(manual-xmls)
|
||||
rm -f $(OUTPUTS)
|
||||
|
||||
@ -19,7 +19,6 @@ Install the following Debian packages:
|
||||
|
||||
* python3-sphinx
|
||||
* python3-sphinx-autobuild
|
||||
* python3-sphinx-book-theme
|
||||
* python3-django
|
||||
* python3-django-axes
|
||||
* python3-django-captcha
|
||||
|
||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 14 KiB |
15
doc/dev/_templates/layout.html
Normal file
15
doc/dev/_templates/layout.html
Normal file
@ -0,0 +1,15 @@
|
||||
{%- extends "alabaster/layout.html" %}
|
||||
|
||||
{%- block footer %}
|
||||
<div class="footer">
|
||||
{% if show_copyright %}©{{ copyright }} | {% endif %}
|
||||
Licensed under the <a href="https://creativecommons.org/licenses/by-sa/4.0/">
|
||||
CC BY-SA 4.0</a> license
|
||||
{%- if show_source and has_source and sourcename %}
|
||||
{% if show_copyright or theme_show_powered_by %}|{% endif %}
|
||||
<a href="{{ pathto('_sources/' + sourcename, true)|e }}"
|
||||
rel="nofollow">{{ _('Page source') }}</a>
|
||||
{%- endif %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@ -15,19 +15,18 @@ list see the documentation: http://www.sphinx-doc.org/en/master/config
|
||||
#
|
||||
import os
|
||||
import sys
|
||||
from datetime import datetime
|
||||
|
||||
import django
|
||||
|
||||
sys.path.insert(0, os.path.abspath('../../'))
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'freedombox.settings'
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'plinth.settings'
|
||||
django.setup()
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
|
||||
# pylint: disable=invalid-name
|
||||
project = 'FreedomBox'
|
||||
copyright = f'2021-{datetime.now().year}'
|
||||
copyright = '2021-2024, FreedomBox Authors'
|
||||
author = 'FreedomBox Authors'
|
||||
|
||||
# The short X.Y version
|
||||
@ -83,23 +82,15 @@ pygments_style = None
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
#
|
||||
html_theme = 'sphinx_book_theme'
|
||||
html_theme = 'alabaster'
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
# documentation.
|
||||
#
|
||||
html_theme_options = {
|
||||
'home_page_in_toc': True,
|
||||
'repository_provider': 'gitlab',
|
||||
'repository_url': 'https://salsa.debian.org/freedombox-team/freedombox/',
|
||||
'use_edit_page_button': True,
|
||||
'use_source_button': True,
|
||||
'use_repository_button': True,
|
||||
'use_issues_button': True,
|
||||
'path_to_docs': 'doc/dev/',
|
||||
'extra_footer': 'Licensed under the <a href="https://creativecommons.org/'
|
||||
'licenses/by-sa/4.0/">CC BY-SA 4.0</a> license.',
|
||||
'fixed_sidebar': True,
|
||||
'show_related': True,
|
||||
}
|
||||
|
||||
# Add any paths that contain custom static files (such as style sheets) here,
|
||||
@ -230,4 +221,3 @@ autodoc_mock_imports = [
|
||||
]
|
||||
|
||||
html_favicon = './_static/favicon.ico'
|
||||
html_logo = './_static/logo.svg'
|
||||
|
||||
@ -6,5 +6,5 @@ Action Utils
|
||||
Several utilities to help with the implementation of actions and diagnostic
|
||||
tests are implemented in this module.
|
||||
|
||||
.. automodule:: freedombox.action_utils
|
||||
.. automodule:: plinth.action_utils
|
||||
:members:
|
||||
|
||||
@ -1,14 +1,16 @@
|
||||
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
|
||||
Privileged Actions
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
Actions
|
||||
^^^^^^^
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
The following documentation for the ``actions`` module which contains function
|
||||
decorators to mark a method to run with privileged permissions.
|
||||
The following documentation for the ``actions`` module.
|
||||
|
||||
.. automodule:: freedombox.actions
|
||||
.. automodule:: plinth.actions
|
||||
:members: privileged
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
App
|
||||
---
|
||||
|
||||
.. autoclass:: freedombox.app.App
|
||||
.. autoclass:: plinth.app.App
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Backups
|
||||
^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.modules.backups.components.BackupRestore
|
||||
.. autoclass:: plinth.modules.backups.components.BackupRestore
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Configuration
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.config.DropinConfigs
|
||||
.. autoclass:: plinth.config.DropinConfigs
|
||||
:members:
|
||||
|
||||
@ -1,7 +0,0 @@
|
||||
.. SPDX-License-Identifier: CC-BY-SA-4.0
|
||||
|
||||
Container
|
||||
^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.container.Container
|
||||
:members:
|
||||
@ -3,8 +3,8 @@
|
||||
Coturn
|
||||
^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.modules.coturn.components.TurnConsumer
|
||||
.. autoclass:: plinth.modules.coturn.components.TurnConsumer
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.modules.coturn.components.TurnConfiguration
|
||||
.. autoclass:: plinth.modules.coturn.components.TurnConfiguration
|
||||
:members:
|
||||
|
||||
@ -3,11 +3,11 @@
|
||||
Daemon
|
||||
^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.daemon.Daemon
|
||||
.. autoclass:: plinth.daemon.Daemon
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.daemon.RelatedDaemon
|
||||
.. autoclass:: plinth.daemon.RelatedDaemon
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.daemon.SharedDaemon
|
||||
.. autoclass:: plinth.daemon.SharedDaemon
|
||||
:members:
|
||||
|
||||
@ -3,8 +3,8 @@
|
||||
Domain Name
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.modules.names.components.DomainName
|
||||
.. autoclass:: plinth.modules.names.components.DomainName
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.modules.names.components.DomainType
|
||||
.. autoclass:: plinth.modules.names.components.DomainType
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
EnableState
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.app.EnableState
|
||||
.. autoclass:: plinth.app.EnableState
|
||||
:members:
|
||||
|
||||
@ -3,8 +3,8 @@
|
||||
Firewall
|
||||
^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.modules.firewall.components.Firewall
|
||||
.. autoclass:: plinth.modules.firewall.components.Firewall
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.modules.firewall.components.FirewallLocalProtection
|
||||
.. autoclass:: plinth.modules.firewall.components.FirewallLocalProtection
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Frontpage
|
||||
^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.frontpage.Shortcut
|
||||
.. autoclass:: plinth.frontpage.Shortcut
|
||||
:members:
|
||||
|
||||
@ -22,25 +22,24 @@ Components
|
||||
staticfiles
|
||||
backups
|
||||
coturn
|
||||
container
|
||||
|
||||
Base Classes
|
||||
^^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.app.Component
|
||||
.. autoclass:: plinth.app.Component
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.app.LeaderComponent
|
||||
.. autoclass:: plinth.app.LeaderComponent
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.app.FollowerComponent
|
||||
.. autoclass:: plinth.app.FollowerComponent
|
||||
:members:
|
||||
|
||||
Other Classes
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.diagnostic_check.DiagnosticCheck
|
||||
.. autoclass:: plinth.diagnostic_check.DiagnosticCheck
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.diagnostic_check.Result
|
||||
.. autoclass:: plinth.diagnostic_check.Result
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Info
|
||||
^^^^
|
||||
|
||||
.. autoclass:: freedombox.app.Info
|
||||
.. autoclass:: plinth.app.Info
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Let's Encrypt
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.modules.letsencrypt.components.LetsEncrypt
|
||||
.. autoclass:: plinth.modules.letsencrypt.components.LetsEncrypt
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Menu
|
||||
^^^^
|
||||
|
||||
.. autoclass:: freedombox.menu.Menu
|
||||
.. autoclass:: plinth.menu.Menu
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Packages
|
||||
^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.package.Packages
|
||||
.. autoclass:: plinth.package.Packages
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
StaticFiles
|
||||
^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.web_server.StaticFiles
|
||||
.. autoclass:: plinth.web_server.StaticFiles
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Users
|
||||
^^^^^
|
||||
|
||||
.. autoclass:: freedombox.modules.users.components.UsersAndGroups
|
||||
.. autoclass:: plinth.modules.users.components.UsersAndGroups
|
||||
:members:
|
||||
|
||||
@ -3,8 +3,8 @@
|
||||
Webserver
|
||||
^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.modules.apache.components.Webserver
|
||||
.. autoclass:: plinth.modules.apache.components.Webserver
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.modules.apache.components.WebserverRoot
|
||||
.. autoclass:: plinth.modules.apache.components.Uwsgi
|
||||
:members:
|
||||
|
||||
@ -3,8 +3,8 @@
|
||||
Forms
|
||||
-----
|
||||
|
||||
.. autoclass:: freedombox.forms.DomainSelectionForm
|
||||
.. autoclass:: plinth.forms.DomainSelectionForm
|
||||
:members:
|
||||
|
||||
.. autoclass:: freedombox.forms.CheckboxSelectMultipleWithReadOnly
|
||||
.. autoclass:: plinth.forms.CheckboxSelectMultipleWithReadOnly
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Notification
|
||||
^^^^^^^^^^^^
|
||||
|
||||
.. autoclass:: freedombox.notification.Notification
|
||||
.. autoclass:: plinth.notification.Notification
|
||||
:members:
|
||||
|
||||
@ -3,5 +3,5 @@
|
||||
Views
|
||||
-----
|
||||
|
||||
.. autoclass:: freedombox.views.AppView
|
||||
.. autoclass:: plinth.views.AppView
|
||||
:members:
|
||||
|
||||
@ -6,56 +6,56 @@ Full Code
|
||||
Transmission app is already included in FreedomBox. Here is the full source for
|
||||
the module for reference.
|
||||
|
||||
freedombox/modules/transmission/__init__.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: ../../../freedombox/modules/transmission/__init__.py
|
||||
:language: python3
|
||||
|
||||
freedombox/modules/transmission/forms.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: ../../../freedombox/modules/transmission/forms.py
|
||||
:language: python3
|
||||
|
||||
freedombox/modules/transmission/manifest.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: ../../../freedombox/modules/transmission/manifest.py
|
||||
:language: python3
|
||||
|
||||
freedombox/modules/transmission/privileged.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: ../../../freedombox/modules/transmission/privileged.py
|
||||
:language: python3
|
||||
|
||||
freedombox/modules/transmission/urls.py
|
||||
plinth/modules/transmission/__init__.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: ../../../freedombox/modules/transmission/urls.py
|
||||
.. literalinclude:: ../../../plinth/modules/transmission/__init__.py
|
||||
:language: python3
|
||||
|
||||
freedombox/modules/transmission/views.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
plinth/modules/transmission/forms.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: ../../../freedombox/modules/transmission/views.py
|
||||
.. literalinclude:: ../../../plinth/modules/transmission/forms.py
|
||||
:language: python3
|
||||
|
||||
freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
plinth/modules/transmission/manifest.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: ../../../freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission
|
||||
.. literalinclude:: ../../../plinth/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
|
||||
|
||||
freedombox/modules/transmission/data/usr/share/freedombox/etc/apache2/conf-available/transmission-plinth.conf
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
plinth/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
|
||||
.. literalinclude:: ../../../plinth/modules/transmission/data/usr/share/freedombox/etc/apache2/conf-available/transmission-plinth.conf
|
||||
:language: apache
|
||||
|
||||
freedombox/modules/transmission/tests/__init__.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
plinth/modules/transmission/tests/__init__.py
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. literalinclude:: ../../../freedombox/modules/transmission/tests/__init__.py
|
||||
.. literalinclude:: ../../../plinth/modules/transmission/tests/__init__.py
|
||||
:language: python3
|
||||
|
||||
@ -3,11 +3,11 @@
|
||||
Part 4: Components
|
||||
------------------
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
Providing basic information about the app
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@ -20,7 +20,7 @@ function normally.
|
||||
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from freedombox import app as app_module
|
||||
from plinth 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:`~freedombox.app.Info` class documentation.
|
||||
available in :class:`~plinth.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:`~freedombox.daemon.Daemon` component is added to the app. Let us do that
|
||||
in our app's class.
|
||||
:class:`~plinth.daemon.Daemon` component is added to the app. Let us do that in
|
||||
our app's class.
|
||||
|
||||
.. code-block:: python3
|
||||
:caption: ``__init__.py``
|
||||
|
||||
from freedombox.daemon import Daemon
|
||||
from plinth.daemon import Daemon
|
||||
|
||||
class TransmissionApp(app_module.App):
|
||||
...
|
||||
@ -101,8 +101,8 @@ in our app's class.
|
||||
self.add(daemon)
|
||||
|
||||
|
||||
The first argument to instantiate the :class:`~freedombox.daemon.Daemon` class
|
||||
is a unique ID. The second is the name of the `systemd
|
||||
The first argument to instantiate the :class:`~plinth.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:`~freedombox.package.Packages` component which takes care of installing,
|
||||
:class:`~plinth.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 freedombox.package import Packages
|
||||
from plinth.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:`~freedombox.modules.apache.components.Webserver` component is added to
|
||||
the app. Let us do that in our app's class.
|
||||
:class:`~plinth.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 freedombox.modules.apache.components import Webserver
|
||||
from plinth.modules.apache.components import Webserver
|
||||
|
||||
class TransmissionApp(app_module.App):
|
||||
...
|
||||
@ -165,13 +165,13 @@ the app. Let us do that in our app's class.
|
||||
self.add(webserver)
|
||||
|
||||
The first argument to instantiate the
|
||||
: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.
|
||||
: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.
|
||||
|
||||
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:`~freedombox.config.DropinConfigs` component. Let us add it in our app's
|
||||
:class:`~plinth.config.DropinConfigs` component. Let us add it in our app's
|
||||
class.
|
||||
|
||||
.. code-block:: python3
|
||||
:caption: ``__init__.py``
|
||||
|
||||
from freedombox.config import DropinConfigs
|
||||
from plinth.config import DropinConfigs
|
||||
|
||||
class TransmissionApp(app_module.App):
|
||||
...
|
||||
@ -200,9 +200,9 @@ class.
|
||||
])
|
||||
self.add(dropin_configs)
|
||||
|
||||
The first argument to instantiate the :class:`~freedombox.config.DropinConfigs`
|
||||
The first argument to instantiate the :class:`~plinth.config.DropinConfigs`
|
||||
class is the unique ID. The second argument is the list of configuration files
|
||||
as paths is ``/etc/``. The :class:`~freedombox.config.DropinConfigs` component
|
||||
as paths is ``/etc/``. The :class:`~plinth.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:`~freedombox.modules.firewall.components.Firewall` component during app
|
||||
:class:`~plinth.modules.firewall.components.Firewall` component during app
|
||||
initialization.
|
||||
|
||||
.. code-block:: python3
|
||||
:caption: ``__init__.py``
|
||||
|
||||
from freedombox.modules.firewall.components import Firewall
|
||||
from plinth.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 freedombox.modules.users.components import UsersAndGroups
|
||||
from plinth.modules.users.components import UsersAndGroups
|
||||
|
||||
class TransmissionApp(app_module.App):
|
||||
...
|
||||
@ -291,8 +291,10 @@ file ``transmission-plinth.conf``, add the following.
|
||||
|
||||
<Location /transmission>
|
||||
...
|
||||
Use AuthOpenIDConnect
|
||||
Use RequireGroup bit-torrent
|
||||
Include includes/freedombox-single-sign-on.conf
|
||||
<IfModule mod_auth_pubtkt.c>
|
||||
TKTAuthToken "admin" "bit-torrent"
|
||||
</IfModule>
|
||||
</Location>
|
||||
|
||||
Showing a shortcut in the front page
|
||||
@ -303,12 +305,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:`~freedombox.frontpage.Shortcut` component can added to the app.
|
||||
:class:`~plinth.frontpage.Shortcut` component can added to the app.
|
||||
|
||||
.. code-block:: python3
|
||||
:caption: ``__init__.py``
|
||||
|
||||
from freedombox import frontpage
|
||||
from plinth import frontpage
|
||||
|
||||
group = ('bit-torrent', 'Download files using BitTorrent applications')
|
||||
|
||||
@ -344,15 +346,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:`~freedombox.modules.backups.components.BackupRestore` component during
|
||||
app initialization.
|
||||
:class:`~plinth.modules.backups.components.BackupRestore` component during app
|
||||
initialization.
|
||||
|
||||
In ``__init__.py``, add:
|
||||
|
||||
.. code-block:: python3
|
||||
:caption: ``__init__.py``
|
||||
|
||||
from freedombox.modules.backups.components import BackupRestore
|
||||
from plinth.modules.backups.components import BackupRestore
|
||||
|
||||
from . import manifest
|
||||
|
||||
|
||||
@ -101,7 +101,7 @@ the user submits it. Let us implement that in ``views.py``.
|
||||
|
||||
from django.contrib import messages
|
||||
|
||||
from freedombox import actions, views
|
||||
from plinth 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 freedombox import action_utils
|
||||
from freedombox.actions import privileged
|
||||
from plinth import action_utils
|
||||
from plinth.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:`freedombox.actions.privileged` decorator. All such
|
||||
privileges due to the :meth:`plinth.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:`freedombox.action_utils`
|
||||
to easily perform it's duties.
|
||||
utilities provided by the FreedomBox framework in :obj:`plinth.action_utils` to
|
||||
easily perform it's duties.
|
||||
|
||||
@ -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:`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
|
||||
framework, the method :meth:`plinth.app.App.diagnose` has to be overridden or in
|
||||
a component that belongs to the app, the method
|
||||
:meth:`plinth.app.Component.diagnose` has to be overridden. The methods must
|
||||
return a list in which each item is the result of a test performed. The item
|
||||
itself is a two-tuple containing the display name of the test followed by the
|
||||
result as ``passed``, ``failed`` or ``error``.
|
||||
@ -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:`freedombox.views.AppView` and `app.html` template
|
||||
item is shown by the :class:`plinth.views.AppView` and `app.html` template
|
||||
automatically when ``diagnose()`` method is overridden in the app or a
|
||||
component.
|
||||
|
||||
|
||||
@ -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::
|
||||
|
||||
─┬ <freedombox_root>/
|
||||
└─┬ freedombox/
|
||||
─┬ <plinth_root>/
|
||||
└─┬ plinth/
|
||||
└─┬ 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
|
||||
``freedombox/modules/transmission`` directory (along with other files described
|
||||
``plinth/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
|
||||
``freedombox/modules/`` directory is a Python3 `namespace package
|
||||
``plinth/modules/`` directory is a Python3 `namespace package
|
||||
<https://www.python.org/dev/peps/pep-0420/>`_. So, you can install it with the
|
||||
``freedombox/modules/`` directory structure into any Python path and still be
|
||||
discovered as ``freedombox.modules.*``.
|
||||
``plinth/modules/`` directory structure into any Python path and still be
|
||||
discovered as ``plinth.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
|
||||
``freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/``.
|
||||
Let us create this file ``transmission``:
|
||||
``plinth/modules/transmission/data/usr/share/freedombox/modules-enabled/``. Let
|
||||
us create this file ``transmission``:
|
||||
|
||||
.. code-block:: text
|
||||
:caption: ``freedombox/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission``
|
||||
:caption: ``plinth/modules/transmission/data/usr/share/freedombox/modules-enabled/transmission``
|
||||
|
||||
freedombox.modules.transmission
|
||||
plinth.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 ``freedombox.modules`` namespace.
|
||||
It can, for example, be ``freedombox_transmission``.
|
||||
is not necessary for the app to be part of the ``plinth.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:`freedombox.app.App`. Let us do that in ``__init__.py``. We will fill up
|
||||
the class later.
|
||||
:class:`plinth.app.App`. Let us do that in ``__init__.py``. We will fill up the
|
||||
class later.
|
||||
|
||||
.. code-block:: python3
|
||||
:caption: ``__init__.py``
|
||||
|
||||
from freedombox import app as app_module
|
||||
from plinth import app as app_module
|
||||
|
||||
class TransmissionApp(app_module.App):
|
||||
"""FreedomBox app for Transmission."""
|
||||
|
||||
@ -22,7 +22,7 @@ write the following:
|
||||
]
|
||||
|
||||
This routes the ``/apps/transmission/`` URL to a view called
|
||||
``TransmissionAppView`` defined in ``freedombox/modules/transmission/views.py``.
|
||||
``TransmissionAppView`` defined in ``plinth/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 freedombox import menu
|
||||
from plinth 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
|
||||
``freedombox/modules/transmission/static/icons/`` directory.
|
||||
``plinth/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 freedombox import views
|
||||
from freedombox.modules import transmission
|
||||
from plinth import views
|
||||
from plinth.modules import transmission
|
||||
|
||||
class TransmissionAppView(views.AppView):
|
||||
"""Serve configuration page."""
|
||||
app_id = 'transmission'
|
||||
|
||||
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,
|
||||
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,
|
||||
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
|
||||
|
||||
@ -1,160 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN" "http://www.docbook.org/xml/4.4/docbookx.dtd">
|
||||
<!--
|
||||
# SPDX-License-Identifier: AGPL-3.0-or-later
|
||||
-->
|
||||
<refentry>
|
||||
<refmeta>
|
||||
<refentrytitle><application>freedombox-cmd</application></refentrytitle>
|
||||
<manvolnum>1</manvolnum>
|
||||
<refmiscinfo class="manual">FreedomBox Command Line Utility</refmiscinfo>
|
||||
<refmiscinfo class="version"> </refmiscinfo>
|
||||
</refmeta>
|
||||
|
||||
<refnamediv>
|
||||
<refname><application>freedombox-cmd</application></refname>
|
||||
<refpurpose>
|
||||
command line utility to perform FreedomBox operations
|
||||
</refpurpose>
|
||||
</refnamediv>
|
||||
|
||||
<refsynopsisdiv>
|
||||
<cmdsynopsis>
|
||||
<command>freedombox-cmd</command>
|
||||
<arg><option>-h, </option><option>--help</option></arg>
|
||||
<arg choice="req">module</arg>
|
||||
<arg choice="req">action</arg>
|
||||
<arg><option>--no-args</option></arg>
|
||||
</cmdsynopsis>
|
||||
</refsynopsisdiv>
|
||||
|
||||
<refsect1>
|
||||
<title>Description</title>
|
||||
<para>
|
||||
FreedomBox is a community project to develop, design and promote
|
||||
personal servers running free software for private, personal
|
||||
communications. It is a networking appliance designed to allow
|
||||
interfacing with the rest of the Internet under conditions of
|
||||
protected privacy and data security. It hosts applications such
|
||||
as blog, wiki, website, social network, email, web proxy and a
|
||||
Tor relay on a device that can replace a wireless router so that
|
||||
data stays with the users.
|
||||
</para>
|
||||
<para>
|
||||
freedombox-cmd is a command line interface to some of the operations
|
||||
performed by FreedomBox. It is typically not needed by the end users who
|
||||
use FreedomBox's web interface. The command may be used in some cases
|
||||
while debugging problems, especially where the web interface is not
|
||||
accessible or when a piece of functionality that is not provided in the
|
||||
web interface needs to be triggered.
|
||||
</para>
|
||||
<para>
|
||||
The command is simply a client to the FreedomBox's privileged daemon and
|
||||
relays user's request to it. It waits for the request to complete and
|
||||
prints the output of the operation or an error message collected form the
|
||||
daemon. The daemon only allows connections from an pre-allowed list of
|
||||
user accounts. So, be sure to run the command as 'root' superuser.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Options</title>
|
||||
<variablelist>
|
||||
<varlistentry>
|
||||
<term><option>module</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Name of the module from which to execute an action.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>action</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Name of the action to execute. It should found in the provided
|
||||
module.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--no-args</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Don't try to read the arguments to the command on the standard
|
||||
input. Instead, assume that the operation does not have any
|
||||
arguments and execute the method without arguments.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><option>--help</option></term>
|
||||
<listitem>
|
||||
<para>
|
||||
Show brief help about arguments allowed for this command.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Examples</title>
|
||||
|
||||
<example>
|
||||
<title>Re-run FreedomBox network setup</title>
|
||||
<synopsis>$ sudo freedombox-cmd networks setup --no-args</synopsis>
|
||||
<para>
|
||||
When FreedomBox starts for the first time, it will setup Network Manager
|
||||
connections suitable for the hardware found. If you wish to re-create
|
||||
these connections at a later time, you can re-run setup for the Networks
|
||||
app using the web interface or run this command on a terminal.
|
||||
</para>
|
||||
</example>
|
||||
|
||||
<example>
|
||||
<title>Delete a user account from LDAP database</title>
|
||||
<synopsis>$ echo '{"args": ["USERNAME", "AUTH_USER", "AUTH_PASSWORD"], "kwargs": {}}' | sudo freedombox-cmd users remove_user</synopsis>
|
||||
<para>
|
||||
USERNAME is the name of the user account that must be removed. AUTH_USER
|
||||
is name of the user account that is authorizing this operation.
|
||||
AUTH_PASSWORD is the password for user account that is authorizing this
|
||||
operation. This operation may be needed if FreedomBox's sqlite3 database
|
||||
is wiped, removing the user accounts in the database but the
|
||||
corresponding entries from LDAP database are not removed. A new user
|
||||
with that name can't be created until the LDAP account is also removed.
|
||||
</para>
|
||||
</example>
|
||||
|
||||
<example>
|
||||
<title>Set the logging mode to persistent</title>
|
||||
<synopsis>$ echo '{"args": ["persistent"], "kwargs": {}}' | sudo freedombox-cmd config set_logging_mode</synopsis>
|
||||
<para>
|
||||
By default, FreedomBox sets up systemd-journald to 'volatile' logging.
|
||||
This means that logs will not be stored on the disk and will be lost
|
||||
after a reboot. If you are tackling a problem and wish to store the logs
|
||||
persistently, you can change the setting in the web interface or run
|
||||
this command.
|
||||
</para>
|
||||
</example>
|
||||
</refsect1>
|
||||
|
||||
<refsect1>
|
||||
<title>Bugs</title>
|
||||
<para>
|
||||
See <ulink
|
||||
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>
|
||||
|
||||
<refsect1>
|
||||
<title>Author</title>
|
||||
<para>
|
||||
<author>
|
||||
<firstname>FreedomBox Developers</firstname>
|
||||
<contrib>Original author</contrib>
|
||||
</author>
|
||||
</para>
|
||||
</refsect1>
|
||||
</refentry>
|
||||
@ -43,7 +43,7 @@ An alternative to downloading these images is to [[InstallingDebianOn/Allwinner|
|
||||
|
||||
=== Known Issues ===
|
||||
|
||||
* Revision G2 (written on the board): The current stable Debian11/bullseye image (from 2021-08-27) '''will not start an Ethernet connection!''' This means you can not continue with the installation process at first. This can be fixed by following [[https://wiki.debian.org/InstallingDebianOn/Allwinner#Olimex_A20-OLinuXino-LIME2__rev._F_and_newer_and_Debian11.2F_bullseye_kernel | this description]] after you [[https://wiki.debian.org/FreedomBox/Download#Installation | copied the image to your SD card]]. Or you Download and use the [[https://ftp.freedombox.org/pub/freedombox/hardware/pioneer/|Pioneer Edition image]] to fix the issue. It contains a slightly [[https://salsa.debian.org/freedombox-team/u-boot/commit/2cb18893ef|modified u-boot]].
|
||||
* Revision G2 (written on the board): The current stable Debian11/bullseye image (from 2021-08-27) '''will not start an Ethernet connection!''' This means you can not continue with the installation process at first. This can be fixed by following [[https://wiki.debian.org/InstallingDebianOn/Allwinner#Olimex_A20-OLinuXino-LIME2__rev._F_and_newer_and_Debian11.2F_bullseye_kernel | this description]] after you [[https://wiki.debian.org/FreedomBox/Download#Installation | copied the image to your SD card]]. Or you Download and use the [[https://ftp.freedombox.org/pub/freedombox/pioneer/|Pioneer Edition image]] to fix the issue. It contains a slightly [[https://salsa.debian.org/freedombox-team/u-boot/commit/2cb18893ef|modified u-boot]].
|
||||
* Revision G2 hardware has also [[DebianBug:927397|poor performance when transmitting Ethernet data in Gigabit mode]] for older FreedomBox releases. The procedure above or for rev. C fixes this.
|
||||
|
||||
* Revision C hardware has [[DebianBug:845128|poor performance when receiving Ethernet data in Gigabit mode]]. To workaround the problem, you can switch to 100 Mbps mode instead of Gigabit mode. Login to your !FreedomBox as root (or plugin the SD card into another computer) and create the file /etc/NetworkManager/dispatcher.d/20-fix-ethernet-problem with the following contents:
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
|
||||
{{attachment:apu1d.jpg|PC Engines APU 1D|width=632,height=319}}
|
||||
|
||||
[[https://www.pcengines.ch/apu.htm|PC Engines APU]] boards are single board computers with 3 Gigabit ethernet ports, a powerful AMD64 APU and Coreboot firmware. !FreedomBox images built for AMD64 machines are tested to work well for [[http://www.pcengines.ch/apu1d.htm|APU1D]] and [[http://www.pcengines.ch/apu3b2.htm|APU3B ]] models and are expected to work also well on the other, very similar versions.
|
||||
[[http://www.pcengines.ch/apu1d.htm|PC Engines APU 1D]] is a single board computer with 3 Gigabit ethernet ports, a powerful AMD APU and Coreboot firmware. !FreedomBox images built for AMD64 machines are tested to work well for it.
|
||||
|
||||
'''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this single board computer.
|
||||
|
||||
@ -21,26 +21,21 @@ Although untested, the following similar hardware is also likely to work well wi
|
||||
* [[http://www.pcengines.ch/apu2c4.htm|apu2c4]]
|
||||
* [[http://www.pcengines.ch/apu3a2.htm|apu3a2]]
|
||||
* [[http://www.pcengines.ch/apu3a4.htm|apu3a4]]
|
||||
* [[http://www.pcengines.ch/apu3b2.htm|apu3b2]]
|
||||
* [[http://www.pcengines.ch/apu3b4.htm|apu3b4]]
|
||||
|
||||
=== Installation ===
|
||||
=== Download ===
|
||||
|
||||
!FreedomBox disk [[FreedomBox/Download|images]] for this hardware are available. Follow the instructions on the [[FreedomBox/Download|download]] page to create a !FreedomBox SD card, USB disk, SSD or hard drive and boot into !FreedomBox. Pick the image meant for all amd64 machines.
|
||||
|
||||
An alternative to downloading these images is to [[InstallingDebianOn/Alix3d2|install Debian]] on the APU and then [[FreedomBox/Hardware/Debian|install FreedomBox]] on it.
|
||||
|
||||
An [[https://github.com/huubsch/APU-Installation-HomeAssistant-Freedombox|installation manual]] tested on the APU3B is available on GitHub, including flashing with UEFI-BIOS
|
||||
|
||||
=== Networking ===
|
||||
|
||||
The first network port, the left most one in the above picture, is configured by !FreedomBox to be an upstream Internet link and the remaining 2 ports are configured for local computers to connect to.
|
||||
|
||||
=== Availability ===
|
||||
|
||||
PCEngines announced the [[https://www.pcengines.ch/eol.htm|phase-out]] of these boards in June 2023.
|
||||
|
||||
In 2024 [[https://pcengines.github.io/|Dasharo announced the support of APU-boards]] : coreboot + SeaBIOS and coreboot+UEFI.
|
||||
|
||||
* Price: 110 - 170 USD (depending on the board and supplier)
|
||||
* [[http://www.pcengines.ch/order.htm|PC Engines]]
|
||||
* [[http://www.pcengines.ch/order.htm|Full list of suppliers]]
|
||||
@ -48,17 +43,18 @@ In 2024 [[https://pcengines.github.io/|Dasharo announced the support of APU-boar
|
||||
=== Hardware ===
|
||||
|
||||
* Open Hardware: No
|
||||
* CPU: [[http://www.amd.com/en-gb/products/embedded/processors/g-series|AMD G series T40E]]; [[https://teklager.se/en/amd-gx-412tc-cpu-specification/|GX-412TC]], 1 GHz quad core (depending on model)
|
||||
* RAM: 2 GB DDR3-1066 DRAM - 4 GB (depending on model)
|
||||
* Storage: SD card, External USB, mSATA module
|
||||
* CPU: [[http://www.amd.com/en-gb/products/embedded/processors/g-series|AMD G series T40E]]
|
||||
* RAM: 2 GB DDR3-1066 DRAM
|
||||
* Storage: SD card, External USB
|
||||
* Architecture: amd64
|
||||
* Ethernet: 3 Gigabit Ethernet ports
|
||||
* WiFi: wle200nx / wle600vx / wle900vx miniPCI express wireless modules
|
||||
* SATA: 1 mSATA-module and 1 SATA
|
||||
* !WiFi: None, use a [[FreedomBox/Hardware/USBWiFi|USB WiFi device]]
|
||||
* SATA: 1 m-SATA and 1 SATA
|
||||
|
||||
=== Non-Free Status ===
|
||||
|
||||
* Non-free blobs required: No
|
||||
* !WiFi: Not available
|
||||
* Boot firmware: [[http://www.pcengines.ch/apu1d.htm|Coreboot]]
|
||||
|
||||
## END_INCLUDE
|
||||
@ -66,4 +62,4 @@ In 2024 [[https://pcengines.github.io/|Dasharo announced the support of APU-boar
|
||||
<<Include(FreedomBox/Portal)>>
|
||||
|
||||
----
|
||||
CategoryFreedomBox CategoryFreedomBox
|
||||
CategoryFreedomBox
|
||||
|
||||
@ -14,15 +14,13 @@
|
||||
|
||||
=== What is User Websites? ===
|
||||
|
||||
User websites is a feature that allows any (even non-admin) user on a !FreedomBox to host their own website simply by copying files to well known location in their home directory on the !FreedomBox server. The URL for the website will look like `https://mydomain.example/~myusername/`. The website will be available on the local network and/or the internet according to the network and firewall setup. If the copied files are HTML pages, they will show up as a website. If they are other types of files such as photos or documents. A list of those files is shown and a visitor will be able to view or download them.
|
||||
User websites is a standard location for webservers to allow host users to expose static files on the filesystem as a website to the local network and/or the internet according to the network and firewall setup.
|
||||
|
||||
Apache is the web server used in !FreedomBox and this feature is implemented using an Apache module.
|
||||
The standard webserver in !FreedomBox is Apache and this is implemented by means of a specific Apache module.
|
||||
|
||||
=== Screenshot ===
|
||||
|
||||
{{attachment:user-websites-folder.png|User Website copied to FreedomBox using GNOME File Browser}}
|
||||
|
||||
{{attachment:user-websites-browser.png|User Website accessed using a browser}}
|
||||
/* Add when/if an interface is made for FreedomBox */
|
||||
|
||||
=== Using User Websites ===
|
||||
|
||||
@ -32,8 +30,9 @@ To serve documents, place the files in the designated directory in a !FreedomBox
|
||||
|
||||
This directory is: '''public_html'''
|
||||
|
||||
Thus, the absolute path for the directory of a user named ''fbx'' with home directory in ''/home/fbx'' will be '''/home/fbx/public_html'''.
|
||||
The User Websites feature will serve documents placed in this directory when requests for documents with the URI path ''~fbx'' are received. For example, if `mydomain.example` is your domain then a request for the URL `https://mydomain.example/~fbx/photo.jpg` will display the file in `/home/fbx/public_html/photo.jpg`. If a file named ''index.html'' is placed in the directory, it will shown when no file name is provided in the URL. So, the URL `https://mydomain.example/~fbx/` will show the HTML page `/home/fbx/public_html/index.html`
|
||||
Thus the absolute path for the directory of a user named fbx with home directory in /home/fbx will be '''/home/fbx/public_html'''.
|
||||
User websites will serve documents placed in this directory when requests for documents with the URI path "~fbx" are received. For the the `example.org` domain thus a request for the document `example.org/~fbx/index.html` will transfer the file in `/home/fbx/public_html/index.html`.
|
||||
|
||||
|
||||
=== Creating public_html folder and uploading documents ===
|
||||
|
||||
@ -45,7 +44,7 @@ Linux standard desktop file managers use to support remote filesystem access thr
|
||||
* Gnome's Nautilus:
|
||||
1. To lauch Nautilus you can seek its archive icon, or search ether its name or the word "file".
|
||||
1. At the bottom of the left pane you'll find an option "+ Other locations".
|
||||
1. It leads you to a list of locations. Find "`freedombox SFTP server`" (english literal for all desktop languages). Click on it. If you don't find this, you can instead type `sftp://username@freedombox.local` in the address bar.
|
||||
1. It leads you to a list of locations. Find "`freedombox SFTP server`" (english literal for all desktop languages). Click on it.
|
||||
1. The first time you'll be asked for your user and password. Enter your !FreedomBox user and its password. The dialog will also offer you some options to remember it for some time.
|
||||
* Plasma file manager AKA Dolphin:
|
||||
1. Click on the location bar at the top of the window.
|
||||
|
||||
@ -37,4 +37,4 @@ The Cubieboard 2 is a single board computer based on the Allwinner A20 processor
|
||||
CategoryFreedomBox
|
||||
|
||||
|
||||
Cubieboard 2 image is licensed under the [[https://creativecommons.org/licenses/by-sa/2.0/|Creative Commons Attribution-Share Alike 2.0 Generic license]] by [[https://commons.wikimedia.org/wiki/File:Cubieboard_2_-_Top_(14673300334).jpg|Gareth Halfacree]].
|
||||
Cubieboard 2 image is licensed under a Creative Commons Attribution-!ShareAlike 2.0 Generic License by [[https://www.flickr.com/photos/120586634@N05/14673300334/in/photolist-pMbdDm-omCuYN-o5kVMu-dy9jTD-dy99Kz|Flickr]].
|
||||
|
||||
@ -33,9 +33,9 @@ e.g. A university using !MediaWiki running on !FreedomBox as a course wiki wants
|
||||
|
||||
'''Configuration:'''
|
||||
|
||||
!FreedomBox reads custom shortcuts you have created from various files paths on the server. A shortcuts file can be any file with `.json` extension in the following directories: `/etc/freedombox/custom-shortcuts.json.d/`, `/var/lib/freedombox/custom-shortcuts.json.d/` and `/usr/share/freedombox/custom-shortcuts.json.d/`. Or they can be a file named `custom-shortcuts.json` in these directories: `/etc/freedombox/`, `/etc/plinth/` (only for compatibility), `/var/lib/freedombox/` and `/usr/share/freedombox/`. The file should follow the same JSON schema as the !FreedomBox API. You can refer to the JSON schema by visiting `https://<my-freedombox-url>/plinth/api/1/shortcuts`.
|
||||
Create a file called `custom-shortcuts.json` in Plinth's configuration directory `/etc/plinth` and add additional shortcuts in JSON format. The file should have follow the same JSON schema as the Plinth API. You can refer to the JSON schema by visiting https://<my-freedombox-url>/plinth/api/1/shortcuts.
|
||||
|
||||
As an example, to add one additional shortcut for [[https://nextcloud.com|NextCloud]] app, create a file called `/etc/freedombox/custom-shortcuts.json.d/nextcloud.json` (create directories as needed).
|
||||
An example file adding one additional shortcut for [[https://nextcloud.com|NextCloud]].
|
||||
|
||||
{{{#!highlight json
|
||||
{
|
||||
@ -55,9 +55,9 @@ As an example, to add one additional shortcut for [[https://nextcloud.com|NextCl
|
||||
}
|
||||
}}}
|
||||
|
||||
The corresponding icons for the shortcuts listed in the above file should be placed in the directory `/var/www/plinth/custom/static/icons/`. The file names of the icons should match with those provided in `/etc/freedombox/custom-shortcuts.json.d/nextcloud.json`.
|
||||
The corresponding icons for the shortcuts listed in the above file should be placed in the directory `/var/www/plinth/custom/static/icons/`. The file names of the icons should match with those provided in `/etc/plinth/custom-shortcuts.json`.
|
||||
|
||||
After adding an entry for !NextCloud in `nextcloud.json` and an icon, restart Plinth by executing the command {{{ systemctl restart plinth }}} on the !FreedomBox. You can also restart the !FreedomBox from the web interface.
|
||||
After adding an entry for !NextCloud in custom-shortcuts.json and an icon, restart Plinth by executing the command {{{ systemctl restart plinth }}} on the !FreedomBox. You can also restart the !FreedomBox from the web interface.
|
||||
|
||||
After restart the Plinth home page will display an additional shortcut for !NextCloud as shown below: <<BR>>
|
||||
{{attachment:nextcloud-frontpage-shortcut.png|NextCloud custom shortcut on the Plinth home page}}
|
||||
|
||||
@ -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 (trixie), Testing (forky), and Unstable (sid).
|
||||
This page describes the process of installing !FreedomBox on a Debian system. Currently, !FreedomBox works in Debian Stable (bookworm), Testing (trixie), and Unstable (sid).
|
||||
|
||||
'''Important:''' Read [[FreedomBox/Hardware|general advice]] about hardware before building a !FreedomBox with this approach.
|
||||
|
||||
@ -21,15 +21,13 @@ 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 13 (trixie) or newer ===
|
||||
=== Installing on Debian 12 (bookworm) or newer ===
|
||||
|
||||
Check the Troubleshooting section below, for any tips or workarounds that might help during the install.
|
||||
|
||||
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. [[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. Update your package list.
|
||||
|
||||
@ -49,16 +47,6 @@ $ 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:
|
||||
|
||||
@ -44,11 +44,36 @@ It is important to verify the images you have downloaded to ensure that the file
|
||||
|
||||
* First open a terminal and import the public keys of the !FreedomBox developers who built the images:
|
||||
{{{
|
||||
$ gpg --keyserver keyserver.ubuntu.com --recv-keys BCBEBD57A11F70B23782BC5736C361440C9BC971
|
||||
$ gpg --keyserver keyserver.ubuntu.com --recv-keys 7D6ADB750F91085589484BE677C0C75E7B650808
|
||||
# This is the FreedomBox CI server's key
|
||||
$ gpg --keyserver keyserver.ubuntu.com --recv-keys 013D86D8BA32EAB4A6691BF85D4153D6FE188FC8
|
||||
# This is the new FreedomBox CI server's key
|
||||
$ gpg --keyserver keyserver.ubuntu.com --recv-keys D4B069124FCF43AA1FCD7FBC2ACFC1E15AF82D8C
|
||||
}}}
|
||||
* Next, verify the fingerprint of the public keys:
|
||||
{{{
|
||||
$ gpg --fingerprint BCBEBD57A11F70B23782BC5736C361440C9BC971
|
||||
pub 4096R/0C9BC971 2011-11-12
|
||||
Key fingerprint = BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971
|
||||
uid Sunil Mohan Adapa <sunil@medhas.org>
|
||||
sub 4096R/4C1D4B57 2011-11-12
|
||||
|
||||
$ gpg --fingerprint 7D6ADB750F91085589484BE677C0C75E7B650808
|
||||
pub 4096R/7B650808 2015-06-07 [expires: 2020-06-05]
|
||||
Key fingerprint = 7D6A DB75 0F91 0855 8948 4BE6 77C0 C75E 7B65 0808
|
||||
uid James Valleroy <jvalleroy@mailbox.org>
|
||||
uid James Valleroy <jvalleroy@freedombox.org>
|
||||
sub 4096R/25D22BF4 2015-06-07 [expires: 2020-06-05]
|
||||
sub 4096R/DDA11207 2015-07-03 [expires: 2020-07-01]
|
||||
sub 2048R/2A624357 2015-12-22
|
||||
|
||||
$ gpg --fingerprint 013D86D8BA32EAB4A6691BF85D4153D6FE188FC8
|
||||
pub rsa4096 2018-06-06 [SC]
|
||||
013D 86D8 BA32 EAB4 A669 1BF8 5D41 53D6 FE18 8FC8
|
||||
uid [ unknown] FreedomBox CI (Continuous Integration server) <admin@freedombox.org>
|
||||
sub rsa4096 2018-06-06 [E]
|
||||
|
||||
$ gpg --fingerprint D4B069124FCF43AA1FCD7FBC2ACFC1E15AF82D8C
|
||||
pub rsa4096 2022-03-09 [SC]
|
||||
D4B0 6912 4FCF 43AA 1FCD 7FBC 2ACF C1E1 5AF8 2D8C
|
||||
@ -151,7 +176,7 @@ On MacOS (OSX) you can use programs like ''balenaetcher'' and ''rosaimagewriter'
|
||||
|
||||
=== From within FreedomBox ===
|
||||
|
||||
!FreedomBox is made up of several software programs and you can obtain the source code to any of them. These instructions are similar to obtaining and [[https://www.debian.org/doc/manuals/maint-guide/build.en.html|building]] [[https://wiki.debian.org/Packaging/SourcePackage#How_to_Download_a_source_package|source code]] [[https://wiki.debian.org/BuildingTutorial|for Debian]] since !FreedomBox is a pure blend of Debian. Using this process you can obtain the source code to the exact version of the package you are currently using in !FreedomBox.
|
||||
!FreedomBox is made up of several software programs and you can obtain the source code to any of them. These instructions are similar to obtaining and [[https://www.debian.org/doc/manuals/maint-guide/build.en.html|building]] [[https://www.debian.org/doc/manuals/apt-howto/ch-sourcehandling.en.html|source code]] [[https://wiki.debian.org/BuildingTutorial|for Debian]] since !FreedomBox is a pure blend of Debian. Using this process you can obtain the source code to the exact version of the package you are currently using in !FreedomBox.
|
||||
|
||||
1. To see the list of software packages installed on your !FreedomBox, run the following in a terminal:
|
||||
{{{
|
||||
@ -225,37 +250,6 @@ dd if=temp/usr/lib/u-boot/A20-OLinuXino-Lime2/u-boot-sunxi-with-spl.bin of=<lime
|
||||
|
||||
The resulting image will have the modified u-boot in it.
|
||||
|
||||
=== Old Signing Keys ===
|
||||
|
||||
Some very old disk images of !FreedomBox have been signed by different GPG keys than the one listed above. Those signatures are still valid and can be verified using the older keys.
|
||||
|
||||
{{{
|
||||
$ gpg --keyserver keyserver.ubuntu.com --recv-keys BCBEBD57A11F70B23782BC5736C361440C9BC971
|
||||
$ gpg --keyserver keyserver.ubuntu.com --recv-keys 7D6ADB750F91085589484BE677C0C75E7B650808
|
||||
# This is the FreedomBox CI server's key
|
||||
$ gpg --keyserver keyserver.ubuntu.com --recv-keys 013D86D8BA32EAB4A6691BF85D4153D6FE188FC8
|
||||
$ gpg --fingerprint BCBEBD57A11F70B23782BC5736C361440C9BC971
|
||||
pub 4096R/0C9BC971 2011-11-12
|
||||
Key fingerprint = BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971
|
||||
uid Sunil Mohan Adapa <sunil@medhas.org>
|
||||
sub 4096R/4C1D4B57 2011-11-12
|
||||
|
||||
$ gpg --fingerprint 7D6ADB750F91085589484BE677C0C75E7B650808
|
||||
pub 4096R/7B650808 2015-06-07 [expires: 2020-06-05]
|
||||
Key fingerprint = 7D6A DB75 0F91 0855 8948 4BE6 77C0 C75E 7B65 0808
|
||||
uid James Valleroy <jvalleroy@mailbox.org>
|
||||
uid James Valleroy <jvalleroy@freedombox.org>
|
||||
sub 4096R/25D22BF4 2015-06-07 [expires: 2020-06-05]
|
||||
sub 4096R/DDA11207 2015-07-03 [expires: 2020-07-01]
|
||||
sub 2048R/2A624357 2015-12-22
|
||||
|
||||
$ gpg --fingerprint 013D86D8BA32EAB4A6691BF85D4153D6FE188FC8
|
||||
pub rsa4096 2018-06-06 [SC]
|
||||
013D 86D8 BA32 EAB4 A669 1BF8 5D41 53D6 FE18 8FC8
|
||||
uid [ unknown] FreedomBox CI (Continuous Integration server) <admin@freedombox.org>
|
||||
sub rsa4096 2018-06-06 [E]
|
||||
}}}
|
||||
|
||||
## END_INCLUDE
|
||||
|
||||
<<Include(FreedomBox/Portal)>>
|
||||
|
||||
@ -16,12 +16,6 @@ Dynamic DNS service providers assist in working around a problem. First they pr
|
||||
|
||||
For this to work, every time you connect to the Internet, you will have to tell your Dynamic DNS provider what your current IP address is. Hence you need special software on your server to perform this operation. The Dynamic DNS function in !FreedomBox will allow users without a static public IP address to push the current public IP address to a Dynamic DNS Server. This allows you to expose services on !FreedomBox, such as ownCloud, to the Internet.
|
||||
|
||||
=== A Free Domain for your FreedomBox ===
|
||||
|
||||
You can get a free domain name for your !FreedomBox using the free Dynamic DNS service provided by the !FreedomBox community at https://ddns.freedombox.org . With this service, your domain name will look like ''myaccount.fbx.one'' or ''myaccount.freedombox.rocks'' where ''myaccount'' is the account you created on the service.
|
||||
|
||||
The service also provides you with free unlimited number of subdomains. For this, login to the account, go to ''Change Settings'', check the option ''Wild Card'', and click ''Save Changes''. After this you can add any number of subdomains like ''foo.myaccount.fbx.one'' to your !FreedomBox in ''System -> Names -> Add Domain (regular)''. TLS certificates (for HTTPS) will be automatically obtained by !FreedomBox using Let's Encrypt for these subdomains. Subdomains are especially useful for applications that require being hosted on a separate domain, such as [[FreedomBox/Manual/HomeAssistant|Home Assistant]].
|
||||
|
||||
=== GnuDIP vs. Update URL ===
|
||||
|
||||
There are two main mechanism to notify the Dynamic DNS server of your new IP address; using the ''GnuDIP'' protocol and using the ''Update URL'' mechanism.
|
||||
@ -33,6 +27,7 @@ On the other hand, the GnuDIP protocol will only transport a salted MD5 value of
|
||||
=== Using the GnuDIP protocol ===
|
||||
|
||||
1. Register an account with any Dynamic DNS service provider. A free service provided by the !FreedomBox community is available at https://ddns.freedombox.org .
|
||||
|
||||
1. In !FreedomBox UI, enable the Dynamic DNS Service.
|
||||
|
||||
1. Select ''GnuDIP'' as ''Service type'', enter your Dynamic DNS service provider address (for example, ddns.freedombox.org) into ''GnuDIP Server Address'' field.
|
||||
|
||||
@ -1,158 +0,0 @@
|
||||
#language en
|
||||
|
||||
##TAG:TRANSLATION-HEADER-START
|
||||
~- [[FreedomBox/Guide/ExposeLocalService|English]] - [[es/FreedomBox/Guide/ExposeLocalService|Español]] - [[DebianWiki/EditorGuide#translation|(+)]] -~
|
||||
##TAG:TRANSLATION-HEADER-END
|
||||
|
||||
<<TableOfContents>>
|
||||
|
||||
## BEGIN_INCLUDE
|
||||
|
||||
== Expose a Local Service to Internet using FreedomBox ==
|
||||
|
||||
This guide describes to expose a local service you have on your LAN to the internet using a !FreedomBox that is already exposed on the internet.
|
||||
|
||||
=== Goal ===
|
||||
|
||||
* ''You have a !FreedomBox running'' with a working domain already setup. You are able to access your !FreedomBox using a URL such as `https://www.mysite.example/` .
|
||||
* ''You have a different server running a local service'' on LAN that you wish to expose to the Internet on the same domain as your !FreedomBox. The local service must be a web service using the HTTP protocol (it is also possible to setup non-HTTP service, but that is a different approach). Optionally, you can have special domain assigned specifically for this local service.
|
||||
* You wish for ''!FreedomBox to handle the TLS certificates'' for this domain as !FreedomBox typically does. Your local service need not setup and manage TLS certificates.
|
||||
* Optionally, you may want to ''limit access to local service using !FreedomBox credentials''. Only users with a !FreedomBox account (and belonging to a chosen group) will be able to access this service. The local service will not be available to general public on the Internet. This way you can host local services that don’t implement their own authentication or local services with their own authentication mechanisms disabled.
|
||||
|
||||
=== Exposing Local LAN servers ===
|
||||
|
||||
* To expose the service, create an Apache configuration file in `/etc/apache2/conf-available/` and write a `ProxyPass` directive. Assuming your local service is running on a computer with IP address `192.168.0.20` on port `3000`, you can do this by running a command (as a root user on the terminal):
|
||||
|
||||
{{{#!highlight bash
|
||||
cat > /etc/apache2/conf-available/my-local-service.conf <<EOL
|
||||
ProxyPass /myservice http://192.168.0.20:3000/
|
||||
EOL
|
||||
}}}
|
||||
|
||||
* Then, enable this Apache configuration. Run the following command:
|
||||
{{{#!highlight bash
|
||||
a2enconf my-local-service
|
||||
}}}
|
||||
* Then reload Apache web server.
|
||||
{{{#!highlight bash
|
||||
systemctl reload apache2
|
||||
}}}
|
||||
|
||||
You can now access your local service at the following URL `https://www.mysite.example/myservice/` . Note that the URL is a secure URL with `https://`. The certificates will be managed by FreedomBox/Let’s Encrypt. All your other apps and services work as usual. You can add any number services you want this way.
|
||||
|
||||
=== Running the Service on FreedomBox Itself ===
|
||||
|
||||
The above approach will also work if the local service is running on !FreedomBox itself. In this case, the `ProxyPass` directive in the configuration should be modified to look like `ProxyPass /myservice http://127.0.0.1:3000/`.
|
||||
|
||||
=== Disabling the service ===
|
||||
|
||||
To disable exposing the local service:
|
||||
|
||||
1. Disable the Apache configuration file.
|
||||
{{{#!highlight bash
|
||||
a2disconf my-local-service
|
||||
}}}
|
||||
1. Then, reload Apache web server.
|
||||
{{{#!highlight bash
|
||||
systemctl reload apache2
|
||||
}}}
|
||||
|
||||
=== Adding Authentication ===
|
||||
|
||||
You can configure the service to be available to only users with !FreedomBox account. This is a good choice if:
|
||||
|
||||
* The local service that is exposed to the Internet should not be available to everyone. And,
|
||||
* The local service does not provide its own authentication mechanism. Or,
|
||||
* The local service provides it’s own authentication but you don’t want to maintain a different set of user accounts for that service and want to reuse your !FreedomBox user accounts.
|
||||
|
||||
1. Update the Apache configuration file `/etc/apache2/conf-available/my-local-service.conf` to look like the following.
|
||||
{{{#!highlight apache
|
||||
<Location /myservice/>
|
||||
Include includes/freedombox-single-sign-on.conf
|
||||
|
||||
ProxyPass http://192.168.0.20:3000/
|
||||
</Location>
|
||||
}}}
|
||||
1. Then, reload Apache web server.
|
||||
{{{#!highlight bash
|
||||
systemctl reload apache2
|
||||
}}}
|
||||
|
||||
If you wish for only some groups of users to be able to access the service, another change to the configuration is needed. Make the configuration look like the following if you wish to allow users of “web-search” group and also users of “admin” group to access the local service. All other users even if they have a valid !FreedomBox account will be denied access.
|
||||
|
||||
{{{#!highlight apache
|
||||
<Location /myservice/>
|
||||
Include includes/freedombox-single-sign-on.conf
|
||||
|
||||
<IfModule mod_auth_pubtkt.c>
|
||||
TKTAuthToken "web-search" "admin"
|
||||
</IfModule>
|
||||
|
||||
ProxyPass http://192.168.0.20:3000/
|
||||
</Location>
|
||||
}}}
|
||||
|
||||
=== Hosting the Service on a Separate Domain ===
|
||||
|
||||
Some services and web applications hosted under a URL fragment such as `/myservice/` do not work well. They require an entire domain or subdomain to be dedicated to them. In these cases too, !FreedomBox can expose local services.
|
||||
|
||||
1. First acquire a domain or a subdomain.
|
||||
* If your domain is a custom domain that you own, go to the DNS settings on your domain name provider and add a subdomain. You can create a CNAME record that simply points to the main domain.
|
||||
* If you are using !FreedomBox Dynamic DNS service, then login into https://ddns.freedombox.org and enable the “Wildcard” option. With this change, for a domain (such as `example.fbx.one`), all subdomains (such as `myservice.example.fbx.one`) of your domain will point to your main domain.
|
||||
1. Add the new domain into !FreedomBox. Goto System → Name Services → Domain (regular) → Add. For example, add `myservice.mysite.example`.
|
||||
1. Then create an Apache configuration file at `/etc/apache2/includes/<domainname>-include.conf`. For our example this is: `/etc/apache2/includes/myservice.mysite.example-include.conf`. The contents of the file should be:
|
||||
{{{#!highlight apache
|
||||
ProxyPass / http://192.168.0.20:3000/
|
||||
}}}
|
||||
1. Modify the above file for authentication if necessary by adding the `Include` and `<IfModule>` configuration directives as shown in the authentication section above.
|
||||
|
||||
=== Troubleshooting ===
|
||||
|
||||
When your setup does not work as expected, to debug, run a temporary web service on your !FreedomBox.
|
||||
|
||||
1. Create a temporary directory with an index.html page on the !FreedomBox.
|
||||
{{{#!highlight bash
|
||||
mkdir temp
|
||||
cd temp
|
||||
cat > index.html <<EOL
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>My test page</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Hello, World!</h1>
|
||||
</body>
|
||||
</html>
|
||||
EOL
|
||||
}}}
|
||||
1. Run a temporary web server (press Control-C to terminate):
|
||||
{{{#!highlight bash
|
||||
python3 -m http.server 3000
|
||||
}}}
|
||||
1. Update the Apache configuration to point to this temporary service on !FreedomBox.
|
||||
{{{#!highlight apache
|
||||
ProxyPass /myservice http://127.0.0.1:3000/
|
||||
}}}
|
||||
|
||||
=== Extras ===
|
||||
|
||||
There are many additional features that Apache can provide to improve the local service. For these, [[https://httpd.apache.org/docs/current/|explore Apache documentation]]. Some features include:
|
||||
|
||||
* Serving static files such as JS, CSS, and media files from local directory without invoking the local service to improve performance.
|
||||
* Caching the responses from the local service to improve performance.
|
||||
* Setting additional headers for security, cache control, etc.
|
||||
* Modify the HTTP header responses from the service when it does not work well to hosting under a URL fragment such as `/myservice/`.
|
||||
* Perform redirects from `http://` URL to `https://` and setting HSTS header.
|
||||
* Load balancing among multiple local services for high availability, scaling, etc.
|
||||
* And more.
|
||||
|
||||
|
||||
## END_INCLUDE
|
||||
|
||||
Back to [[FreedomBox/Features|Features introduction]] or [[FreedomBox/Manual|manual]] pages.
|
||||
|
||||
<<Include(FreedomBox/Portal)>>
|
||||
|
||||
----
|
||||
CategoryFreedomBox
|
||||
@ -72,7 +72,6 @@ You might want to configure your wiki with different [[https://feather.wiki/?pag
|
||||
=== External links ===
|
||||
|
||||
* Website: https://feather.wiki
|
||||
* Source code for Feather Wiki: https://codeberg.org/Alamantus/FeatherWiki
|
||||
|
||||
## END_INCLUDE
|
||||
|
||||
|
||||
@ -12,17 +12,7 @@ In addition to supporting various single board computers and other devices, any
|
||||
|
||||
== Recommended Hardware ==
|
||||
|
||||
=== Libre Crafts FreedomBox ===
|
||||
|
||||
Libre Crafts in an endeavor from the !FreedomBox developers themselves to bring you a powerful !FreedomBox device capable of hosting even the most demanding home server needs. The device is crafted, tested, and delivered to you by !FreedomBox developers. Your purchase helps !FreedomBox development.
|
||||
|
||||
This hardware features a powerful CPU, plenty of main memory, a fast OS disk, ability to add two high capacity hard disk drives, dual multi-gigabit Ethernet ports, all with a low power consumption. Use it to host all your photos, to backup all home devices, as a NAS, as home automation hub, as a desktop computer, and more all at once.
|
||||
|
||||
||<style="text-align: center;"> [[FreedomBox/Hardware/LibreCrafts|{{attachment:libre-crafts.png|Libre Crafts FreedomBox|height=300}}]]<<BR>> [[FreedomBox/Hardware/LibreCrafts|Libre Crafts FreedomBox]] ||
|
||||
|
||||
=== Olimex's FreedomBox Pioneer Edition ===
|
||||
|
||||
On April 22nd, 2019, the !FreedomBox Foundation announced the [[https://freedomboxfoundation.org/buy/|sales]] of the Pioneer Edition !FreedomBox Home Server Kits. This pre-installed hardware is for all users who don't wish to build their own !FreedomBox by choosing the right components, downloading the image and preparing an SD card with !FreedomBox.
|
||||
On April 22nd, 2019, the !FreedomBox Foundation announced the [[https://freedomboxfoundation.org/buy/|sales]] of the Pioneer Edition !FreedomBox Home Server Kits. This is the recommended pre-installed hardware for all users who don't wish to build their own !FreedomBox by choosing the right components, downloading the image and preparing an SD card with !FreedomBox.
|
||||
|
||||
The kit includes all the hardware needed for launching a !FreedomBox home server on an Olimex A20-OLinuXino-LIME2 board. This product provides the perfect combination of open source hardware and free and open source software. By purchasing this product, you also support the !FreedomBox Foundation's efforts to create and promote its free and open source server software.
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user