From f13ad07ecb958da23565985daaed6853a0dae255 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Wed, 5 Feb 2020 23:19:28 +0530 Subject: [PATCH 01/41] backups: Add optional field - Name Signed-off-by: Joseph Nuthalapati [sunil: Perform validation for name field] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- plinth/modules/backups/forms.py | 4 ++++ plinth/modules/backups/views.py | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/plinth/modules/backups/forms.py b/plinth/modules/backups/forms.py index 8ff0393a4..79aabd12f 100644 --- a/plinth/modules/backups/forms.py +++ b/plinth/modules/backups/forms.py @@ -48,6 +48,10 @@ def _get_repository_choices(): class CreateArchiveForm(forms.Form): repository = forms.ChoiceField() + name = forms.RegexField( + label=_('Name'), + help_text=_('(Optional) Set a name for this backup archive'), + regex=r'^[^{}/]*$', required=False, strip=True) selected_apps = forms.MultipleChoiceField( label=_('Included apps'), help_text=_('Apps to include in the backup'), widget=forms.CheckboxSelectMultiple) diff --git a/plinth/modules/backups/views.py b/plinth/modules/backups/views.py index 66d1915bf..4dc6d3bf9 100644 --- a/plinth/modules/backups/views.py +++ b/plinth/modules/backups/views.py @@ -66,7 +66,8 @@ class CreateArchiveView(SuccessMessageMixin, FormView): if repository.flags.get('mountable'): repository.mount() - name = datetime.now().strftime('%Y-%m-%d:%H:%M') + name = form.cleaned_data['name'] or datetime.now().strftime( + '%Y-%m-%d:%H:%M') selected_apps = form.cleaned_data['selected_apps'] repository.create_archive(name, selected_apps) return super().form_valid(form) From 2bf652f4697fae5a2915b1804500ac61925a7979 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Thu, 6 Feb 2020 19:13:22 +0530 Subject: [PATCH 02/41] functional-tests: Use Name attribute in backups - The operations create backup, restore, delete and download are done based on the name of the backup archive. - Using select-all to uncheck all checkboxes for a minor speedup while creating backups. - Using the new name-based tests for backups for 3 apps Signed-off-by: Joseph Nuthalapati [sunil: Minor indentation fix] [sunil: Use older API for searching links in Splinter, no advantage with new] [sunil: Update patch for coturn and coquelicot] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa test use name fixes Signed-off-by: Sunil Mohan Adapa --- functional_tests/config.ini | 1 - functional_tests/features/backups.feature | 8 ++-- functional_tests/features/bind.feature | 4 +- functional_tests/features/coquelicot.feature | 4 +- functional_tests/features/coturn.feature | 4 +- .../features/date_and_time.feature | 4 +- functional_tests/features/deluge.feature | 4 +- functional_tests/features/dynamicdns.feature | 4 +- functional_tests/features/ejabberd.feature | 4 +- functional_tests/features/gitweb.feature | 4 +- functional_tests/features/ikiwiki.feature | 4 +- functional_tests/features/jsxc.feature | 4 +- functional_tests/features/mediawiki.feature | 4 +- functional_tests/features/mldonkey.feature | 4 +- .../features/monkeysphere.feature | 4 +- functional_tests/features/mumble.feature | 4 +- functional_tests/features/openvpn.feature | 4 +- functional_tests/features/pagekite.feature | 4 +- functional_tests/features/privoxy.feature | 4 +- functional_tests/features/quassel.feature | 4 +- functional_tests/features/roundcube.feature | 4 +- functional_tests/features/samba.feature | 4 +- functional_tests/features/searx.feature | 4 +- functional_tests/features/security.feature | 4 +- functional_tests/features/shadowsocks.feature | 4 +- functional_tests/features/sharing.feature | 4 +- functional_tests/features/ssh.feature | 4 +- .../features/storage_snapshots.feature | 4 +- functional_tests/features/syncthing.feature | 4 +- functional_tests/features/tahoe.feature | 4 +- functional_tests/features/tor.feature | 4 +- .../features/transmission.feature | 4 +- functional_tests/features/ttrss.feature | 4 +- functional_tests/features/upgrades.feature | 4 +- functional_tests/step_definitions/system.py | 27 +++++++----- functional_tests/support/system.py | 42 ++++++++++--------- 36 files changed, 107 insertions(+), 99 deletions(-) diff --git a/functional_tests/config.ini b/functional_tests/config.ini index ba78055e2..6f60c99c4 100644 --- a/functional_tests/config.ini +++ b/functional_tests/config.ini @@ -2,5 +2,4 @@ url = https://localhost:4430 username = tester password = testingtesting -delete_root_backup_archives = true samba_port = 4450 diff --git a/functional_tests/features/backups.feature b/functional_tests/features/backups.feature index d34e9adf1..0db1336f3 100644 --- a/functional_tests/features/backups.feature +++ b/functional_tests/features/backups.feature @@ -10,8 +10,8 @@ Background: Scenario: Browser waits for redirect after restoring a backup Given the bind application is enabled - When I create a backup of the bind app data - And I restore the bind app data backup + When I create a backup of the bind app data with name test_backups + And I restore the bind app data backup with name test_backups And I open the main page And I wait for 5 seconds Then the main page should be shown @@ -19,8 +19,8 @@ Scenario: Browser waits for redirect after restoring a backup Scenario: Download, upload and restore a backup Given the bind application is enabled When I set bind forwarders to 1.1.1.1 - And I create a backup of the bind app data + And I create a backup of the bind app data with name test_backups And I set bind forwarders to 1.0.0.1 - And I download the latest app data backup + And I download the app data backup with name test_backups And I restore the downloaded app data backup Then bind forwarders should be 1.1.1.1 diff --git a/functional_tests/features/bind.feature b/functional_tests/features/bind.feature index bdd3131aa..3fd02d314 100644 --- a/functional_tests/features/bind.feature +++ b/functional_tests/features/bind.feature @@ -35,10 +35,10 @@ Scenario: Backup and restore bind Given the bind application is enabled When I set bind forwarders to 1.1.1.1 And I disable bind DNSSEC - And I create a backup of the bind app data + And I create a backup of the bind app data with name test_bind And I set bind forwarders to 1.0.0.1 And I enable bind DNSSEC - And I restore the bind app data backup + And I restore the bind app data backup with name test_bind Then bind forwarders should be 1.1.1.1 And bind DNSSEC should be disabled diff --git a/functional_tests/features/coquelicot.feature b/functional_tests/features/coquelicot.feature index 1fff498b3..f15c4788c 100644 --- a/functional_tests/features/coquelicot.feature +++ b/functional_tests/features/coquelicot.feature @@ -41,10 +41,10 @@ Scenario: Backup and restore coquelicot When I modify the coquelicot upload password to beforebackup123 And I modify the maximum file size of coquelicot to 128 And I upload the sample local file to coquelicot with password beforebackup123 - And I create a backup of the coquelicot app data + And I create a backup of the coquelicot app data with name test_coquelicot And I modify the coquelicot upload password to afterbackup123 And I modify the maximum file size of coquelicot to 64 - And I restore the coquelicot app data backup + And I restore the coquelicot app data backup with name test_coquelicot And I download the uploaded file from coquelicot Then the coquelicot service should be running And I should be able to login to coquelicot with password beforebackup123 diff --git a/functional_tests/features/coturn.feature b/functional_tests/features/coturn.feature index b707c02fe..687f50389 100644 --- a/functional_tests/features/coturn.feature +++ b/functional_tests/features/coturn.feature @@ -17,9 +17,9 @@ Scenario: Enable coturn application # TODO: Improve this by checking that secret and domain did not change Scenario: Backup and restore coturn Given the coturn application is enabled - When I create a backup of the coturn app data + When I create a backup of the coturn app data with name test_coturn And I restore the coturn app data backup - Then the coturn service should be running + Then the coturn service should be running with name test_coturn Scenario: Disable coturn application Given the coturn application is enabled diff --git a/functional_tests/features/date_and_time.feature b/functional_tests/features/date_and_time.feature index 504057609..fa8e9d39f 100644 --- a/functional_tests/features/date_and_time.feature +++ b/functional_tests/features/date_and_time.feature @@ -25,7 +25,7 @@ Scenario: Set timezone Scenario: Backup and restore datetime When I set the time zone to Africa/Accra - And I create a backup of the datetime app data + And I create a backup of the datetime app data with name test_datetime And I set the time zone to Africa/Cairo - And I restore the datetime app data backup + And I restore the datetime app data backup with name test_datetime Then the time zone should be Africa/Accra diff --git a/functional_tests/features/deluge.feature b/functional_tests/features/deluge.feature index 802cd4877..2da871917 100644 --- a/functional_tests/features/deluge.feature +++ b/functional_tests/features/deluge.feature @@ -23,9 +23,9 @@ Scenario: Backup and restore deluge Given the deluge application is enabled When all torrents are removed from deluge And I upload a sample torrent to deluge - And I create a backup of the deluge app data + And I create a backup of the deluge app data with name test_deluge And all torrents are removed from deluge - And I restore the deluge app data backup + And I restore the deluge app data backup with name test_deluge Then the deluge service should be running And there should be 1 torrents listed in deluge diff --git a/functional_tests/features/dynamicdns.feature b/functional_tests/features/dynamicdns.feature index cded48a2a..57023cf0e 100644 --- a/functional_tests/features/dynamicdns.feature +++ b/functional_tests/features/dynamicdns.feature @@ -10,7 +10,7 @@ Background: Scenario: Backup and restore configuration Given dynamicdns is configured - When I create a backup of the dynamicdns app data + When I create a backup of the dynamicdns app data with name test_dynamicdns And I change the dynamicdns configuration - And I restore the dynamicdns app data backup + And I restore the dynamicdns app data backup with name test_dynamicdns Then dynamicdns should have the original configuration diff --git a/functional_tests/features/ejabberd.feature b/functional_tests/features/ejabberd.feature index 057ac6a66..f57d2c63d 100644 --- a/functional_tests/features/ejabberd.feature +++ b/functional_tests/features/ejabberd.feature @@ -26,9 +26,9 @@ Scenario: Disable message archive management Scenario: Backup and restore ejabberd Given the ejabberd application is enabled And I have added a contact to my roster - When I create a backup of the ejabberd app data + When I create a backup of the ejabberd app data with name test_ejabberd And I delete the contact from my roster - And I restore the ejabberd app data backup + And I restore the ejabberd app data backup with name test_ejabberd Then I should have a contact on my roster Scenario: Disable ejabberd application diff --git a/functional_tests/features/gitweb.feature b/functional_tests/features/gitweb.feature index 5f3be943b..d509199e2 100644 --- a/functional_tests/features/gitweb.feature +++ b/functional_tests/features/gitweb.feature @@ -36,9 +36,9 @@ Scenario: Delete repository Scenario: Backup and restore gitweb Given the gitweb application is enabled And a repository - When I create a backup of the gitweb app data + When I create a backup of the gitweb app data with name test_gitweb And I delete the repository - And I restore the gitweb app data backup + And I restore the gitweb app data backup with name test_gitweb Then the repository should be restored And the gitweb site should be available diff --git a/functional_tests/features/ikiwiki.feature b/functional_tests/features/ikiwiki.feature index e63d2e704..f25a0dae3 100644 --- a/functional_tests/features/ikiwiki.feature +++ b/functional_tests/features/ikiwiki.feature @@ -16,9 +16,9 @@ Scenario: Enable wiki application Scenario: Backup and restore wiki Given the wiki application is enabled When there is an ikiwiki wiki - And I create a backup of the ikiwiki app data + And I create a backup of the ikiwiki app data with name test_ikiwiki And I delete the ikiwiki wiki - And I restore the ikiwiki app data backup + And I restore the ikiwiki app data backup with name test_ikiwiki Then the ikiwiki wiki should be restored Scenario: Disable wiki application diff --git a/functional_tests/features/jsxc.feature b/functional_tests/features/jsxc.feature index 26c447562..677a1d033 100644 --- a/functional_tests/features/jsxc.feature +++ b/functional_tests/features/jsxc.feature @@ -13,6 +13,6 @@ Scenario: Install jsxc application Scenario: Backup and restore jsxc Given the jsxc application is installed - When I create a backup of the jsxc app data - And I restore the jsxc app data backup + When I create a backup of the jsxc app data with name test_jsxc + And I restore the jsxc app data backup with name test_jsxc Then the jsxc site should be available diff --git a/functional_tests/features/mediawiki.feature b/functional_tests/features/mediawiki.feature index 64b6e9bbd..e3b0de90f 100644 --- a/functional_tests/features/mediawiki.feature +++ b/functional_tests/features/mediawiki.feature @@ -65,10 +65,10 @@ Scenario: Upload SVG image Scenario: Backup and restore mediawiki Given the mediawiki application is enabled - When I create a backup of the mediawiki app data + When I create a backup of the mediawiki app data with name test_mediawiki When I enable mediawiki public registrations And I delete the mediawiki main page - And I restore the mediawiki app data backup + And I restore the mediawiki app data backup with name test_mediawiki Then the mediawiki main page should be restored Then the mediawiki site should allow creating accounts diff --git a/functional_tests/features/mldonkey.feature b/functional_tests/features/mldonkey.feature index 53d25f5f4..188366c0d 100644 --- a/functional_tests/features/mldonkey.feature +++ b/functional_tests/features/mldonkey.feature @@ -24,9 +24,9 @@ Scenario: Backup and restore mldonkey Given the mldonkey application is enabled When all ed2k files are removed from mldonkey And I upload a sample ed2k file to mldonkey - And I create a backup of the mldonkey app data + And I create a backup of the mldonkey app data with name test_mldonkey And all ed2k files are removed from mldonkey - And I restore the mldonkey app data backup + And I restore the mldonkey app data backup with name test_mldonkey Then the mldonkey service should be running And there should be 1 ed2k files listed in mldonkey diff --git a/functional_tests/features/monkeysphere.feature b/functional_tests/features/monkeysphere.feature index 0dda1b863..be30b4b45 100644 --- a/functional_tests/features/monkeysphere.feature +++ b/functional_tests/features/monkeysphere.feature @@ -29,7 +29,7 @@ Scenario: Publish HTTPS keys Scenario: Backup and restore monkeysphere When I import SSH key for mydomain.example in monkeysphere And I import HTTPS key for mydomain.example in monkeysphere - And I create a backup of the monkeysphere app data - And I restore the monkeysphere app data backup + And I create a backup of the monkeysphere app data with name test_monkeysphere + And I restore the monkeysphere app data backup with name test_monkeysphere Then the SSH key should imported for mydomain.example in monkeysphere And the HTTPS key should imported for mydomain.example in monkeysphere diff --git a/functional_tests/features/mumble.feature b/functional_tests/features/mumble.feature index ae6818172..1218201f7 100644 --- a/functional_tests/features/mumble.feature +++ b/functional_tests/features/mumble.feature @@ -17,8 +17,8 @@ Scenario: Enable mumble application # certificates are restored. Scenario: Backup and restore mumble Given the mumble application is enabled - When I create a backup of the mumble app data - And I restore the mumble app data backup + When I create a backup of the mumble app data with name test_mumble + And I restore the mumble app data backup with name test_mumble Then the mumble service should be running Scenario: Disable mumble application diff --git a/functional_tests/features/openvpn.feature b/functional_tests/features/openvpn.feature index 524b7c286..5ebe53e70 100644 --- a/functional_tests/features/openvpn.feature +++ b/functional_tests/features/openvpn.feature @@ -21,8 +21,8 @@ Scenario: Download openvpn profile Scenario: Backup and restore openvpn Given the openvpn application is enabled And I download openvpn profile - When I create a backup of the openvpn app data - And I restore the openvpn app data backup + When I create a backup of the openvpn app data with name test_openvpn + And I restore the openvpn app data backup with name test_openvpn Then the openvpn profile downloaded should be same as before Scenario: Disable openvpn application diff --git a/functional_tests/features/pagekite.feature b/functional_tests/features/pagekite.feature index ed829e4b5..1b6e32862 100644 --- a/functional_tests/features/pagekite.feature +++ b/functional_tests/features/pagekite.feature @@ -21,9 +21,9 @@ Scenario: Configure pagekite application Scenario: Backup and restore pagekite Given the pagekite application is enabled When I configure pagekite with host beforebackup.example.com, port 8081, kite name beforebackup.example.com and kite secret beforebackupsecret - And I create a backup of the pagekite app data + And I create a backup of the pagekite app data with name test_pagekite And I configure pagekite with host afterbackup.example.com, port 8082, kite name afterbackup.example.com and kite secret afterbackupsecret - And I restore the pagekite app data backup + And I restore the pagekite app data backup with name test_pagekite Then the pagekite service should be running And pagekite should be configured with host beforebackup.example.com, port 8081, kite name beforebackup.example.com and kite secret beforebackupsecret diff --git a/functional_tests/features/privoxy.feature b/functional_tests/features/privoxy.feature index 4fb9bf157..66a1f133a 100644 --- a/functional_tests/features/privoxy.feature +++ b/functional_tests/features/privoxy.feature @@ -15,8 +15,8 @@ Scenario: Enable privoxy application Scenario: Backup and restore privoxy Given the privoxy application is enabled - When I create a backup of the privoxy app data - And I restore the privoxy app data backup + When I create a backup of the privoxy app data with name test_privoxy + And I restore the privoxy app data backup with name test_privoxy Then the privoxy service should be running Scenario: Disable privoxy application diff --git a/functional_tests/features/quassel.feature b/functional_tests/features/quassel.feature index 6223536ad..89a64b30b 100644 --- a/functional_tests/features/quassel.feature +++ b/functional_tests/features/quassel.feature @@ -16,8 +16,8 @@ Scenario: Enable quassel application # TODO: Improve this to actually check that data configured servers is restored. Scenario: Backup and restore quassel Given the quassel application is enabled - When I create a backup of the quassel app data - And I restore the quassel app data backup + When I create a backup of the quassel app data with name test_quassel + And I restore the quassel app data backup with name test_quassel Then the quassel service should be running Scenario: Disable quassel application diff --git a/functional_tests/features/roundcube.feature b/functional_tests/features/roundcube.feature index 2f446ed74..ee8ce3f27 100644 --- a/functional_tests/features/roundcube.feature +++ b/functional_tests/features/roundcube.feature @@ -15,8 +15,8 @@ Scenario: Enable roundcube application Scenario: Backup and restore roundcube Given the roundcube application is enabled - When I create a backup of the roundcube app data - And I restore the roundcube app data backup + When I create a backup of the roundcube app data with name test_roundcube + And I restore the roundcube app data backup with name test_roundcube Then the roundcube site should be available Scenario: Disable roundcube application diff --git a/functional_tests/features/samba.feature b/functional_tests/features/samba.feature index 1b5aaf7b9..c8936254d 100644 --- a/functional_tests/features/samba.feature +++ b/functional_tests/features/samba.feature @@ -40,9 +40,9 @@ Scenario: Disable open samba share Scenario: Backup and restore samba Given the samba application is enabled When I enable the home samba share - And I create a backup of the samba app data + And I create a backup of the samba app data with name test_samba And I disable the home samba share - And I restore the samba app data backup + And I restore the samba app data backup with name test_samba Then the samba service should be running And I can write to the home samba share diff --git a/functional_tests/features/searx.feature b/functional_tests/features/searx.feature index 735981ada..e0ca2db14 100644 --- a/functional_tests/features/searx.feature +++ b/functional_tests/features/searx.feature @@ -15,8 +15,8 @@ Scenario: Enable searx application Scenario: Backup and restore searx Given the searx application is enabled - When I create a backup of the searx app data - And I restore the searx app data backup + When I create a backup of the searx app data with name test_searx + And I restore the searx app data backup with name test_searx Then the searx site should be available Scenario: Enable public access diff --git a/functional_tests/features/security.feature b/functional_tests/features/security.feature index 5f1e42f2e..d9dba5b9a 100644 --- a/functional_tests/features/security.feature +++ b/functional_tests/features/security.feature @@ -14,9 +14,9 @@ Scenario: Disable restricted console logins Scenario: Backup and restore security When I enable restricted console logins - And I create a backup of the security app data + And I create a backup of the security app data with name test_security And I disable restricted console logins - And I restore the security app data backup + And I restore the security app data backup with name test_security Then restricted console logins should be enabled Scenario: Enable restricted console logins diff --git a/functional_tests/features/shadowsocks.feature b/functional_tests/features/shadowsocks.feature index cf26f14a7..866b077c0 100644 --- a/functional_tests/features/shadowsocks.feature +++ b/functional_tests/features/shadowsocks.feature @@ -17,9 +17,9 @@ Scenario: Enable shadowsocks application Scenario: Backup and restore shadowsocks Given the shadowsocks application is enabled When I configure shadowsocks with server example.com and password beforebackup123 - And I create a backup of the shadowsocks app data + And I create a backup of the shadowsocks app data with name test_shadowsocks And I configure shadowsocks with server example.org and password afterbackup123 - And I restore the shadowsocks app data backup + And I restore the shadowsocks app data backup with name test_shadowsocks Then the shadowsocks service should be running And shadowsocks should be configured with server example.com and password beforebackup123 diff --git a/functional_tests/features/sharing.feature b/functional_tests/features/sharing.feature index a6908cb55..b77669dc3 100644 --- a/functional_tests/features/sharing.feature +++ b/functional_tests/features/sharing.feature @@ -44,8 +44,8 @@ Scenario: Public share Scenario: Backup and restore sharing Given share tmp is not available When I add a share tmp from path /tmp for admin - And I create a backup of the sharing app data + And I create a backup of the sharing app data with name test_sharing And I remove share tmp - And I restore the sharing app data backup + And I restore the sharing app data backup with name test_sharing Then the share tmp should be listed from path /tmp for admin And the share tmp should be accessible diff --git a/functional_tests/features/ssh.feature b/functional_tests/features/ssh.feature index 519525053..e8a169508 100644 --- a/functional_tests/features/ssh.feature +++ b/functional_tests/features/ssh.feature @@ -22,6 +22,6 @@ Scenario: Disable ssh application # restored. Scenario: Backup and restore ssh Given the ssh application is enabled - When I create a backup of the ssh app data - And I restore the ssh app data backup + When I create a backup of the ssh app data with name test_ssh + And I restore the ssh app data backup with name test_ssh Then the ssh service should be running diff --git a/functional_tests/features/storage_snapshots.feature b/functional_tests/features/storage_snapshots.feature index cfb0eb672..8899499ad 100644 --- a/functional_tests/features/storage_snapshots.feature +++ b/functional_tests/features/storage_snapshots.feature @@ -20,7 +20,7 @@ Scenario: Configure snapshots Scenario: Backup and restore snapshot When I configure snapshots with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 - And I create a backup of the snapshot app data + And I create a backup of the snapshot app data with name test_storage_snapshots And I configure snapshots with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 - And I restore the snapshot app data backup + And I restore the snapshot app data backup with name test_storage_snapshots Then snapshots should be configured with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 diff --git a/functional_tests/features/syncthing.feature b/functional_tests/features/syncthing.feature index 932539233..84360256f 100644 --- a/functional_tests/features/syncthing.feature +++ b/functional_tests/features/syncthing.feature @@ -29,9 +29,9 @@ Scenario: Backup and restore syncthing Given the syncthing application is enabled And syncthing folder Test is not present When I add a folder /tmp as syncthing folder Test - And I create a backup of the syncthing app data + And I create a backup of the syncthing app data with name test_syncthing And I remove syncthing folder Test - And I restore the syncthing app data backup + And I restore the syncthing app data backup with name test_syncthing Then syncthing folder Test should be present Scenario: Disable syncthing application diff --git a/functional_tests/features/tahoe.feature b/functional_tests/features/tahoe.feature index c90ac6aa3..ad12c10b7 100644 --- a/functional_tests/features/tahoe.feature +++ b/functional_tests/features/tahoe.feature @@ -40,9 +40,9 @@ Scenario: Remove tahoe introducer Scenario: Backup and restore tahoe Given the tahoe application is enabled And backupdomain.example is a tahoe introducer - When I create a backup of the tahoe app data + When I create a backup of the tahoe app data with name test_tahoe And I remove backupdomain.example as a tahoe introducer - And I restore the tahoe app data backup + And I restore the tahoe app data backup with name test_tahoe Then the tahoe service should be running And backupdomain.example should be a tahoe connected introducer diff --git a/functional_tests/features/tor.feature b/functional_tests/features/tor.feature index 3cf89f833..80513816e 100644 --- a/functional_tests/features/tor.feature +++ b/functional_tests/features/tor.feature @@ -44,10 +44,10 @@ Scenario: Backup and restore tor And tor relay is enabled And tor bridge relay is enabled And tor hidden services are enabled - When I create a backup of the tor app data + When I create a backup of the tor app data with name test_tor And I disable tor relay And I disable tor hidden services - And I restore the tor app data backup + And I restore the tor app data backup with name test_tor Then the tor service should be running And tor relay should be enabled And tor bridge relay should be enabled diff --git a/functional_tests/features/transmission.feature b/functional_tests/features/transmission.feature index 5bb75f642..1b992c411 100644 --- a/functional_tests/features/transmission.feature +++ b/functional_tests/features/transmission.feature @@ -23,9 +23,9 @@ Scenario: Backup and restore transmission Given the transmission application is enabled When all torrents are removed from transmission And I upload a sample torrent to transmission - And I create a backup of the transmission app data + And I create a backup of the transmission app data with name test_transmission And all torrents are removed from transmission - And I restore the transmission app data backup + And I restore the transmission app data backup with name test_transmission Then the transmission service should be running And there should be 1 torrents listed in transmission diff --git a/functional_tests/features/ttrss.feature b/functional_tests/features/ttrss.feature index e3314cccf..d208e4f2a 100644 --- a/functional_tests/features/ttrss.feature +++ b/functional_tests/features/ttrss.feature @@ -16,9 +16,9 @@ Scenario: Enable ttrss application Scenario: Backup and restore ttrss Given the ttrss application is enabled And I subscribe to a feed in ttrss - When I create a backup of the ttrss app data + When I create a backup of the ttrss app data with name test_ttrss And I unsubscribe from the feed in ttrss - And I restore the ttrss app data backup + And I restore the ttrss app data backup with name test_ttrss Then the ttrss service should be running And I should be subscribed to the feed in ttrss diff --git a/functional_tests/features/upgrades.feature b/functional_tests/features/upgrades.feature index ff8551c3c..a196c4ea6 100644 --- a/functional_tests/features/upgrades.feature +++ b/functional_tests/features/upgrades.feature @@ -14,9 +14,9 @@ Scenario: Enable automatic upgrades Scenario: Backup and restore upgrades When I enable automatic upgrades - And I create a backup of the upgrades app data + And I create a backup of the upgrades app data with name test_upgrades And I disable automatic upgrades - And I restore the upgrades app data backup + And I restore the upgrades app data backup with name test_upgrades Then automatic upgrades should be enabled Scenario: Disable automatic upgrades diff --git a/functional_tests/step_definitions/system.py b/functional_tests/step_definitions/system.py index 96eb43c80..2eb70e629 100644 --- a/functional_tests/step_definitions/system.py +++ b/functional_tests/step_definitions/system.py @@ -167,22 +167,27 @@ def dynamicdns_has_original_config(session_browser): assert system.dynamicdns_has_original_config(session_browser) -@when(parsers.parse('I create a backup of the {app_name:w} app data')) -def backup_create(session_browser, app_name): - if config.getboolean('DEFAULT', 'delete_root_backup_archives'): - system.backup_delete_root_archives(session_browser) - system.backup_create(session_browser, app_name) +@when( + parsers.parse( + 'I create a backup of the {app_name:w} app data with name {archive_name:w}' + )) +def backup_create(session_browser, app_name, archive_name): + system.backup_create(session_browser, app_name, archive_name) -@when(parsers.parse('I download the latest app data backup')) -def backup_download(session_browser, downloaded_file_info): - file_path = system.download_latest_backup(session_browser) +@when( + parsers.parse('I download the app data backup with name {archive_name:w}')) +def backup_download(session_browser, downloaded_file_info, archive_name): + file_path = system.download_backup(session_browser, archive_name) downloaded_file_info['path'] = file_path -@when(parsers.parse('I restore the {app_name:w} app data backup')) -def backup_restore(session_browser, app_name): - system.backup_restore(session_browser, app_name) +@when( + parsers.parse( + 'I restore the {app_name:w} app data backup with name {archive_name:w}' + )) +def backup_restore(session_browser, app_name, archive_name): + system.backup_restore(session_browser, app_name, archive_name) @when(parsers.parse('I restore the downloaded app data backup')) diff --git a/functional_tests/support/system.py b/functional_tests/support/system.py index 20e79e243..dee5af398 100644 --- a/functional_tests/support/system.py +++ b/functional_tests/support/system.py @@ -190,22 +190,30 @@ def dynamicdns_change_config(browser): submit(browser) -def backup_delete_root_archives(browser): - """Delete all archives of the root borg repository""" - browser.visit(default_url + '/plinth/sys/backups/') - path = "//a[starts-with(@href,'/plinth/sys/backups/root/delete/')]" - while browser.find_by_xpath(path): - browser.find_by_xpath(path).first.click() +def _click_button_and_confirm(browser, href): + buttons = browser.find_link_by_href(href) + if buttons: + buttons.first.click() with wait_for_page_update(browser, expected_url='/plinth/sys/backups/'): submit(browser) -def backup_create(browser, app_name): +def backup_delete_archive_by_name(browser, archive_name): + nav_to_module(browser, 'backups') + href = f'/plinth/sys/backups/root/delete/{archive_name}/' + _click_button_and_confirm(browser, href) + + +def backup_create(browser, app_name, archive_name=None): application.install(browser, 'backups') + if archive_name: + backup_delete_archive_by_name(browser, archive_name) + browser.find_link_by_href('/plinth/sys/backups/create/').first.click() - for app in browser.find_by_css('input[type=checkbox]'): - app.uncheck() + browser.find_by_id('select-all').uncheck() + if archive_name: + browser.find_by_id('id_backups-name').fill(archive_name) # ensure the checkbox is scrolled into view browser.execute_script('window.scrollTo(0, 0)') @@ -213,13 +221,10 @@ def backup_create(browser, app_name): submit(browser) -def backup_restore(browser, app_name): +def backup_restore(browser, app_name, archive_name=None): nav_to_module(browser, 'backups') - path = "//a[starts-with(@href,'/plinth/sys/backups/root/restore-archive/')]" - # assume that want to restore the last (most recently created) backup - browser.find_by_xpath(path).last.click() - with wait_for_page_update(browser, expected_url='/plinth/sys/backups/'): - submit(browser) + href = f'/plinth/sys/backups/root/restore-archive/{archive_name}/' + _click_button_and_confirm(browser, href) def backup_upload_and_restore(browser, app_name, downloaded_file_path): @@ -234,11 +239,10 @@ def backup_upload_and_restore(browser, app_name, downloaded_file_path): submit(browser) -def download_latest_backup(browser): +def download_backup(browser, archive_name=None): nav_to_module(browser, 'backups') - path = "//a[starts-with(@href,'/plinth/sys/backups/root/download/')]" - ele = browser.driver.find_elements_by_xpath(path)[0] - url = ele.get_attribute('href') + href = f'/plinth/sys/backups/root/download/{archive_name}/' + url = config['DEFAULT']['url'] + href file_path = download_file_logged_in(browser, url, suffix='.tar.gz') return file_path From b3fd24ce6fb113f615f4ed2b384ba41882e22f04 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Thu, 6 Feb 2020 20:20:04 +0530 Subject: [PATCH 03/41] functional-tests: Move @backups to Scenario level Signed-off-by: Joseph Nuthalapati [sunil: Fix marks for quassel app] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- functional_tests/features/bind.feature | 3 ++- functional_tests/features/date_and_time.feature | 3 ++- functional_tests/features/deluge.feature | 3 ++- functional_tests/features/dynamicdns.feature | 3 ++- functional_tests/features/ejabberd.feature | 3 ++- functional_tests/features/gitweb.feature | 3 ++- functional_tests/features/ikiwiki.feature | 3 ++- functional_tests/features/jsxc.feature | 3 ++- functional_tests/features/mediawiki.feature | 3 ++- functional_tests/features/mldonkey.feature | 3 ++- functional_tests/features/monkeysphere.feature | 3 ++- functional_tests/features/mumble.feature | 3 ++- functional_tests/features/openvpn.feature | 3 ++- functional_tests/features/pagekite.feature | 3 ++- functional_tests/features/privoxy.feature | 3 ++- functional_tests/features/quassel.feature | 3 ++- functional_tests/features/roundcube.feature | 3 ++- functional_tests/features/samba.feature | 3 ++- functional_tests/features/searx.feature | 3 ++- functional_tests/features/shadowsocks.feature | 3 ++- functional_tests/features/sharing.feature | 3 ++- functional_tests/features/ssh.feature | 3 ++- functional_tests/features/storage_snapshots.feature | 3 ++- functional_tests/features/syncthing.feature | 3 ++- functional_tests/features/tahoe.feature | 3 ++- functional_tests/features/tor.feature | 3 ++- functional_tests/features/transmission.feature | 3 ++- functional_tests/features/ttrss.feature | 3 ++- functional_tests/features/upgrades.feature | 3 ++- 29 files changed, 58 insertions(+), 29 deletions(-) diff --git a/functional_tests/features/bind.feature b/functional_tests/features/bind.feature index 3fd02d314..f0bac0d46 100644 --- a/functional_tests/features/bind.feature +++ b/functional_tests/features/bind.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @bind @backups +@apps @bind Feature: Bind Domain Name Server Configure the Bind Domain Name Server. @@ -31,6 +31,7 @@ Scenario: Disable bind DNSSEC When I disable bind DNSSEC Then bind DNSSEC should be disabled +@backups Scenario: Backup and restore bind Given the bind application is enabled When I set bind forwarders to 1.1.1.1 diff --git a/functional_tests/features/date_and_time.feature b/functional_tests/features/date_and_time.feature index fa8e9d39f..e36b75f5e 100644 --- a/functional_tests/features/date_and_time.feature +++ b/functional_tests/features/date_and_time.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@essential @date_and_time @system @backups +@essential @date_and_time @system Feature: Date and Time Configure time zone and network time service. @@ -23,6 +23,7 @@ Scenario: Set timezone When I set the time zone to Africa/Abidjan Then the time zone should be Africa/Abidjan +@backups Scenario: Backup and restore datetime When I set the time zone to Africa/Accra And I create a backup of the datetime app data with name test_datetime diff --git a/functional_tests/features/deluge.feature b/functional_tests/features/deluge.feature index 2da871917..419a9a45c 100644 --- a/functional_tests/features/deluge.feature +++ b/functional_tests/features/deluge.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @deluge @backups +@apps @deluge Feature: Deluge BitTorrent Client Run the Deluge BitTorrent client. @@ -19,6 +19,7 @@ Scenario: Upload a torrent to deluge And I upload a sample torrent to deluge Then there should be 1 torrents listed in deluge +@backups Scenario: Backup and restore deluge Given the deluge application is enabled When all torrents are removed from deluge diff --git a/functional_tests/features/dynamicdns.feature b/functional_tests/features/dynamicdns.feature index 57023cf0e..011cdbdc6 100644 --- a/functional_tests/features/dynamicdns.feature +++ b/functional_tests/features/dynamicdns.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @dynamicdns @backups +@apps @dynamicdns Feature: Dynamic DNS Client Update public IP to a GnuDIP server. @@ -8,6 +8,7 @@ Background: Given I'm a logged in user And the dynamicdns application is installed +@backups Scenario: Backup and restore configuration Given dynamicdns is configured When I create a backup of the dynamicdns app data with name test_dynamicdns diff --git a/functional_tests/features/ejabberd.feature b/functional_tests/features/ejabberd.feature index f57d2c63d..774e768cc 100644 --- a/functional_tests/features/ejabberd.feature +++ b/functional_tests/features/ejabberd.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @ejabberd @backups +@apps @ejabberd Feature: Ejabberd Chat Server Run ejabberd chat server. @@ -23,6 +23,7 @@ Scenario: Disable message archive management When I disable message archive management Then the ejabberd service should be running +@backups Scenario: Backup and restore ejabberd Given the ejabberd application is enabled And I have added a contact to my roster diff --git a/functional_tests/features/gitweb.feature b/functional_tests/features/gitweb.feature index d509199e2..3719632a4 100644 --- a/functional_tests/features/gitweb.feature +++ b/functional_tests/features/gitweb.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @gitweb @backups @sso +@apps @gitweb @sso Feature: gitweb Simple Git Hosting Git web interface. @@ -33,6 +33,7 @@ Scenario: Delete repository When I delete the repository Then the repository should not be listed +@backups Scenario: Backup and restore gitweb Given the gitweb application is enabled And a repository diff --git a/functional_tests/features/ikiwiki.feature b/functional_tests/features/ikiwiki.feature index f25a0dae3..7b6ab085b 100644 --- a/functional_tests/features/ikiwiki.feature +++ b/functional_tests/features/ikiwiki.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @ikiwiki @backups +@apps @ikiwiki Feature: ikiwiki Wiki and Blog Manage wikis and blogs. @@ -13,6 +13,7 @@ Scenario: Enable wiki application When I enable the wiki application Then the wiki site should be available +@backups Scenario: Backup and restore wiki Given the wiki application is enabled When there is an ikiwiki wiki diff --git a/functional_tests/features/jsxc.feature b/functional_tests/features/jsxc.feature index 677a1d033..f39577bd9 100644 --- a/functional_tests/features/jsxc.feature +++ b/functional_tests/features/jsxc.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @jsxc @backups +@apps @jsxc Feature: JSXC XMPP Client Run the JSXC XMPP client. @@ -11,6 +11,7 @@ Scenario: Install jsxc application Given the jsxc application is installed Then the jsxc site should be available +@backups Scenario: Backup and restore jsxc Given the jsxc application is installed When I create a backup of the jsxc app data with name test_jsxc diff --git a/functional_tests/features/mediawiki.feature b/functional_tests/features/mediawiki.feature index e3b0de90f..fd48e1297 100644 --- a/functional_tests/features/mediawiki.feature +++ b/functional_tests/features/mediawiki.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @mediawiki @backups +@apps @mediawiki Feature: MediaWiki Wiki Engine Manage wikis, multimedia and more. @@ -63,6 +63,7 @@ Scenario: Upload SVG image When I upload an image named apps-background.svg to mediawiki with credentials admin and whatever123 Then there should be Apps-background.svg image +@backups Scenario: Backup and restore mediawiki Given the mediawiki application is enabled When I create a backup of the mediawiki app data with name test_mediawiki diff --git a/functional_tests/features/mldonkey.feature b/functional_tests/features/mldonkey.feature index 188366c0d..ea4f95b13 100644 --- a/functional_tests/features/mldonkey.feature +++ b/functional_tests/features/mldonkey.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @mldonkey @backups @sso +@apps @mldonkey @sso Feature: MLDonkey eDonkey Network Client Run the eDonkey Network client. @@ -20,6 +20,7 @@ Scenario: Upload an ed2k file to mldonkey And I upload a sample ed2k file to mldonkey Then there should be 1 ed2k files listed in mldonkey +@backups Scenario: Backup and restore mldonkey Given the mldonkey application is enabled When all ed2k files are removed from mldonkey diff --git a/functional_tests/features/monkeysphere.feature b/functional_tests/features/monkeysphere.feature index be30b4b45..05d70a5b3 100644 --- a/functional_tests/features/monkeysphere.feature +++ b/functional_tests/features/monkeysphere.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @monkeysphere @backups +@apps @monkeysphere Feature: Monkeysphere Import and publish OpenPGP keys for SSH and HTTPS keys @@ -26,6 +26,7 @@ Scenario: Publish HTTPS keys Given the HTTPS key for mydomain.example is imported in monkeysphere Then I should be able to publish HTTPS key for mydomain.example in monkeysphere +@backups Scenario: Backup and restore monkeysphere When I import SSH key for mydomain.example in monkeysphere And I import HTTPS key for mydomain.example in monkeysphere diff --git a/functional_tests/features/mumble.feature b/functional_tests/features/mumble.feature index 1218201f7..d5b01664e 100644 --- a/functional_tests/features/mumble.feature +++ b/functional_tests/features/mumble.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @mumble @backups +@apps @mumble Feature: Mumble Voice Chat Run Mumble voice chat server. @@ -15,6 +15,7 @@ Scenario: Enable mumble application # TODO: Improve this to actually check that data such as rooms, identity or # certificates are restored. +@backups Scenario: Backup and restore mumble Given the mumble application is enabled When I create a backup of the mumble app data with name test_mumble diff --git a/functional_tests/features/openvpn.feature b/functional_tests/features/openvpn.feature index 5ebe53e70..3e7ff9e23 100644 --- a/functional_tests/features/openvpn.feature +++ b/functional_tests/features/openvpn.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @openvpn @backups +@apps @openvpn Feature: OpenVPN - Virtual Private Network Setup and configure OpenVPN @@ -18,6 +18,7 @@ Scenario: Download openvpn profile Given the openvpn application is enabled Then the openvpn profile should be downloadable +@backups Scenario: Backup and restore openvpn Given the openvpn application is enabled And I download openvpn profile diff --git a/functional_tests/features/pagekite.feature b/functional_tests/features/pagekite.feature index 1b6e32862..5d8afcb3b 100644 --- a/functional_tests/features/pagekite.feature +++ b/functional_tests/features/pagekite.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @pagekite @backups +@apps @pagekite Feature: Pagekite Public Visibility Configure Pagekite public visitbility server. @@ -18,6 +18,7 @@ Scenario: Configure pagekite application When I configure pagekite with host pagekite.example.com, port 8080, kite name mykite.example.com and kite secret mysecret Then pagekite should be configured with host pagekite.example.com, port 8080, kite name mykite.example.com and kite secret mysecret +@backups Scenario: Backup and restore pagekite Given the pagekite application is enabled When I configure pagekite with host beforebackup.example.com, port 8081, kite name beforebackup.example.com and kite secret beforebackupsecret diff --git a/functional_tests/features/privoxy.feature b/functional_tests/features/privoxy.feature index 66a1f133a..ff397339d 100644 --- a/functional_tests/features/privoxy.feature +++ b/functional_tests/features/privoxy.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @privoxy @backups +@apps @privoxy Feature: Privoxy Web Proxy Proxy web connections for enhanced privacy. @@ -13,6 +13,7 @@ Scenario: Enable privoxy application When I enable the privoxy application Then the privoxy service should be running +@backups Scenario: Backup and restore privoxy Given the privoxy application is enabled When I create a backup of the privoxy app data with name test_privoxy diff --git a/functional_tests/features/quassel.feature b/functional_tests/features/quassel.feature index 89a64b30b..2012ed0cc 100644 --- a/functional_tests/features/quassel.feature +++ b/functional_tests/features/quassel.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @quassel @backups +@apps @quassel Feature: Quassel IRC Client Run Quassel core. @@ -14,6 +14,7 @@ Scenario: Enable quassel application Then the quassel service should be running # TODO: Improve this to actually check that data configured servers is restored. +@backups Scenario: Backup and restore quassel Given the quassel application is enabled When I create a backup of the quassel app data with name test_quassel diff --git a/functional_tests/features/roundcube.feature b/functional_tests/features/roundcube.feature index ee8ce3f27..0baa92055 100644 --- a/functional_tests/features/roundcube.feature +++ b/functional_tests/features/roundcube.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @roundcube @backups +@apps @roundcube Feature: Roundcube Email Client Run webmail client. @@ -13,6 +13,7 @@ Scenario: Enable roundcube application When I enable the roundcube application Then the roundcube site should be available +@backups Scenario: Backup and restore roundcube Given the roundcube application is enabled When I create a backup of the roundcube app data with name test_roundcube diff --git a/functional_tests/features/samba.feature b/functional_tests/features/samba.feature index c8936254d..3f5764fde 100644 --- a/functional_tests/features/samba.feature +++ b/functional_tests/features/samba.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @samba @backups +@apps @samba Feature: Samba File Sharing Configure samba file sharing service. @@ -37,6 +37,7 @@ Scenario: Disable open samba share When I disable the open samba share Then the open samba share should not be available +@backups Scenario: Backup and restore samba Given the samba application is enabled When I enable the home samba share diff --git a/functional_tests/features/searx.feature b/functional_tests/features/searx.feature index e0ca2db14..66b01baa4 100644 --- a/functional_tests/features/searx.feature +++ b/functional_tests/features/searx.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @searx @backups @sso +@apps @searx @sso Feature: Searx Web Search Run Searx metasearch engine. @@ -13,6 +13,7 @@ Scenario: Enable searx application When I enable the searx application Then the searx site should be available +@backups Scenario: Backup and restore searx Given the searx application is enabled When I create a backup of the searx app data with name test_searx diff --git a/functional_tests/features/shadowsocks.feature b/functional_tests/features/shadowsocks.feature index 866b077c0..67167e004 100644 --- a/functional_tests/features/shadowsocks.feature +++ b/functional_tests/features/shadowsocks.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @shadowsocks @backups +@apps @shadowsocks Feature: Shadowsocks Socks5 Proxy Run the Shadowsocks Socks5 proxy client. @@ -14,6 +14,7 @@ Scenario: Enable shadowsocks application When I enable the shadowsocks application Then the shadowsocks service should be running +@backups Scenario: Backup and restore shadowsocks Given the shadowsocks application is enabled When I configure shadowsocks with server example.com and password beforebackup123 diff --git a/functional_tests/features/sharing.feature b/functional_tests/features/sharing.feature index b77669dc3..3d3c16765 100644 --- a/functional_tests/features/sharing.feature +++ b/functional_tests/features/sharing.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @sharing @backups +@apps @sharing Feature: Sharing Share server folders over HTTP, etc. @@ -41,6 +41,7 @@ Scenario: Public share And I log out Then the share_tmp site should be available +@backups Scenario: Backup and restore sharing Given share tmp is not available When I add a share tmp from path /tmp for admin diff --git a/functional_tests/features/ssh.feature b/functional_tests/features/ssh.feature index e8a169508..251125044 100644 --- a/functional_tests/features/ssh.feature +++ b/functional_tests/features/ssh.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @ssh @backups +@apps @ssh Feature: Secure Shell Server Run secure shell server. @@ -20,6 +20,7 @@ Scenario: Disable ssh application # TODO: Improve this to actually check that earlier ssh certificate has been # restored. +@backups Scenario: Backup and restore ssh Given the ssh application is enabled When I create a backup of the ssh app data with name test_ssh diff --git a/functional_tests/features/storage_snapshots.feature b/functional_tests/features/storage_snapshots.feature index 8899499ad..542d9d90e 100644 --- a/functional_tests/features/storage_snapshots.feature +++ b/functional_tests/features/storage_snapshots.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@system @snapshot @backups +@system @snapshot Feature: Storage Snapshots Run storage snapshots application - Snapper. @@ -18,6 +18,7 @@ Scenario: Configure snapshots When I configure snapshots with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 Then snapshots should be configured with free space 20, timeline snapshots enabled, software snapshots enabled, hourly limit 3, daily limit 2, weekly limit 1, monthly limit 1, yearly limit 1 +@backups Scenario: Backup and restore snapshot When I configure snapshots with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 And I create a backup of the snapshot app data with name test_storage_snapshots diff --git a/functional_tests/features/syncthing.feature b/functional_tests/features/syncthing.feature index 84360256f..a397eacac 100644 --- a/functional_tests/features/syncthing.feature +++ b/functional_tests/features/syncthing.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @syncthing @sso @backups +@apps @syncthing @sso Feature: Syncthing File Synchronization Run Syncthing File Synchronization server. @@ -25,6 +25,7 @@ Scenario: Remove a syncthing folder When I remove syncthing folder Test Then syncthing folder Test should not be present +@backups Scenario: Backup and restore syncthing Given the syncthing application is enabled And syncthing folder Test is not present diff --git a/functional_tests/features/tahoe.feature b/functional_tests/features/tahoe.feature index ad12c10b7..8dcf9ca27 100644 --- a/functional_tests/features/tahoe.feature +++ b/functional_tests/features/tahoe.feature @@ -4,7 +4,7 @@ # /var/lib/tahoe-lafs and failes to start in the next run. Enable tests after # this is fixed. -@apps @tahoe @backups @skip +@apps @tahoe @skip Feature: Tahoe-LAFS distribute file storage Run the Tahoe distribute file storage server @@ -37,6 +37,7 @@ Scenario: Remove tahoe introducer When I remove anotherdomain.example as a tahoe introducer Then anotherdomain.example should not be a tahoe connected introducer +@backups Scenario: Backup and restore tahoe Given the tahoe application is enabled And backupdomain.example is a tahoe introducer diff --git a/functional_tests/features/tor.feature b/functional_tests/features/tor.feature index 80513816e..ed2dad8b2 100644 --- a/functional_tests/features/tor.feature +++ b/functional_tests/features/tor.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @tor @backups +@apps @tor Feature: Tor Anonymity Network Manage Tor configuration. @@ -39,6 +39,7 @@ Scenario: Set download software packages over tor # TODO: Test more thoroughly by checking same hidden service is restored and by # actually connecting using Tor. +@backups Scenario: Backup and restore tor Given the tor application is enabled And tor relay is enabled diff --git a/functional_tests/features/transmission.feature b/functional_tests/features/transmission.feature index 1b992c411..bec006c7b 100644 --- a/functional_tests/features/transmission.feature +++ b/functional_tests/features/transmission.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @transmission @backups @sso +@apps @transmission @sso Feature: Transmission BitTorrent Client Run the Transmission BitTorrent client. @@ -19,6 +19,7 @@ Scenario: Upload a torrent to transmission And I upload a sample torrent to transmission Then there should be 1 torrents listed in transmission +@backups Scenario: Backup and restore transmission Given the transmission application is enabled When all torrents are removed from transmission diff --git a/functional_tests/features/ttrss.feature b/functional_tests/features/ttrss.feature index d208e4f2a..b1efdfa80 100644 --- a/functional_tests/features/ttrss.feature +++ b/functional_tests/features/ttrss.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@apps @ttrss @sso @backups +@apps @ttrss @sso Feature: TT-RSS News Feed Reader Run TT-RSS News Feed Reader. @@ -13,6 +13,7 @@ Scenario: Enable ttrss application When I enable the ttrss application Then the ttrss service should be running +@backups Scenario: Backup and restore ttrss Given the ttrss application is enabled And I subscribe to a feed in ttrss diff --git a/functional_tests/features/upgrades.feature b/functional_tests/features/upgrades.feature index a196c4ea6..e828c7afc 100644 --- a/functional_tests/features/upgrades.feature +++ b/functional_tests/features/upgrades.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@essential @upgrades @system @backups +@essential @upgrades @system Feature: Software Upgrades Configure automatic software upgrades @@ -12,6 +12,7 @@ Scenario: Enable automatic upgrades When I enable automatic upgrades Then automatic upgrades should be enabled +@backups Scenario: Backup and restore upgrades When I enable automatic upgrades And I create a backup of the upgrades app data with name test_upgrades From cce51cd9d0f819000941647e7fa9bfb796a31b10 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Fri, 7 Feb 2020 11:33:03 +0530 Subject: [PATCH 04/41] functional-tests: Leave tor+http test disabled Downloading software packages over tor+http is a significant performance cost to subsequent tests. Signed-off-by: Joseph Nuthalapati [sunil: Drop unnecessary changes to step definitions] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- functional_tests/features/tor.feature | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/functional_tests/features/tor.feature b/functional_tests/features/tor.feature index ed2dad8b2..4bd1f46f9 100644 --- a/functional_tests/features/tor.feature +++ b/functional_tests/features/tor.feature @@ -33,9 +33,9 @@ Scenario: Set tor hidden services configuration And tor hidden services information should be displayed Scenario: Set download software packages over tor - Given download software packages over tor is disabled - When I enable download software packages over tor - Then download software packages over tor should be enabled + Given download software packages over tor is enabled + When I disable download software packages over tor + Then download software packages over tor should be disabled # TODO: Test more thoroughly by checking same hidden service is restored and by # actually connecting using Tor. From 058702f2b8f28571fb8e0a3afa35049ba1695562 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 18 May 2020 21:44:37 -0700 Subject: [PATCH 05/41] openvpn: Use app toggle button and common app view Tests performed: - When app is not setup, app toggle button is not shown. Running status of the app is also not present in the page. Profile download is not shown. Setup button is shown. - When app is being setup, app toggle button is not shown. Running status of the app is also not present in the page. Page keeps refreshing every 3 seconds during setup. Profile download is not shown. A progress spinner is shown that setup is currently running. - When app setup has completed, app toggle button is shown. Running status is shown. When daemon is stopped, a message that daemon is not running is show. Profile download is shown. - Transition from being setup into setup completed is done with a single page refresh. Message that setup is completed is shown. - Port forwarding information is always shown (before, during and after setup). - Run functional tests for OpenVPN. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- functional_tests/support/application.py | 1 - plinth/modules/openvpn/__init__.py | 7 ++ plinth/modules/openvpn/forms.py | 13 --- plinth/modules/openvpn/templates/openvpn.html | 16 ++-- plinth/modules/openvpn/urls.py | 3 +- plinth/modules/openvpn/views.py | 96 +++++-------------- 6 files changed, 41 insertions(+), 95 deletions(-) delete mode 100644 plinth/modules/openvpn/forms.py diff --git a/functional_tests/support/application.py b/functional_tests/support/application.py index 128a58f3f..6f52037dd 100644 --- a/functional_tests/support/application.py +++ b/functional_tests/support/application.py @@ -26,7 +26,6 @@ app_module = { app_checkbox_id = { 'tor': 'id_tor-enabled', - 'openvpn': 'id_openvpn-enabled', } default_url = config['DEFAULT']['url'] diff --git a/plinth/modules/openvpn/__init__.py b/plinth/modules/openvpn/__init__.py index bfc7964cc..29d612c94 100644 --- a/plinth/modules/openvpn/__init__.py +++ b/plinth/modules/openvpn/__init__.py @@ -36,12 +36,19 @@ port_forwarding_info = [('UDP', 1194)] app = None +setup_process = None + class OpenVPNApp(app_module.App): """FreedomBox app for OpenVPN.""" app_id = 'openvpn' + @property + def can_be_disabled(self): + """Return whether the app can be disabled.""" + return is_setup() and not setup_process + def __init__(self): """Create components for the app.""" super().__init__() diff --git a/plinth/modules/openvpn/forms.py b/plinth/modules/openvpn/forms.py deleted file mode 100644 index 31ec5c3f5..000000000 --- a/plinth/modules/openvpn/forms.py +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later -""" -FreedomBox app for configuring OpenVPN. -""" - -from django import forms -from django.utils.translation import ugettext_lazy as _ - - -class OpenVpnForm(forms.Form): # pylint: disable=W0232 - """OpenVPN configuration form.""" - enabled = forms.BooleanField(label=_('Enable OpenVPN server'), - required=False) diff --git a/plinth/modules/openvpn/templates/openvpn.html b/plinth/modules/openvpn/templates/openvpn.html index 54b29bc0b..46a96bdef 100644 --- a/plinth/modules/openvpn/templates/openvpn.html +++ b/plinth/modules/openvpn/templates/openvpn.html @@ -20,6 +20,10 @@ {% block status %} + {% if status.is_setup and not status.setup_running %} + {{ block.super }} + {% endif %} + {% if not status.is_setup and not status.setup_running %}

{% trans "Status" %}

@@ -41,7 +45,7 @@ {% endif %} - {% if not status.is_setup and status.setup_running %} + {% if status.setup_running %}

{% trans "Status" %}

@@ -59,15 +63,11 @@

{% endif %} - {% if status.is_setup %} - {{ block.super }} - {% endif %} - {% endblock %} {% block configuration %} - {% if status.is_setup %} + {% if status.is_setup and not status.setup_running %}

{% trans "Profile" %}

@@ -98,10 +98,6 @@ {% endif %} - {% if status.is_setup %} - {{ block.super }} - {% endif %} - {% endblock %} {% block page_js %} diff --git a/plinth/modules/openvpn/urls.py b/plinth/modules/openvpn/urls.py index 793915bf5..3bd56c108 100644 --- a/plinth/modules/openvpn/urls.py +++ b/plinth/modules/openvpn/urls.py @@ -6,10 +6,11 @@ URLs for the OpenVPN module. from django.conf.urls import url from plinth.utils import non_admin_view + from . import views urlpatterns = [ - url(r'^apps/openvpn/$', views.index, name='index'), + url(r'^apps/openvpn/$', views.OpenVPNAppView.as_view(), name='index'), url(r'^apps/openvpn/setup/$', views.setup, name='setup'), url(r'^apps/openvpn/profile/$', non_admin_view(views.profile), name='profile'), diff --git a/plinth/modules/openvpn/views.py b/plinth/modules/openvpn/views.py index 064678089..422e91527 100644 --- a/plinth/modules/openvpn/views.py +++ b/plinth/modules/openvpn/views.py @@ -8,59 +8,45 @@ import logging from django.contrib import messages from django.http import HttpResponse from django.shortcuts import redirect -from django.template.response import TemplateResponse from django.utils.translation import ugettext as _ from django.views.decorators.http import require_POST -from plinth import actions, daemon +from plinth import actions from plinth.modules import config, openvpn - -from .forms import OpenVpnForm +from plinth.views import AppView logger = logging.getLogger(__name__) -setup_process = None +class OpenVPNAppView(AppView): + """Show OpenVPN app main page.""" + app_id = 'openvpn' + template_name = 'openvpn.html' + port_forwarding_info = openvpn.port_forwarding_info -def index(request): - """Serve configuration page.""" - status = get_status() + def dispatch(self, request, *args, **kwargs): + """Collect the result of running setup process.""" + if bool(openvpn.setup_process): + _collect_setup_result(request) - if status['setup_running']: - _collect_setup_result(request) + return super().dispatch(request, *args, **kwargs) - form = None - - if request.method == 'POST': - form = OpenVpnForm(request.POST, prefix='openvpn') - # pylint: disable=E1101 - if form.is_valid(): - _apply_changes(request, status, form.cleaned_data) - status = get_status() - form = OpenVpnForm(initial=status, prefix='openvpn') - else: - form = OpenVpnForm(initial=status, prefix='openvpn') - - return TemplateResponse( - request, 'openvpn.html', { - 'app_id': 'openvpn', - 'app_info': openvpn.app.info, - 'port_forwarding_info': openvpn.port_forwarding_info, - 'status': status, - 'form': form, - 'is_running': status['is_running'], - 'has_diagnostics': True, - 'is_enabled': status['enabled'], - }) + def get_context_data(self, *args, **kwargs): + """Add additional context data for template.""" + context = super().get_context_data(*args, **kwargs) + context['status'] = { + 'is_setup': openvpn.is_setup(), + 'setup_running': bool(openvpn.setup_process), + } + return context @require_POST def setup(request): """Start the setup process.""" - global setup_process - if not openvpn.is_setup() and not setup_process: - setup_process = actions.superuser_run('openvpn', ['setup'], - run_in_background=True) + if not openvpn.is_setup() and not openvpn.setup_process: + openvpn.setup_process = actions.superuser_run('openvpn', ['setup'], + run_in_background=True) openvpn.app.enable() @@ -86,24 +72,12 @@ def profile(request): return response -def get_status(): - """Get the current settings from OpenVPN server.""" - - return { - 'is_setup': openvpn.is_setup(), - 'setup_running': bool(setup_process), - 'enabled': openvpn.app.is_enabled(), - 'is_running': daemon.app_is_running(openvpn.app) - } - - def _collect_setup_result(request): """Handle setup process is completion.""" - global setup_process - if not setup_process: + if not openvpn.setup_process: return - return_code = setup_process.poll() + return_code = openvpn.setup_process.poll() # Setup process is not complete yet if return_code is None: @@ -114,22 +88,4 @@ def _collect_setup_result(request): else: messages.info(request, _('Setup failed.')) - setup_process = None - - -def _apply_changes(request, old_status, new_status): - """Apply the changes.""" - modified = False - - if old_status['enabled'] != new_status['enabled']: - if new_status['enabled']: - openvpn.app.enable() - else: - openvpn.app.disable() - - modified = True - - if modified: - messages.success(request, _('Configuration updated')) - else: - messages.info(request, _('Setting unchanged')) + openvpn.setup_process = None From 953de1cd20db6b11062b516c15243bbd267f0815 Mon Sep 17 00:00:00 2001 From: "Luis A. Arizmendi" Date: Tue, 19 May 2020 17:54:41 +0000 Subject: [PATCH 06/41] Translated using Weblate (Spanish) Currently translated at 100.0% (1270 of 1270 strings) --- plinth/locale/es/LC_MESSAGES/django.po | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index 0330c17fa..e091ef10b 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-18 18:36-0400\n" -"PO-Revision-Date: 2020-05-18 22:17+0000\n" +"PO-Revision-Date: 2020-05-21 13:41+0000\n" "Last-Translator: Luis A. Arizmendi \n" "Language-Team: Spanish \n" @@ -4584,13 +4584,11 @@ msgstr "" #: plinth/modules/performance/__init__.py:16 #: plinth/modules/performance/__init__.py:45 msgid "Performance" -msgstr "" +msgstr "Rendimiento" #: plinth/modules/performance/__init__.py:46 -#, fuzzy -#| msgid "System Configuration" msgid "System Monitoring" -msgstr "Configuración del sistema" +msgstr "Monitorización del sistema" #: plinth/modules/power/__init__.py:16 msgid "Restart or shut down the system." @@ -4947,10 +4945,8 @@ msgid "Samba" msgstr "Samba" #: plinth/modules/samba/__init__.py:63 -#, fuzzy -#| msgid "Network Time Server" msgid "Network File Storage" -msgstr "Servidor NTP" +msgstr "Sistema de archivos en red" #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 @@ -5584,11 +5580,11 @@ msgstr "Restaurar" #: plinth/modules/snapshot/templates/snapshot_manage.html:42 msgid "will be used at next boot" -msgstr "" +msgstr "se usará en el siguiente reinicio" #: plinth/modules/snapshot/templates/snapshot_manage.html:47 msgid "in use" -msgstr "" +msgstr "en uso" #: plinth/modules/snapshot/templates/snapshot_manage.html:56 #, python-format @@ -5833,7 +5829,7 @@ msgstr "Poco espacio en disco" #: plinth/modules/storage/__init__.py:344 msgid "Disk failure imminent" -msgstr "" +msgstr "Fallo de disco inminente" #: plinth/modules/storage/__init__.py:346 #, python-brace-format @@ -5841,6 +5837,8 @@ msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" +"El disco {id} informa que es probable que falle en breve. Copie los datos " +"mientras pueda y reemplace el disco." #: plinth/modules/storage/forms.py:63 msgid "Invalid directory name." @@ -6332,6 +6330,12 @@ msgid "" "to be unavailable briefly. If system reboot is deemed necessary, it is done " "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" +"Las actualizaciones se ejecutan a las 06:00 h. cada día, de acuerdo con la " +"zona local de tiempo. Puede configurar su zona de tiempo con la aplicación " +"\"Fecha y Hora\". Las aplicaciones se reinician después de cada " +"actualización, lo que provoca que estén inaccesibles durante un breve " +"tiempo. Si se decide retrasar el reinicio del sistema, éste se hará de forma " +"automática a las 02:00 h." #: plinth/modules/upgrades/__init__.py:45 plinth/templates/setup.html:74 msgid "Update" From c89fdcdc9d1cad60c735739c7eb74d82eaa5b118 Mon Sep 17 00:00:00 2001 From: Etienne Date: Wed, 20 May 2020 02:17:28 +0000 Subject: [PATCH 07/41] Translated using Weblate (French) Currently translated at 100.0% (1270 of 1270 strings) --- plinth/locale/fr/LC_MESSAGES/django.po | 93 +++++++++++--------------- 1 file changed, 39 insertions(+), 54 deletions(-) diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index 412ae2bd6..f045d0d1a 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-18 18:36-0400\n" -"PO-Revision-Date: 2020-05-02 08:11+0000\n" -"Last-Translator: Nathan \n" +"PO-Revision-Date: 2020-05-21 13:41+0000\n" +"Last-Translator: Etienne \n" "Language-Team: French \n" "Language: fr\n" @@ -978,20 +978,28 @@ msgid "" "other communication servers can use it to establish a call between parties " "who are otherwise unable connect to each other." msgstr "" +"Coturn est un serveur facilitant les appels audios/vidéos ainsi que les " +"conférences, en fournissant une implémentation des protocoles TURN et STUN. " +"Les autres types de serveurs de communication, comme WebRTC et SIP, peuvent " +"l'utiliser afin d'établir un appel entre plusieurs parties qui n'auraient " +"pas pu se connecter entre elles autrement." #: plinth/modules/coturn/__init__.py:35 msgid "" "It is not meant to be used directly by users. Servers such as matrix-synapse " "need to be configured with the details provided here." msgstr "" +"Ceci n'est pas sensé être utilisé directement par les utilisateurs. Les " +"serveurs du type matrix-synapse nécessitent d'être configurés avec les " +"détails fournis ici." #: plinth/modules/coturn/__init__.py:64 msgid "Coturn" -msgstr "" +msgstr "Coturn" #: plinth/modules/coturn/__init__.py:65 msgid "VoIP Helper" -msgstr "" +msgstr "VoIP Helper" #: plinth/modules/coturn/forms.py:22 plinth/modules/quassel/forms.py:22 msgid "TLS domain" @@ -1008,12 +1016,12 @@ msgstr "" #: plinth/modules/coturn/templates/coturn.html:15 msgid "Use the following URLs to configure your communication server:" msgstr "" +"Veuillez utiliser l'URL suivante pour configurer votre serveur de " +"communication :" #: plinth/modules/coturn/templates/coturn.html:26 -#, fuzzy -#| msgid "The following storage devices are in use:" msgid "Use the following shared authentication secret:" -msgstr "Les périphériques de stockage suivants sont en cours d’utilisation :" +msgstr "Veuillez utiliser les secrets d'authentification partagés suivants :" #: plinth/modules/datetime/__init__.py:25 msgid "" @@ -2090,12 +2098,6 @@ msgstr "" "discuss.freedombox.org\" target=\"_blank\"> forum de discussions." #: plinth/modules/help/templates/help_feedback.html:26 -#, fuzzy -#| msgid "" -#| "If you find any bugs or issues, please use the issue " -#| "tracker to let our developers know. To report, first check if the " -#| "issue is already reported and then use the \"New issue\" button." msgid "" "If you find any bugs or issues, please use the issue " @@ -2103,7 +2105,7 @@ msgid "" "is already reported and then use the \"New issue\" button." msgstr "" "Si vous rencontrez des bogues ou des problèmes, veuillez utiliser notre outil de suivi de tickets (en anglais) pour que nos " "développeurs en soient informés. Avant cela, vérifiez que le problème n'a " "pas déjà été remonté auparavant, et si ce n’est pas le cas cliquez sur le " @@ -2207,12 +2209,7 @@ msgid "Status Log" msgstr "Journal d'état" #: plinth/modules/help/templates/statuslog.html:13 -#, fuzzy, python-format -#| msgid "" -#| "These are the last %(num_lines)s lines of the status log for this web " -#| "interface. If you want to report a bug, please use the bug tracker and " -#| "attach this status log to the bug report." +#, python-format msgid "" "These are the last %(num_lines)s lines of the status log for this web " "interface. If you want to report a bug, please use the outil de suivi de tickets et attacher ce journal d’état " -"au rapport d’erreur." +"freedombox/issues\">outil de suivi de tickets et attacher ce journal d’" +"état au rapport d’erreur." #: plinth/modules/help/templates/statuslog.html:24 msgid "" @@ -3336,7 +3333,7 @@ msgstr "Mumblefly" #: plinth/modules/mumble/manifest.py:60 msgid "Mumla" -msgstr "" +msgstr "Mumla" #: plinth/modules/mumble/views.py:29 msgid "SuperUser password successfully updated." @@ -4679,13 +4676,11 @@ msgstr "" #: plinth/modules/performance/__init__.py:16 #: plinth/modules/performance/__init__.py:45 msgid "Performance" -msgstr "" +msgstr "Performance" #: plinth/modules/performance/__init__.py:46 -#, fuzzy -#| msgid "System Configuration" msgid "System Monitoring" -msgstr "Configuration Système" +msgstr "Contrôle Système" #: plinth/modules/power/__init__.py:16 msgid "Restart or shut down the system." @@ -5055,10 +5050,8 @@ msgid "Samba" msgstr "Samba" #: plinth/modules/samba/__init__.py:63 -#, fuzzy -#| msgid "Network Time Server" msgid "Network File Storage" -msgstr "Serveur de temps réseau" +msgstr "Stockage de fichiers réseau" #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 @@ -5702,11 +5695,11 @@ msgstr "Revenir en arrière" #: plinth/modules/snapshot/templates/snapshot_manage.html:42 msgid "will be used at next boot" -msgstr "" +msgstr "sera utilisé au prochain démarrage" #: plinth/modules/snapshot/templates/snapshot_manage.html:47 msgid "in use" -msgstr "" +msgstr "en utilisation" #: plinth/modules/snapshot/templates/snapshot_manage.html:56 #, python-format @@ -5714,11 +5707,7 @@ msgid "Rollback to snapshot #%(number)s" msgstr "Revenir à l'instantané #%(number)s" #: plinth/modules/snapshot/templates/snapshot_not_supported.html:11 -#, fuzzy, python-format -#| msgid "" -#| "Your have a filesystem of type %(fs_type)s. Snapshots " -#| "are currently only available on %(types_supported)s " -#| "filesystems." +#, python-format msgid "" "You have a filesystem of type %(fs_type)s. Snapshots are " "currently only available on %(types_supported)s filesystems." @@ -5960,7 +5949,7 @@ msgstr "Espace disque faible" #: plinth/modules/storage/__init__.py:344 msgid "Disk failure imminent" -msgstr "" +msgstr "Erreur disque imminente" #: plinth/modules/storage/__init__.py:346 #, python-brace-format @@ -5968,6 +5957,8 @@ msgid "" "Disk {id} is reporting that it is likely to fail in the near future. Copy " "any data while you still can and replace the drive." msgstr "" +"Le disque {id} reporte qu'il risque de ne pas marcher bientôt. Veuillez " +"copier toute donnée tant que vous le pouvez et remplacez le disque." #: plinth/modules/storage/forms.py:63 msgid "Invalid directory name." @@ -6464,6 +6455,11 @@ msgid "" "to be unavailable briefly. If system reboot is deemed necessary, it is done " "automatically at 02:00 causing all apps to be unavailable briefly." msgstr "" +"Les mises à jour sont exécutées à 6h00 tous les jours, selon votre heure " +"locale. Veuillez chosir votre fuseau horaire dans l'application Date & Time. " +"Les applications redémarrent après la mise à jour, causant brièvement leurs " +"interruptions. Si le redémarrage du système est nécessaire, il sera effectué " +"à 2h00, causant brièvement l'interruption de toutes les applications." #: plinth/modules/upgrades/__init__.py:45 plinth/templates/setup.html:74 msgid "Update" @@ -7191,18 +7187,13 @@ msgid "Requested page %(request_path)s was not found." msgstr "La page %(request_path)s n'a pas été trouvée." #: plinth/templates/404.html:19 -#, fuzzy -#| msgid "" -#| "If you believe this missing page should exist, please file a bug at the " -#| "FreedomBox Service (Plinth) project issue tracker." msgid "" "If you believe this missing page should exist, please file a bug at the " "FreedomBox Service (Plinth) project issue tracker." msgstr "" "Si vous pensez que cette page manquante devrait exister, veuillez remonter " -"un " +"un " "rapport de bogue à l'équipe du projet Plinth, l’interface de gestion de " "la FreedomBox." @@ -7211,13 +7202,7 @@ msgid "500" msgstr "500" #: plinth/templates/500.html:14 -#, fuzzy, python-format -#| msgid "" -#| "This is an internal error and not something you caused or can fix. Please " -#| "report the error on the bug tracker so we can fix it. Also, please " -#| "attach the status log to the bug " -#| "report." +#, python-format msgid "" "This is an internal error and not something you caused or can fix. Please " "report the error on the rapport de bogue pour que nous puissions la corriger. Veuillez également joindre le journal d’état à votre rapport de bogue." +"\"https://salsa.debian.org/freedombox-team/freedombox/issues\">rapport de " +"bogue pour que nous puissions la corriger. Veuillez également joindre le " +"journal d’état à votre rapport de bogue." #: plinth/templates/app-header.html:22 msgid "Installation" From 1bf3a271742b1828310df5d64101ef67ca8df7c5 Mon Sep 17 00:00:00 2001 From: Artem Date: Tue, 19 May 2020 14:32:31 +0000 Subject: [PATCH 08/41] Translated using Weblate (Russian) Currently translated at 74.4% (945 of 1270 strings) --- plinth/locale/ru/LC_MESSAGES/django.po | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index cd5f7d4a7..e86adca45 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-18 18:36-0400\n" -"PO-Revision-Date: 2020-05-18 22:17+0000\n" +"PO-Revision-Date: 2020-05-21 13:41+0000\n" "Last-Translator: Artem \n" "Language-Team: Russian \n" @@ -29,10 +29,9 @@ msgid "FreedomBox" msgstr "FrеedomBox" #: plinth/daemon.py:85 -#, fuzzy, python-brace-format -#| msgid "Service %(service_name)s is running." +#, python-brace-format msgid "Service {service_name} is running" -msgstr "Выполняется служба %(service_name)s." +msgstr "Cлужба {service_name} выполняется" #: plinth/daemon.py:111 #, python-brace-format From 80d67c20545ed950bbfc872cdbdae13abd94d82a Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 19 May 2020 13:11:23 -0700 Subject: [PATCH 09/41] tests: functional: Merge into main source hierarchy - Add pytest hooks to ignore all functional tests if pytest_bdd is not installed. - Update pytest hooks to skip tests in file named 'test_functional.py' if --include-functional argument is not provided. - Move functional_tests/install.py into plinth/tests/functional and update reference in Vagrantfile. - Move scenario files into individual app folders. Rename them after the app they are testing. Merge TODO items listed in todo.org into corresponding feature files. - Add test_functional.py in each app to build tests from the features file using pytest_bdd. - Move all step_definitions, support and data into plinth/tests/functional/. Include all step_definitions from conftest.py. Update to relative imports instead of absolute imports. Tests performed: - Run py.test-3 --collect-only shows all functional tests and lists 574 tests. No errors show that name of feature files are correct. The number says that all functional test features are included. - Remove pytest_bdd (or modify the import name) and run py.test-3 --collect-only skips collecting all functional tests and shows only 300+ tests. - Run functional tests for a few apps with py.test-3 --include-functional -m app. For storage, deluge. - Run unit tests with py.test-3. Functional tests are listed by skipped. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- Vagrantfile | 2 +- conftest.py | 25 ++++++++++++- functional_tests/test_plinth.py | 19 ---------- functional_tests/todo.org | 35 ------------------ .../modules/avahi/tests/avahi.feature | 0 plinth/modules/avahi/tests/test_functional.py | 8 ++++ .../modules/backups/tests}/backups.feature | 0 .../modules/backups/tests/test_functional.py | 8 ++++ .../modules/bind/tests}/bind.feature | 0 plinth/modules/bind/tests/test_functional.py | 8 ++++ .../modules/cockpit/tests/cockpit.feature | 0 .../modules/cockpit/tests/test_functional.py | 8 ++++ .../modules/config/tests/config.feature | 0 .../modules/config/tests/test_functional.py | 8 ++++ .../modules/coquelicot/tests}/__init__.py | 0 .../coquelicot/tests}/coquelicot.feature | 0 .../coquelicot/tests/test_functional.py | 8 ++++ .../modules/coturn/tests}/coturn.feature | 0 .../modules/coturn/tests/test_functional.py | 8 ++++ .../modules/datetime/tests/datetime.feature | 0 .../modules/datetime/tests/test_functional.py | 8 ++++ .../modules/deluge/tests}/deluge.feature | 0 .../modules/deluge/tests/test_functional.py | 8 ++++ .../dynamicdns/tests}/dynamicdns.feature | 6 +++ .../dynamicdns/tests/test_functional.py | 8 ++++ .../modules/ejabberd/tests}/ejabberd.feature | 3 ++ .../modules/ejabberd/tests/test_functional.py | 8 ++++ .../modules/gitweb/tests}/gitweb.feature | 0 .../modules/gitweb/tests/test_functional.py | 8 ++++ .../modules/help/tests}/help.feature | 6 +++ plinth/modules/help/tests/test_functional.py | 8 ++++ .../modules/i2p/tests}/i2p.feature | 0 plinth/modules/i2p/tests/test_functional.py | 8 ++++ .../modules/ikiwiki/tests}/ikiwiki.feature | 0 .../modules/ikiwiki/tests/test_functional.py | 8 ++++ .../infinoted/tests}/infinoted.feature | 0 .../infinoted/tests/test_functional.py | 8 ++++ .../modules/jsxc/tests}/jsxc.feature | 0 plinth/modules/jsxc/tests/test_functional.py | 8 ++++ .../tests}/matrixsynapse.feature | 0 .../matrixsynapse/tests/test_functional.py | 8 ++++ plinth/modules/mediawiki/tests/__init__.py | 0 .../mediawiki/tests}/mediawiki.feature | 0 .../mediawiki/tests/test_functional.py | 8 ++++ .../modules/minetest/tests}/minetest.feature | 0 .../modules/minetest/tests/test_functional.py | 8 ++++ .../modules/minidlna/tests}/minidlna.feature | 0 .../modules/minidlna/tests/test_functional.py | 8 ++++ plinth/modules/mldonkey/tests/__init__.py | 0 .../modules/mldonkey/tests}/mldonkey.feature | 0 .../modules/mldonkey/tests/test_functional.py | 8 ++++ .../monkeysphere/tests}/monkeysphere.feature | 0 .../monkeysphere/tests/test_functional.py | 8 ++++ .../modules/mumble/tests}/mumble.feature | 0 .../modules/mumble/tests/test_functional.py | 8 ++++ .../modules/openvpn/tests}/openvpn.feature | 0 .../modules/openvpn/tests/test_functional.py | 8 ++++ .../modules/pagekite/tests}/pagekite.feature | 5 +++ .../modules/pagekite/tests/test_functional.py | 8 ++++ .../performance/tests}/performance.feature | 0 .../performance/tests/test_functional.py | 8 ++++ .../modules/privoxy/tests}/privoxy.feature | 0 .../modules/privoxy/tests/test_functional.py | 8 ++++ .../modules/quassel/tests}/quassel.feature | 0 .../modules/quassel/tests/test_functional.py | 8 ++++ .../modules/radicale/tests}/radicale.feature | 0 .../modules/radicale/tests/test_functional.py | 8 ++++ .../roundcube/tests}/roundcube.feature | 0 .../roundcube/tests/test_functional.py | 8 ++++ .../modules/samba/tests}/samba.feature | 0 plinth/modules/samba/tests/test_functional.py | 8 ++++ plinth/modules/searx/tests/__init__.py | 0 .../modules/searx/tests}/searx.feature | 0 plinth/modules/searx/tests/test_functional.py | 8 ++++ .../modules/security/tests}/security.feature | 0 .../modules/security/tests/test_functional.py | 8 ++++ .../shadowsocks/tests}/shadowsocks.feature | 0 .../shadowsocks/tests/test_functional.py | 8 ++++ plinth/modules/sharing/tests/__init__.py | 0 .../modules/sharing/tests}/sharing.feature | 0 .../modules/sharing/tests/test_functional.py | 8 ++++ .../modules/snapshot/tests/snapshot.feature | 0 .../modules/snapshot/tests/test_functional.py | 8 ++++ .../modules/ssh/tests}/ssh.feature | 0 plinth/modules/ssh/tests/test_functional.py | 8 ++++ plinth/modules/sso/tests/__init__.py | 0 .../modules/sso/tests/sso.feature | 0 plinth/modules/sso/tests/test_functional.py | 8 ++++ .../modules/storage/tests}/storage.feature | 0 .../modules/storage/tests/test_functional.py | 8 ++++ plinth/modules/syncthing/tests/__init__.py | 0 .../syncthing/tests}/syncthing.feature | 0 .../syncthing/tests/test_functional.py | 8 ++++ plinth/modules/tahoe/tests/__init__.py | 0 .../modules/tahoe/tests}/tahoe.feature | 0 plinth/modules/tahoe/tests/test_functional.py | 8 ++++ plinth/modules/tor/tests/test_functional.py | 8 ++++ .../modules/tor/tests}/tor.feature | 0 .../transmission/tests/test_functional.py | 8 ++++ .../transmission/tests}/transmission.feature | 0 plinth/modules/ttrss/tests/test_functional.py | 8 ++++ .../modules/ttrss/tests}/ttrss.feature | 0 .../modules/upgrades/tests/test_functional.py | 8 ++++ .../modules/upgrades/tests}/upgrades.feature | 0 plinth/modules/users/tests/test_functional.py | 8 ++++ .../modules/users/tests/users.feature | 8 ++++ plinth/tests/functional/__init__.py | 0 .../tests/functional}/config.ini | 0 .../tests/functional}/data/sample.torrent | Bin .../tests/functional}/install.sh | 0 .../functional/step_definitions/__init__.py | 0 .../step_definitions/application.py | 2 +- .../functional}/step_definitions/interface.py | 2 +- .../functional}/step_definitions/service.py | 4 +- .../functional}/step_definitions/site.py | 2 +- .../functional}/step_definitions/system.py | 2 +- .../tests/functional}/support/__init__.py | 0 .../tests/functional}/support/application.py | 6 +-- .../tests/functional}/support/interface.py | 3 +- .../tests/functional}/support/service.py | 5 ++- .../tests/functional}/support/site.py | 4 +- .../tests/functional}/support/system.py | 2 +- 122 files changed, 444 insertions(+), 73 deletions(-) delete mode 100644 functional_tests/test_plinth.py delete mode 100644 functional_tests/todo.org rename functional_tests/features/service_discovery.feature => plinth/modules/avahi/tests/avahi.feature (100%) create mode 100644 plinth/modules/avahi/tests/test_functional.py rename {functional_tests/features => plinth/modules/backups/tests}/backups.feature (100%) create mode 100644 plinth/modules/backups/tests/test_functional.py rename {functional_tests/features => plinth/modules/bind/tests}/bind.feature (100%) create mode 100644 plinth/modules/bind/tests/test_functional.py rename functional_tests/features/server_administration.feature => plinth/modules/cockpit/tests/cockpit.feature (100%) create mode 100644 plinth/modules/cockpit/tests/test_functional.py rename functional_tests/features/configuration.feature => plinth/modules/config/tests/config.feature (100%) create mode 100644 plinth/modules/config/tests/test_functional.py rename {functional_tests/step_definitions => plinth/modules/coquelicot/tests}/__init__.py (100%) rename {functional_tests/features => plinth/modules/coquelicot/tests}/coquelicot.feature (100%) create mode 100644 plinth/modules/coquelicot/tests/test_functional.py rename {functional_tests/features => plinth/modules/coturn/tests}/coturn.feature (100%) create mode 100644 plinth/modules/coturn/tests/test_functional.py rename functional_tests/features/date_and_time.feature => plinth/modules/datetime/tests/datetime.feature (100%) create mode 100644 plinth/modules/datetime/tests/test_functional.py rename {functional_tests/features => plinth/modules/deluge/tests}/deluge.feature (100%) create mode 100644 plinth/modules/deluge/tests/test_functional.py rename {functional_tests/features => plinth/modules/dynamicdns/tests}/dynamicdns.feature (69%) create mode 100644 plinth/modules/dynamicdns/tests/test_functional.py rename {functional_tests/features => plinth/modules/ejabberd/tests}/ejabberd.feature (95%) create mode 100644 plinth/modules/ejabberd/tests/test_functional.py rename {functional_tests/features => plinth/modules/gitweb/tests}/gitweb.feature (100%) create mode 100644 plinth/modules/gitweb/tests/test_functional.py rename {functional_tests/features => plinth/modules/help/tests}/help.feature (60%) create mode 100644 plinth/modules/help/tests/test_functional.py rename {functional_tests/features => plinth/modules/i2p/tests}/i2p.feature (100%) create mode 100644 plinth/modules/i2p/tests/test_functional.py rename {functional_tests/features => plinth/modules/ikiwiki/tests}/ikiwiki.feature (100%) create mode 100644 plinth/modules/ikiwiki/tests/test_functional.py rename {functional_tests/features => plinth/modules/infinoted/tests}/infinoted.feature (100%) create mode 100644 plinth/modules/infinoted/tests/test_functional.py rename {functional_tests/features => plinth/modules/jsxc/tests}/jsxc.feature (100%) create mode 100644 plinth/modules/jsxc/tests/test_functional.py rename {functional_tests/features => plinth/modules/matrixsynapse/tests}/matrixsynapse.feature (100%) create mode 100644 plinth/modules/matrixsynapse/tests/test_functional.py create mode 100644 plinth/modules/mediawiki/tests/__init__.py rename {functional_tests/features => plinth/modules/mediawiki/tests}/mediawiki.feature (100%) create mode 100644 plinth/modules/mediawiki/tests/test_functional.py rename {functional_tests/features => plinth/modules/minetest/tests}/minetest.feature (100%) create mode 100644 plinth/modules/minetest/tests/test_functional.py rename {functional_tests/features => plinth/modules/minidlna/tests}/minidlna.feature (100%) create mode 100644 plinth/modules/minidlna/tests/test_functional.py create mode 100644 plinth/modules/mldonkey/tests/__init__.py rename {functional_tests/features => plinth/modules/mldonkey/tests}/mldonkey.feature (100%) create mode 100644 plinth/modules/mldonkey/tests/test_functional.py rename {functional_tests/features => plinth/modules/monkeysphere/tests}/monkeysphere.feature (100%) create mode 100644 plinth/modules/monkeysphere/tests/test_functional.py rename {functional_tests/features => plinth/modules/mumble/tests}/mumble.feature (100%) create mode 100644 plinth/modules/mumble/tests/test_functional.py rename {functional_tests/features => plinth/modules/openvpn/tests}/openvpn.feature (100%) create mode 100644 plinth/modules/openvpn/tests/test_functional.py rename {functional_tests/features => plinth/modules/pagekite/tests}/pagekite.feature (91%) create mode 100644 plinth/modules/pagekite/tests/test_functional.py rename {functional_tests/features => plinth/modules/performance/tests}/performance.feature (100%) create mode 100644 plinth/modules/performance/tests/test_functional.py rename {functional_tests/features => plinth/modules/privoxy/tests}/privoxy.feature (100%) create mode 100644 plinth/modules/privoxy/tests/test_functional.py rename {functional_tests/features => plinth/modules/quassel/tests}/quassel.feature (100%) create mode 100644 plinth/modules/quassel/tests/test_functional.py rename {functional_tests/features => plinth/modules/radicale/tests}/radicale.feature (100%) create mode 100644 plinth/modules/radicale/tests/test_functional.py rename {functional_tests/features => plinth/modules/roundcube/tests}/roundcube.feature (100%) create mode 100644 plinth/modules/roundcube/tests/test_functional.py rename {functional_tests/features => plinth/modules/samba/tests}/samba.feature (100%) create mode 100644 plinth/modules/samba/tests/test_functional.py create mode 100644 plinth/modules/searx/tests/__init__.py rename {functional_tests/features => plinth/modules/searx/tests}/searx.feature (100%) create mode 100644 plinth/modules/searx/tests/test_functional.py rename {functional_tests/features => plinth/modules/security/tests}/security.feature (100%) create mode 100644 plinth/modules/security/tests/test_functional.py rename {functional_tests/features => plinth/modules/shadowsocks/tests}/shadowsocks.feature (100%) create mode 100644 plinth/modules/shadowsocks/tests/test_functional.py create mode 100644 plinth/modules/sharing/tests/__init__.py rename {functional_tests/features => plinth/modules/sharing/tests}/sharing.feature (100%) create mode 100644 plinth/modules/sharing/tests/test_functional.py rename functional_tests/features/storage_snapshots.feature => plinth/modules/snapshot/tests/snapshot.feature (100%) create mode 100644 plinth/modules/snapshot/tests/test_functional.py rename {functional_tests/features => plinth/modules/ssh/tests}/ssh.feature (100%) create mode 100644 plinth/modules/ssh/tests/test_functional.py create mode 100644 plinth/modules/sso/tests/__init__.py rename functional_tests/features/single_sign_on.feature => plinth/modules/sso/tests/sso.feature (100%) create mode 100644 plinth/modules/sso/tests/test_functional.py rename {functional_tests/features => plinth/modules/storage/tests}/storage.feature (100%) create mode 100644 plinth/modules/storage/tests/test_functional.py create mode 100644 plinth/modules/syncthing/tests/__init__.py rename {functional_tests/features => plinth/modules/syncthing/tests}/syncthing.feature (100%) create mode 100644 plinth/modules/syncthing/tests/test_functional.py create mode 100644 plinth/modules/tahoe/tests/__init__.py rename {functional_tests/features => plinth/modules/tahoe/tests}/tahoe.feature (100%) create mode 100644 plinth/modules/tahoe/tests/test_functional.py create mode 100644 plinth/modules/tor/tests/test_functional.py rename {functional_tests/features => plinth/modules/tor/tests}/tor.feature (100%) create mode 100644 plinth/modules/transmission/tests/test_functional.py rename {functional_tests/features => plinth/modules/transmission/tests}/transmission.feature (100%) create mode 100644 plinth/modules/ttrss/tests/test_functional.py rename {functional_tests/features => plinth/modules/ttrss/tests}/ttrss.feature (100%) create mode 100644 plinth/modules/upgrades/tests/test_functional.py rename {functional_tests/features => plinth/modules/upgrades/tests}/upgrades.feature (100%) create mode 100644 plinth/modules/users/tests/test_functional.py rename functional_tests/features/users_and_groups.feature => plinth/modules/users/tests/users.feature (81%) create mode 100644 plinth/tests/functional/__init__.py rename {functional_tests => plinth/tests/functional}/config.ini (100%) rename {functional_tests => plinth/tests/functional}/data/sample.torrent (100%) rename {functional_tests => plinth/tests/functional}/install.sh (100%) create mode 100644 plinth/tests/functional/step_definitions/__init__.py rename {functional_tests => plinth/tests/functional}/step_definitions/application.py (99%) rename {functional_tests => plinth/tests/functional}/step_definitions/interface.py (98%) rename {functional_tests => plinth/tests/functional}/step_definitions/service.py (94%) rename {functional_tests => plinth/tests/functional}/step_definitions/site.py (99%) rename {functional_tests => plinth/tests/functional}/step_definitions/system.py (99%) rename {functional_tests => plinth/tests/functional}/support/__init__.py (100%) rename {functional_tests => plinth/tests/functional}/support/application.py (99%) rename {functional_tests => plinth/tests/functional}/support/interface.py (99%) rename {functional_tests => plinth/tests/functional}/support/service.py (98%) rename {functional_tests => plinth/tests/functional}/support/site.py (99%) rename {functional_tests => plinth/tests/functional}/support/system.py (99%) diff --git a/Vagrantfile b/Vagrantfile index c4d60e8aa..bda895ea4 100644 --- a/Vagrantfile +++ b/Vagrantfile @@ -38,7 +38,7 @@ Vagrant.configure(2) do |config| DEBIAN_FRONTEND=noninteractive apt-get install -y ncurses-term echo 'alias run-develop="sudo -u plinth /vagrant/run --develop"' >> /home/vagrant/.bashrc SHELL - config.vm.provision "tests", run: "never", type: "shell", path: "functional_tests/install.sh" + 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. diff --git a/conftest.py b/conftest.py index 5066e23c5..c70aa0843 100644 --- a/conftest.py +++ b/conftest.py @@ -3,11 +3,30 @@ pytest configuration for all tests. """ +import importlib import os import pathlib import pytest +try: + importlib.import_module('pytest_bdd') + _bdd_available = True +except ImportError: + _bdd_available = False +else: + from plinth.tests.functional.step_definitions.application import * + from plinth.tests.functional.step_definitions.interface import * + from plinth.tests.functional.step_definitions.service import * + from plinth.tests.functional.step_definitions.site import * + from plinth.tests.functional.step_definitions.system import * + + +def pytest_ignore_collect(path, config): + """Return True to ignore functional tests.""" + if path.basename == 'test_functional.py': + return not _bdd_available + def pytest_addoption(parser): """Add a command line option to run functional tests.""" @@ -16,7 +35,7 @@ def pytest_addoption(parser): def pytest_collection_modifyitems(config, items): - """Filter out functional tests unless --include-functional arg is passed.""" + """Filter out functional tests unless --include-functional is passed.""" if config.getoption('--include-functional'): # Option provided on command line, no filtering return @@ -24,7 +43,9 @@ def pytest_collection_modifyitems(config, items): skip_functional = pytest.mark.skip( reason='--include-functional not provided') for item in items: - if 'functional' in item.keywords: + if 'functional' in item.keywords or ( + item.parent.fspath.basename + and item.parent.fspath.basename == 'test_functional.py'): item.add_marker(skip_functional) diff --git a/functional_tests/test_plinth.py b/functional_tests/test_plinth.py deleted file mode 100644 index 8a61c371e..000000000 --- a/functional_tests/test_plinth.py +++ /dev/null @@ -1,19 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import pytest - -try: - from pytest_bdd import scenarios -except ImportError: - pytestmark = pytest.mark.skip(reason='pytest_bdd is not installed') -else: - from step_definitions.application import * - from step_definitions.interface import * - from step_definitions.service import * - from step_definitions.site import * - from step_definitions.system import * - - # Mark all tests are functional - pytestmark = pytest.mark.functional - - scenarios('features') diff --git a/functional_tests/todo.org b/functional_tests/todo.org deleted file mode 100644 index 07bd58c5b..000000000 --- a/functional_tests/todo.org +++ /dev/null @@ -1,35 +0,0 @@ -* Feature: Users and Groups -** TODO Scenario: Add user to wiki group -** TODO Scenario: Remove user from wiki group -** TODO Scenario: Set user SSH key -** TODO Scenario: Clear user SSH key -** TODO Scenario: Make user inactive -** TODO Scenario: Make user active -** TODO Scenario: Change user password - -* Feature: Help -** TODO Scenario: Visit the wiki -** TODO Scenario: Visit the mailing list -** TODO Scenario: Visit the IRC channel -** TODO Scenario: View the manual -** TODO Scenario: View the about page - -* Feature: Bookmarks -** TODO Enable/Disable - -* Feature: Chat Server -** TODO Check service -** TODO Check domain name display - -* Feature: Dynamic DNS Client -** TODO Scenario: Configure GnuDIP service -** TODO Scenario: Configure noip.com service -** TODO Scenario: Configure selfhost.bz service -** TODO Scenario: Configure freedns.afraid.org service -** TODO Scenario: Configure other update URL service - -* Feature: Public Visibility -** TODO Scenario: Enable standard services -** TODO Scenario: Disable standard services -** TODO Scenario: Add custom service -** TODO Scenario: Delete custom service diff --git a/functional_tests/features/service_discovery.feature b/plinth/modules/avahi/tests/avahi.feature similarity index 100% rename from functional_tests/features/service_discovery.feature rename to plinth/modules/avahi/tests/avahi.feature diff --git a/plinth/modules/avahi/tests/test_functional.py b/plinth/modules/avahi/tests/test_functional.py new file mode 100644 index 000000000..687c73c4f --- /dev/null +++ b/plinth/modules/avahi/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for avahi app. +""" + +from pytest_bdd import scenarios + +scenarios('avahi.feature') diff --git a/functional_tests/features/backups.feature b/plinth/modules/backups/tests/backups.feature similarity index 100% rename from functional_tests/features/backups.feature rename to plinth/modules/backups/tests/backups.feature diff --git a/plinth/modules/backups/tests/test_functional.py b/plinth/modules/backups/tests/test_functional.py new file mode 100644 index 000000000..4c6a3171f --- /dev/null +++ b/plinth/modules/backups/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for backups app. +""" + +from pytest_bdd import scenarios + +scenarios('backups.feature') diff --git a/functional_tests/features/bind.feature b/plinth/modules/bind/tests/bind.feature similarity index 100% rename from functional_tests/features/bind.feature rename to plinth/modules/bind/tests/bind.feature diff --git a/plinth/modules/bind/tests/test_functional.py b/plinth/modules/bind/tests/test_functional.py new file mode 100644 index 000000000..4c5e69b5b --- /dev/null +++ b/plinth/modules/bind/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for bind app. +""" + +from pytest_bdd import scenarios + +scenarios('bind.feature') diff --git a/functional_tests/features/server_administration.feature b/plinth/modules/cockpit/tests/cockpit.feature similarity index 100% rename from functional_tests/features/server_administration.feature rename to plinth/modules/cockpit/tests/cockpit.feature diff --git a/plinth/modules/cockpit/tests/test_functional.py b/plinth/modules/cockpit/tests/test_functional.py new file mode 100644 index 000000000..df5a79a27 --- /dev/null +++ b/plinth/modules/cockpit/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for cockpit app. +""" + +from pytest_bdd import scenarios + +scenarios('cockpit.feature') diff --git a/functional_tests/features/configuration.feature b/plinth/modules/config/tests/config.feature similarity index 100% rename from functional_tests/features/configuration.feature rename to plinth/modules/config/tests/config.feature diff --git a/plinth/modules/config/tests/test_functional.py b/plinth/modules/config/tests/test_functional.py new file mode 100644 index 000000000..84479a4f2 --- /dev/null +++ b/plinth/modules/config/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for config app. +""" + +from pytest_bdd import scenarios + +scenarios('config.feature') diff --git a/functional_tests/step_definitions/__init__.py b/plinth/modules/coquelicot/tests/__init__.py similarity index 100% rename from functional_tests/step_definitions/__init__.py rename to plinth/modules/coquelicot/tests/__init__.py diff --git a/functional_tests/features/coquelicot.feature b/plinth/modules/coquelicot/tests/coquelicot.feature similarity index 100% rename from functional_tests/features/coquelicot.feature rename to plinth/modules/coquelicot/tests/coquelicot.feature diff --git a/plinth/modules/coquelicot/tests/test_functional.py b/plinth/modules/coquelicot/tests/test_functional.py new file mode 100644 index 000000000..b9eb4da65 --- /dev/null +++ b/plinth/modules/coquelicot/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for coquelicot app. +""" + +from pytest_bdd import scenarios + +scenarios('coquelicot.feature') diff --git a/functional_tests/features/coturn.feature b/plinth/modules/coturn/tests/coturn.feature similarity index 100% rename from functional_tests/features/coturn.feature rename to plinth/modules/coturn/tests/coturn.feature diff --git a/plinth/modules/coturn/tests/test_functional.py b/plinth/modules/coturn/tests/test_functional.py new file mode 100644 index 000000000..ae67c7946 --- /dev/null +++ b/plinth/modules/coturn/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for coturn app. +""" + +from pytest_bdd import scenarios + +scenarios('coturn.feature') diff --git a/functional_tests/features/date_and_time.feature b/plinth/modules/datetime/tests/datetime.feature similarity index 100% rename from functional_tests/features/date_and_time.feature rename to plinth/modules/datetime/tests/datetime.feature diff --git a/plinth/modules/datetime/tests/test_functional.py b/plinth/modules/datetime/tests/test_functional.py new file mode 100644 index 000000000..de8e87c77 --- /dev/null +++ b/plinth/modules/datetime/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for datetime app. +""" + +from pytest_bdd import scenarios + +scenarios('datetime.feature') diff --git a/functional_tests/features/deluge.feature b/plinth/modules/deluge/tests/deluge.feature similarity index 100% rename from functional_tests/features/deluge.feature rename to plinth/modules/deluge/tests/deluge.feature diff --git a/plinth/modules/deluge/tests/test_functional.py b/plinth/modules/deluge/tests/test_functional.py new file mode 100644 index 000000000..11f4c84e8 --- /dev/null +++ b/plinth/modules/deluge/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for deluge app. +""" + +from pytest_bdd import scenarios + +scenarios('deluge.feature') diff --git a/functional_tests/features/dynamicdns.feature b/plinth/modules/dynamicdns/tests/dynamicdns.feature similarity index 69% rename from functional_tests/features/dynamicdns.feature rename to plinth/modules/dynamicdns/tests/dynamicdns.feature index 011cdbdc6..e1c281aa4 100644 --- a/functional_tests/features/dynamicdns.feature +++ b/plinth/modules/dynamicdns/tests/dynamicdns.feature @@ -1,5 +1,11 @@ # SPDX-License-Identifier: AGPL-3.0-or-later +# TODO Scenario: Configure GnuDIP service +# TODO Scenario: Configure noip.com service +# TODO Scenario: Configure selfhost.bz service +# TODO Scenario: Configure freedns.afraid.org service +# TODO Scenario: Configure other update URL service + @apps @dynamicdns Feature: Dynamic DNS Client Update public IP to a GnuDIP server. diff --git a/plinth/modules/dynamicdns/tests/test_functional.py b/plinth/modules/dynamicdns/tests/test_functional.py new file mode 100644 index 000000000..5438d0c4e --- /dev/null +++ b/plinth/modules/dynamicdns/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for dynamicdns app. +""" + +from pytest_bdd import scenarios + +scenarios('dynamicdns.feature') diff --git a/functional_tests/features/ejabberd.feature b/plinth/modules/ejabberd/tests/ejabberd.feature similarity index 95% rename from functional_tests/features/ejabberd.feature rename to plinth/modules/ejabberd/tests/ejabberd.feature index 774e768cc..444333831 100644 --- a/functional_tests/features/ejabberd.feature +++ b/plinth/modules/ejabberd/tests/ejabberd.feature @@ -1,5 +1,8 @@ # SPDX-License-Identifier: AGPL-3.0-or-later +# TODO Check service +# TODO Check domain name display + @apps @ejabberd Feature: Ejabberd Chat Server Run ejabberd chat server. diff --git a/plinth/modules/ejabberd/tests/test_functional.py b/plinth/modules/ejabberd/tests/test_functional.py new file mode 100644 index 000000000..5564dd8b7 --- /dev/null +++ b/plinth/modules/ejabberd/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for ejabberd app. +""" + +from pytest_bdd import scenarios + +scenarios('ejabberd.feature') diff --git a/functional_tests/features/gitweb.feature b/plinth/modules/gitweb/tests/gitweb.feature similarity index 100% rename from functional_tests/features/gitweb.feature rename to plinth/modules/gitweb/tests/gitweb.feature diff --git a/plinth/modules/gitweb/tests/test_functional.py b/plinth/modules/gitweb/tests/test_functional.py new file mode 100644 index 000000000..df1f610c9 --- /dev/null +++ b/plinth/modules/gitweb/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for gitweb app. +""" + +from pytest_bdd import scenarios + +scenarios('gitweb.feature') diff --git a/functional_tests/features/help.feature b/plinth/modules/help/tests/help.feature similarity index 60% rename from functional_tests/features/help.feature rename to plinth/modules/help/tests/help.feature index 4e67c0a6c..39d3955ca 100644 --- a/functional_tests/features/help.feature +++ b/plinth/modules/help/tests/help.feature @@ -1,5 +1,11 @@ # SPDX-License-Identifier: AGPL-3.0-or-later +# TODO Scenario: Visit the wiki +# TODO Scenario: Visit the mailing list +# TODO Scenario: Visit the IRC channel +# TODO Scenario: View the manual +# TODO Scenario: View the about page + @help @system @essential Feature: Help module Show various information about the system. diff --git a/plinth/modules/help/tests/test_functional.py b/plinth/modules/help/tests/test_functional.py new file mode 100644 index 000000000..e62284ce8 --- /dev/null +++ b/plinth/modules/help/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for help app. +""" + +from pytest_bdd import scenarios + +scenarios('help.feature') diff --git a/functional_tests/features/i2p.feature b/plinth/modules/i2p/tests/i2p.feature similarity index 100% rename from functional_tests/features/i2p.feature rename to plinth/modules/i2p/tests/i2p.feature diff --git a/plinth/modules/i2p/tests/test_functional.py b/plinth/modules/i2p/tests/test_functional.py new file mode 100644 index 000000000..20926e817 --- /dev/null +++ b/plinth/modules/i2p/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for i2p app. +""" + +from pytest_bdd import scenarios + +scenarios('i2p.feature') diff --git a/functional_tests/features/ikiwiki.feature b/plinth/modules/ikiwiki/tests/ikiwiki.feature similarity index 100% rename from functional_tests/features/ikiwiki.feature rename to plinth/modules/ikiwiki/tests/ikiwiki.feature diff --git a/plinth/modules/ikiwiki/tests/test_functional.py b/plinth/modules/ikiwiki/tests/test_functional.py new file mode 100644 index 000000000..c8a67665f --- /dev/null +++ b/plinth/modules/ikiwiki/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for ikiwiki app. +""" + +from pytest_bdd import scenarios + +scenarios('ikiwiki.feature') diff --git a/functional_tests/features/infinoted.feature b/plinth/modules/infinoted/tests/infinoted.feature similarity index 100% rename from functional_tests/features/infinoted.feature rename to plinth/modules/infinoted/tests/infinoted.feature diff --git a/plinth/modules/infinoted/tests/test_functional.py b/plinth/modules/infinoted/tests/test_functional.py new file mode 100644 index 000000000..be32e536e --- /dev/null +++ b/plinth/modules/infinoted/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for infinoted app. +""" + +from pytest_bdd import scenarios + +scenarios('infinoted.feature') diff --git a/functional_tests/features/jsxc.feature b/plinth/modules/jsxc/tests/jsxc.feature similarity index 100% rename from functional_tests/features/jsxc.feature rename to plinth/modules/jsxc/tests/jsxc.feature diff --git a/plinth/modules/jsxc/tests/test_functional.py b/plinth/modules/jsxc/tests/test_functional.py new file mode 100644 index 000000000..47f30123e --- /dev/null +++ b/plinth/modules/jsxc/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for jsxc app. +""" + +from pytest_bdd import scenarios + +scenarios('jsxc.feature') diff --git a/functional_tests/features/matrixsynapse.feature b/plinth/modules/matrixsynapse/tests/matrixsynapse.feature similarity index 100% rename from functional_tests/features/matrixsynapse.feature rename to plinth/modules/matrixsynapse/tests/matrixsynapse.feature diff --git a/plinth/modules/matrixsynapse/tests/test_functional.py b/plinth/modules/matrixsynapse/tests/test_functional.py new file mode 100644 index 000000000..46d251545 --- /dev/null +++ b/plinth/modules/matrixsynapse/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for matrixsynapse app. +""" + +from pytest_bdd import scenarios + +scenarios('matrixsynapse.feature') diff --git a/plinth/modules/mediawiki/tests/__init__.py b/plinth/modules/mediawiki/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/features/mediawiki.feature b/plinth/modules/mediawiki/tests/mediawiki.feature similarity index 100% rename from functional_tests/features/mediawiki.feature rename to plinth/modules/mediawiki/tests/mediawiki.feature diff --git a/plinth/modules/mediawiki/tests/test_functional.py b/plinth/modules/mediawiki/tests/test_functional.py new file mode 100644 index 000000000..62c41b3a5 --- /dev/null +++ b/plinth/modules/mediawiki/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for mediawiki app. +""" + +from pytest_bdd import scenarios + +scenarios('mediawiki.feature') diff --git a/functional_tests/features/minetest.feature b/plinth/modules/minetest/tests/minetest.feature similarity index 100% rename from functional_tests/features/minetest.feature rename to plinth/modules/minetest/tests/minetest.feature diff --git a/plinth/modules/minetest/tests/test_functional.py b/plinth/modules/minetest/tests/test_functional.py new file mode 100644 index 000000000..741bc2b22 --- /dev/null +++ b/plinth/modules/minetest/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for minetest app. +""" + +from pytest_bdd import scenarios + +scenarios('minetest.feature') diff --git a/functional_tests/features/minidlna.feature b/plinth/modules/minidlna/tests/minidlna.feature similarity index 100% rename from functional_tests/features/minidlna.feature rename to plinth/modules/minidlna/tests/minidlna.feature diff --git a/plinth/modules/minidlna/tests/test_functional.py b/plinth/modules/minidlna/tests/test_functional.py new file mode 100644 index 000000000..2b44dbc18 --- /dev/null +++ b/plinth/modules/minidlna/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for minidlna app. +""" + +from pytest_bdd import scenarios + +scenarios('minidlna.feature') diff --git a/plinth/modules/mldonkey/tests/__init__.py b/plinth/modules/mldonkey/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/features/mldonkey.feature b/plinth/modules/mldonkey/tests/mldonkey.feature similarity index 100% rename from functional_tests/features/mldonkey.feature rename to plinth/modules/mldonkey/tests/mldonkey.feature diff --git a/plinth/modules/mldonkey/tests/test_functional.py b/plinth/modules/mldonkey/tests/test_functional.py new file mode 100644 index 000000000..4bc0d706d --- /dev/null +++ b/plinth/modules/mldonkey/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for mldonkey app. +""" + +from pytest_bdd import scenarios + +scenarios('mldonkey.feature') diff --git a/functional_tests/features/monkeysphere.feature b/plinth/modules/monkeysphere/tests/monkeysphere.feature similarity index 100% rename from functional_tests/features/monkeysphere.feature rename to plinth/modules/monkeysphere/tests/monkeysphere.feature diff --git a/plinth/modules/monkeysphere/tests/test_functional.py b/plinth/modules/monkeysphere/tests/test_functional.py new file mode 100644 index 000000000..f475b9320 --- /dev/null +++ b/plinth/modules/monkeysphere/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for monkeysphere app. +""" + +from pytest_bdd import scenarios + +scenarios('monkeysphere.feature') diff --git a/functional_tests/features/mumble.feature b/plinth/modules/mumble/tests/mumble.feature similarity index 100% rename from functional_tests/features/mumble.feature rename to plinth/modules/mumble/tests/mumble.feature diff --git a/plinth/modules/mumble/tests/test_functional.py b/plinth/modules/mumble/tests/test_functional.py new file mode 100644 index 000000000..1a58df51b --- /dev/null +++ b/plinth/modules/mumble/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for mumble app. +""" + +from pytest_bdd import scenarios + +scenarios('mumble.feature') diff --git a/functional_tests/features/openvpn.feature b/plinth/modules/openvpn/tests/openvpn.feature similarity index 100% rename from functional_tests/features/openvpn.feature rename to plinth/modules/openvpn/tests/openvpn.feature diff --git a/plinth/modules/openvpn/tests/test_functional.py b/plinth/modules/openvpn/tests/test_functional.py new file mode 100644 index 000000000..176632bec --- /dev/null +++ b/plinth/modules/openvpn/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for openvpn app. +""" + +from pytest_bdd import scenarios + +scenarios('openvpn.feature') diff --git a/functional_tests/features/pagekite.feature b/plinth/modules/pagekite/tests/pagekite.feature similarity index 91% rename from functional_tests/features/pagekite.feature rename to plinth/modules/pagekite/tests/pagekite.feature index 5d8afcb3b..3f6edb62c 100644 --- a/functional_tests/features/pagekite.feature +++ b/plinth/modules/pagekite/tests/pagekite.feature @@ -1,5 +1,10 @@ # SPDX-License-Identifier: AGPL-3.0-or-later +# TODO Scenario: Enable standard services +# TODO Scenario: Disable standard services +# TODO Scenario: Add custom service +# TODO Scenario: Delete custom service + @apps @pagekite Feature: Pagekite Public Visibility Configure Pagekite public visitbility server. diff --git a/plinth/modules/pagekite/tests/test_functional.py b/plinth/modules/pagekite/tests/test_functional.py new file mode 100644 index 000000000..227edad44 --- /dev/null +++ b/plinth/modules/pagekite/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for pagekite app. +""" + +from pytest_bdd import scenarios + +scenarios('pagekite.feature') diff --git a/functional_tests/features/performance.feature b/plinth/modules/performance/tests/performance.feature similarity index 100% rename from functional_tests/features/performance.feature rename to plinth/modules/performance/tests/performance.feature diff --git a/plinth/modules/performance/tests/test_functional.py b/plinth/modules/performance/tests/test_functional.py new file mode 100644 index 000000000..eed641b09 --- /dev/null +++ b/plinth/modules/performance/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for performance app. +""" + +from pytest_bdd import scenarios + +scenarios('performance.feature') diff --git a/functional_tests/features/privoxy.feature b/plinth/modules/privoxy/tests/privoxy.feature similarity index 100% rename from functional_tests/features/privoxy.feature rename to plinth/modules/privoxy/tests/privoxy.feature diff --git a/plinth/modules/privoxy/tests/test_functional.py b/plinth/modules/privoxy/tests/test_functional.py new file mode 100644 index 000000000..10638de5d --- /dev/null +++ b/plinth/modules/privoxy/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for privoxy app. +""" + +from pytest_bdd import scenarios + +scenarios('privoxy.feature') diff --git a/functional_tests/features/quassel.feature b/plinth/modules/quassel/tests/quassel.feature similarity index 100% rename from functional_tests/features/quassel.feature rename to plinth/modules/quassel/tests/quassel.feature diff --git a/plinth/modules/quassel/tests/test_functional.py b/plinth/modules/quassel/tests/test_functional.py new file mode 100644 index 000000000..a9ddd2f57 --- /dev/null +++ b/plinth/modules/quassel/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for quassel app. +""" + +from pytest_bdd import scenarios + +scenarios('quassel.feature') diff --git a/functional_tests/features/radicale.feature b/plinth/modules/radicale/tests/radicale.feature similarity index 100% rename from functional_tests/features/radicale.feature rename to plinth/modules/radicale/tests/radicale.feature diff --git a/plinth/modules/radicale/tests/test_functional.py b/plinth/modules/radicale/tests/test_functional.py new file mode 100644 index 000000000..5af778039 --- /dev/null +++ b/plinth/modules/radicale/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for radicale app. +""" + +from pytest_bdd import scenarios + +scenarios('radicale.feature') diff --git a/functional_tests/features/roundcube.feature b/plinth/modules/roundcube/tests/roundcube.feature similarity index 100% rename from functional_tests/features/roundcube.feature rename to plinth/modules/roundcube/tests/roundcube.feature diff --git a/plinth/modules/roundcube/tests/test_functional.py b/plinth/modules/roundcube/tests/test_functional.py new file mode 100644 index 000000000..0aaee4b5e --- /dev/null +++ b/plinth/modules/roundcube/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for roundcube app. +""" + +from pytest_bdd import scenarios + +scenarios('roundcube.feature') diff --git a/functional_tests/features/samba.feature b/plinth/modules/samba/tests/samba.feature similarity index 100% rename from functional_tests/features/samba.feature rename to plinth/modules/samba/tests/samba.feature diff --git a/plinth/modules/samba/tests/test_functional.py b/plinth/modules/samba/tests/test_functional.py new file mode 100644 index 000000000..237a1171c --- /dev/null +++ b/plinth/modules/samba/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for samba app. +""" + +from pytest_bdd import scenarios + +scenarios('samba.feature') diff --git a/plinth/modules/searx/tests/__init__.py b/plinth/modules/searx/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/features/searx.feature b/plinth/modules/searx/tests/searx.feature similarity index 100% rename from functional_tests/features/searx.feature rename to plinth/modules/searx/tests/searx.feature diff --git a/plinth/modules/searx/tests/test_functional.py b/plinth/modules/searx/tests/test_functional.py new file mode 100644 index 000000000..459de6735 --- /dev/null +++ b/plinth/modules/searx/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for searx app. +""" + +from pytest_bdd import scenarios + +scenarios('searx.feature') diff --git a/functional_tests/features/security.feature b/plinth/modules/security/tests/security.feature similarity index 100% rename from functional_tests/features/security.feature rename to plinth/modules/security/tests/security.feature diff --git a/plinth/modules/security/tests/test_functional.py b/plinth/modules/security/tests/test_functional.py new file mode 100644 index 000000000..af98e32d5 --- /dev/null +++ b/plinth/modules/security/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for security app. +""" + +from pytest_bdd import scenarios + +scenarios('security.feature') diff --git a/functional_tests/features/shadowsocks.feature b/plinth/modules/shadowsocks/tests/shadowsocks.feature similarity index 100% rename from functional_tests/features/shadowsocks.feature rename to plinth/modules/shadowsocks/tests/shadowsocks.feature diff --git a/plinth/modules/shadowsocks/tests/test_functional.py b/plinth/modules/shadowsocks/tests/test_functional.py new file mode 100644 index 000000000..3ee9d1237 --- /dev/null +++ b/plinth/modules/shadowsocks/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for shadowsocks app. +""" + +from pytest_bdd import scenarios + +scenarios('shadowsocks.feature') diff --git a/plinth/modules/sharing/tests/__init__.py b/plinth/modules/sharing/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/features/sharing.feature b/plinth/modules/sharing/tests/sharing.feature similarity index 100% rename from functional_tests/features/sharing.feature rename to plinth/modules/sharing/tests/sharing.feature diff --git a/plinth/modules/sharing/tests/test_functional.py b/plinth/modules/sharing/tests/test_functional.py new file mode 100644 index 000000000..974840cec --- /dev/null +++ b/plinth/modules/sharing/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for sharing app. +""" + +from pytest_bdd import scenarios + +scenarios('sharing.feature') diff --git a/functional_tests/features/storage_snapshots.feature b/plinth/modules/snapshot/tests/snapshot.feature similarity index 100% rename from functional_tests/features/storage_snapshots.feature rename to plinth/modules/snapshot/tests/snapshot.feature diff --git a/plinth/modules/snapshot/tests/test_functional.py b/plinth/modules/snapshot/tests/test_functional.py new file mode 100644 index 000000000..4fc5aee8d --- /dev/null +++ b/plinth/modules/snapshot/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for snapshot app. +""" + +from pytest_bdd import scenarios + +scenarios('snapshot.feature') diff --git a/functional_tests/features/ssh.feature b/plinth/modules/ssh/tests/ssh.feature similarity index 100% rename from functional_tests/features/ssh.feature rename to plinth/modules/ssh/tests/ssh.feature diff --git a/plinth/modules/ssh/tests/test_functional.py b/plinth/modules/ssh/tests/test_functional.py new file mode 100644 index 000000000..6b239f3ea --- /dev/null +++ b/plinth/modules/ssh/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for ssh app. +""" + +from pytest_bdd import scenarios + +scenarios('ssh.feature') diff --git a/plinth/modules/sso/tests/__init__.py b/plinth/modules/sso/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/features/single_sign_on.feature b/plinth/modules/sso/tests/sso.feature similarity index 100% rename from functional_tests/features/single_sign_on.feature rename to plinth/modules/sso/tests/sso.feature diff --git a/plinth/modules/sso/tests/test_functional.py b/plinth/modules/sso/tests/test_functional.py new file mode 100644 index 000000000..3af0e47eb --- /dev/null +++ b/plinth/modules/sso/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for sso app. +""" + +from pytest_bdd import scenarios + +scenarios('sso.feature') diff --git a/functional_tests/features/storage.feature b/plinth/modules/storage/tests/storage.feature similarity index 100% rename from functional_tests/features/storage.feature rename to plinth/modules/storage/tests/storage.feature diff --git a/plinth/modules/storage/tests/test_functional.py b/plinth/modules/storage/tests/test_functional.py new file mode 100644 index 000000000..737f32ef1 --- /dev/null +++ b/plinth/modules/storage/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for storage app. +""" + +from pytest_bdd import scenarios + +scenarios('storage.feature') diff --git a/plinth/modules/syncthing/tests/__init__.py b/plinth/modules/syncthing/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/features/syncthing.feature b/plinth/modules/syncthing/tests/syncthing.feature similarity index 100% rename from functional_tests/features/syncthing.feature rename to plinth/modules/syncthing/tests/syncthing.feature diff --git a/plinth/modules/syncthing/tests/test_functional.py b/plinth/modules/syncthing/tests/test_functional.py new file mode 100644 index 000000000..eac5eb009 --- /dev/null +++ b/plinth/modules/syncthing/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for syncthing app. +""" + +from pytest_bdd import scenarios + +scenarios('syncthing.feature') diff --git a/plinth/modules/tahoe/tests/__init__.py b/plinth/modules/tahoe/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/features/tahoe.feature b/plinth/modules/tahoe/tests/tahoe.feature similarity index 100% rename from functional_tests/features/tahoe.feature rename to plinth/modules/tahoe/tests/tahoe.feature diff --git a/plinth/modules/tahoe/tests/test_functional.py b/plinth/modules/tahoe/tests/test_functional.py new file mode 100644 index 000000000..899cc62c2 --- /dev/null +++ b/plinth/modules/tahoe/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for tahoe app. +""" + +from pytest_bdd import scenarios + +scenarios('tahoe.feature') diff --git a/plinth/modules/tor/tests/test_functional.py b/plinth/modules/tor/tests/test_functional.py new file mode 100644 index 000000000..bad412e97 --- /dev/null +++ b/plinth/modules/tor/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for tor app. +""" + +from pytest_bdd import scenarios + +scenarios('tor.feature') diff --git a/functional_tests/features/tor.feature b/plinth/modules/tor/tests/tor.feature similarity index 100% rename from functional_tests/features/tor.feature rename to plinth/modules/tor/tests/tor.feature diff --git a/plinth/modules/transmission/tests/test_functional.py b/plinth/modules/transmission/tests/test_functional.py new file mode 100644 index 000000000..1ece1c1b3 --- /dev/null +++ b/plinth/modules/transmission/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for transmission app. +""" + +from pytest_bdd import scenarios + +scenarios('transmission.feature') diff --git a/functional_tests/features/transmission.feature b/plinth/modules/transmission/tests/transmission.feature similarity index 100% rename from functional_tests/features/transmission.feature rename to plinth/modules/transmission/tests/transmission.feature diff --git a/plinth/modules/ttrss/tests/test_functional.py b/plinth/modules/ttrss/tests/test_functional.py new file mode 100644 index 000000000..a94acba7b --- /dev/null +++ b/plinth/modules/ttrss/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for ttrss app. +""" + +from pytest_bdd import scenarios + +scenarios('ttrss.feature') diff --git a/functional_tests/features/ttrss.feature b/plinth/modules/ttrss/tests/ttrss.feature similarity index 100% rename from functional_tests/features/ttrss.feature rename to plinth/modules/ttrss/tests/ttrss.feature diff --git a/plinth/modules/upgrades/tests/test_functional.py b/plinth/modules/upgrades/tests/test_functional.py new file mode 100644 index 000000000..272599b14 --- /dev/null +++ b/plinth/modules/upgrades/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for upgrades app. +""" + +from pytest_bdd import scenarios + +scenarios('upgrades.feature') diff --git a/functional_tests/features/upgrades.feature b/plinth/modules/upgrades/tests/upgrades.feature similarity index 100% rename from functional_tests/features/upgrades.feature rename to plinth/modules/upgrades/tests/upgrades.feature diff --git a/plinth/modules/users/tests/test_functional.py b/plinth/modules/users/tests/test_functional.py new file mode 100644 index 000000000..92b26c540 --- /dev/null +++ b/plinth/modules/users/tests/test_functional.py @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Functional, browser based tests for users app. +""" + +from pytest_bdd import scenarios + +scenarios('users.feature') diff --git a/functional_tests/features/users_and_groups.feature b/plinth/modules/users/tests/users.feature similarity index 81% rename from functional_tests/features/users_and_groups.feature rename to plinth/modules/users/tests/users.feature index 19c1c4774..52ce217f0 100644 --- a/functional_tests/features/users_and_groups.feature +++ b/plinth/modules/users/tests/users.feature @@ -1,5 +1,13 @@ # SPDX-License-Identifier: AGPL-3.0-or-later +# TODO Scenario: Add user to wiki group +# TODO Scenario: Remove user from wiki group +# TODO Scenario: Set user SSH key +# TODO Scenario: Clear user SSH key +# TODO Scenario: Make user inactive +# TODO Scenario: Make user active +# TODO Scenario: Change user password + @system @essential @users_groups Feature: Users and Groups Manage users and groups. diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/config.ini b/plinth/tests/functional/config.ini similarity index 100% rename from functional_tests/config.ini rename to plinth/tests/functional/config.ini diff --git a/functional_tests/data/sample.torrent b/plinth/tests/functional/data/sample.torrent similarity index 100% rename from functional_tests/data/sample.torrent rename to plinth/tests/functional/data/sample.torrent diff --git a/functional_tests/install.sh b/plinth/tests/functional/install.sh similarity index 100% rename from functional_tests/install.sh rename to plinth/tests/functional/install.sh diff --git a/plinth/tests/functional/step_definitions/__init__.py b/plinth/tests/functional/step_definitions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/functional_tests/step_definitions/application.py b/plinth/tests/functional/step_definitions/application.py similarity index 99% rename from functional_tests/step_definitions/application.py rename to plinth/tests/functional/step_definitions/application.py index 88f2328df..5019f3f70 100644 --- a/functional_tests/step_definitions/application.py +++ b/plinth/tests/functional/step_definitions/application.py @@ -4,7 +4,7 @@ import pytest import splinter from pytest_bdd import given, parsers, then, when -from support import application +from ..support import application @given(parsers.parse('the {app_name:w} application is installed')) diff --git a/functional_tests/step_definitions/interface.py b/plinth/tests/functional/step_definitions/interface.py similarity index 98% rename from functional_tests/step_definitions/interface.py rename to plinth/tests/functional/step_definitions/interface.py index 0e904d35a..512d7d953 100644 --- a/functional_tests/step_definitions/interface.py +++ b/plinth/tests/functional/step_definitions/interface.py @@ -2,7 +2,7 @@ from pytest_bdd import given, parsers, then, when -from support import config, interface +from ..support import config, interface default_url = config['DEFAULT']['url'] diff --git a/functional_tests/step_definitions/service.py b/plinth/tests/functional/step_definitions/service.py similarity index 94% rename from functional_tests/step_definitions/service.py rename to plinth/tests/functional/step_definitions/service.py index 83a0a0017..ec543d136 100644 --- a/functional_tests/step_definitions/service.py +++ b/plinth/tests/functional/step_definitions/service.py @@ -2,8 +2,8 @@ from pytest_bdd import parsers, then -from support import service -from support.service import eventually +from ..support import service +from ..support.service import eventually @then(parsers.parse('the {service_name:w} service should be running')) diff --git a/functional_tests/step_definitions/site.py b/plinth/tests/functional/step_definitions/site.py similarity index 99% rename from functional_tests/step_definitions/site.py rename to plinth/tests/functional/step_definitions/site.py index 90009615f..038cc9df0 100644 --- a/functional_tests/step_definitions/site.py +++ b/plinth/tests/functional/step_definitions/site.py @@ -2,7 +2,7 @@ from pytest_bdd import given, parsers, then, when -from support import interface, site +from ..support import interface, site @then(parsers.parse('the {site_name:w} site should be available')) diff --git a/functional_tests/step_definitions/system.py b/plinth/tests/functional/step_definitions/system.py similarity index 99% rename from functional_tests/step_definitions/system.py rename to plinth/tests/functional/step_definitions/system.py index 2eb70e629..f4913d5c2 100644 --- a/functional_tests/step_definitions/system.py +++ b/plinth/tests/functional/step_definitions/system.py @@ -6,7 +6,7 @@ import time from pytest import fixture from pytest_bdd import given, parsers, then, when -from support import config, system +from ..support import system language_codes = { 'Deutsch': 'de', diff --git a/functional_tests/support/__init__.py b/plinth/tests/functional/support/__init__.py similarity index 100% rename from functional_tests/support/__init__.py rename to plinth/tests/functional/support/__init__.py diff --git a/functional_tests/support/application.py b/plinth/tests/functional/support/application.py similarity index 99% rename from functional_tests/support/application.py rename to plinth/tests/functional/support/application.py index 6f52037dd..9fbb1e2c4 100644 --- a/functional_tests/support/application.py +++ b/plinth/tests/functional/support/application.py @@ -13,9 +13,9 @@ from time import sleep import requests import splinter -from support import config, interface, site -from support.interface import submit -from support.service import eventually, wait_for_page_update +from . import config, interface, site +from .interface import submit +from .service import eventually, wait_for_page_update # unlisted apps just use the app_name as module name app_module = { diff --git a/functional_tests/support/interface.py b/plinth/tests/functional/support/interface.py similarity index 99% rename from functional_tests/support/interface.py rename to plinth/tests/functional/support/interface.py index 19dfa38d0..5e9f43339 100644 --- a/functional_tests/support/interface.py +++ b/plinth/tests/functional/support/interface.py @@ -6,8 +6,7 @@ import tempfile import requests -from support import config - +from . import config from .service import wait_for_page_update sys_modules = [ diff --git a/functional_tests/support/service.py b/plinth/tests/functional/support/service.py similarity index 98% rename from functional_tests/support/service.py rename to plinth/tests/functional/support/service.py index 2ddbe5ef9..02b5d83b8 100644 --- a/functional_tests/support/service.py +++ b/plinth/tests/functional/support/service.py @@ -1,12 +1,12 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -from contextlib import contextmanager import time +from contextlib import contextmanager from selenium.common.exceptions import StaleElementReferenceException from selenium.webdriver.support.ui import WebDriverWait -from support import interface +from . import interface # unlisted services just use the service_name as module name service_module = { @@ -61,6 +61,7 @@ class page_loaded(): - expected_url (optional): Wait for the URL to become . This can be necessary to wait for a redirect to finish. """ + def __init__(self, element, expected_url=None): self.element = element self.expected_url = expected_url diff --git a/functional_tests/support/site.py b/plinth/tests/functional/support/site.py similarity index 99% rename from functional_tests/support/site.py rename to plinth/tests/functional/support/site.py index 1fe6a1102..0217b65e4 100644 --- a/functional_tests/support/site.py +++ b/plinth/tests/functional/support/site.py @@ -9,8 +9,8 @@ import requests from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys -from support import application, config, interface, system -from support.service import eventually, wait_for_page_update +from . import application, config, interface, system +from .service import eventually, wait_for_page_update # unlisted sites just use '/' + site_name as url site_url = { diff --git a/functional_tests/support/system.py b/plinth/tests/functional/support/system.py similarity index 99% rename from functional_tests/support/system.py rename to plinth/tests/functional/support/system.py index dee5af398..bd8e3df97 100644 --- a/functional_tests/support/system.py +++ b/plinth/tests/functional/support/system.py @@ -6,7 +6,7 @@ from urllib.parse import urlparse import requests from . import application, config -from .interface import default_url, nav_to_module, submit +from .interface import nav_to_module, submit from .service import wait_for_page_update config_page_title_language_map = { From bff294ed3950ce4cc53178442de304f3fd49ebe4 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 19 May 2020 13:07:19 -0700 Subject: [PATCH 10/41] storage: Fix failing path validation unit tests Due to improper python include path. Don't know why the problem surfaced. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/storage/tests/test_storage.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/plinth/modules/storage/tests/test_storage.py b/plinth/modules/storage/tests/test_storage.py index df5fcfda7..4b0716cdf 100644 --- a/plinth/modules/storage/tests/test_storage.py +++ b/plinth/modules/storage/tests/test_storage.py @@ -4,6 +4,7 @@ Test module for storage module operations. """ import os +import pathlib import re import subprocess import tempfile @@ -204,14 +205,14 @@ class TestActions: @staticmethod def call_action(action_command, **kwargs): """Call the action script.""" - current_directory = os.path.dirname(os.path.realpath(__file__)) - action = os.path.join(current_directory, '..', '..', '..', '..', - 'actions', action_command[0]) - action_command[0] = action + test_directory = pathlib.Path(__file__).parent + top_directory = (test_directory / '..' / '..' / '..' / '..').resolve() + action_command[0] = top_directory / 'actions' / action_command[0] kwargs['stdout'] = kwargs.get('stdout', subprocess.DEVNULL) kwargs['stderr'] = kwargs.get('stderr', subprocess.DEVNULL) kwargs['check'] = kwargs.get('check', True) - return subprocess.run(action_command, **kwargs) + env = dict(os.environ, PYTHONPATH=str(top_directory)) + return subprocess.run(action_command, env=env, **kwargs) def check_action(self, action_command): """Return success/failure result of the action command.""" From 575f07b8e5989843b88338de67afbcbc134b2740 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Tue, 19 May 2020 13:09:54 -0700 Subject: [PATCH 11/41] tests: functional: Document running tests in parallel Signed-off-by: Joseph Nuthalapati Reviewed-by: Sunil Mohan Adapa --- HACKING.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/HACKING.md b/HACKING.md index 4922eb195..54cc4ebd1 100644 --- a/HACKING.md +++ b/HACKING.md @@ -213,10 +213,11 @@ Buster (or later). ```bash host$ pip3 install splinter host$ pip3 install pytest-splinter +host$ pip3 install pytest-xdist # optional, to run tests in parallel +host$ sudo apt install firefox host$ sudo apt install python3-pytest-bdd host$ sudo apt install xvfb python3-pytest-xvfb # optional, to avoid opening browser windows -host$ sudo apt install firefox -host$ sudo apt install smbclient # optional, to test samba +host$ sudo apt install smbclient # optional, to test samba ``` - Install the latest version of geckodriver. It is usually a single binary which @@ -275,6 +276,13 @@ If xvfb is installed and you still want to see browser windows, use the vm$ py.test-3 --no-xvfb -m mediawiki --include-functional ``` +Tests can also be run in parallel, provided you have the pytest-xdist plugin +installed. + +``` +$ py.test-3 -n 4 --dist=loadfile --include-functional -m essential +``` + ## Building the Documentation Separately FreedomBox Service (Plinth) man page is built from DocBook source in the `doc/` From 8fac6a71fed57d2208a4cadf247e40a9b3fd16dd Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 19 May 2020 14:56:55 -0700 Subject: [PATCH 12/41] tests: functional: cosmetic: flake8 fixes Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- .../step_definitions/application.py | 30 ++++++++----------- .../tests/functional/step_definitions/site.py | 9 +++--- .../functional/step_definitions/system.py | 14 ++++----- plinth/tests/functional/support/__init__.py | 4 +-- plinth/tests/functional/support/site.py | 3 +- 5 files changed, 26 insertions(+), 34 deletions(-) diff --git a/plinth/tests/functional/step_definitions/application.py b/plinth/tests/functional/step_definitions/application.py index 5019f3f70..5692b5f64 100644 --- a/plinth/tests/functional/step_definitions/application.py +++ b/plinth/tests/functional/step_definitions/application.py @@ -103,17 +103,15 @@ def configure_shadowsocks(session_browser): @when( - parsers.parse( - 'I configure shadowsocks with server {server:S} and password {password:w}' - )) + parsers.parse('I configure shadowsocks with server {server:S} and ' + 'password {password:w}')) def configure_shadowsocks_with_details(session_browser, server, password): application.configure_shadowsocks(session_browser, server, password) @then( - parsers.parse( - 'shadowsocks should be configured with server {server:S} and password {password:w}' - )) + parsers.parse('shadowsocks should be configured with server {server:S} ' + 'and password {password:w}')) def assert_shadowsocks_configuration(session_browser, server, password): assert ( server, @@ -147,9 +145,8 @@ def add_share(session_browser, name, path, group): @when( - parsers.parse( - 'I edit share {old_name:w} to {new_name:w} from path {path} for {group:w}' - )) + parsers.parse('I edit share {old_name:w} to {new_name:w} from path {path} ' + 'for {group:w}')) def edit_share(session_browser, old_name, new_name, path, group): application.edit_share(session_browser, old_name, new_name, path, group) @@ -376,9 +373,8 @@ def radicale_given_owner_only(session_browser): application.radicale_set_access_rights(session_browser, 'owner_only') -@given( - 'the access rights are set to "any user can view, but only the owner can make changes"' -) +@given('the access rights are set to "any user can view, but only the ' + 'owner can make changes"') def radicale_given_owner_write(session_browser): application.radicale_set_access_rights(session_browser, 'owner_write') @@ -394,9 +390,8 @@ def radicale_set_owner_only(session_browser): application.radicale_set_access_rights(session_browser, 'owner_only') -@when( - 'I change the access rights to "any user can view, but only the owner can make changes"' -) +@when('I change the access rights to "any user can view, but only the ' + 'owner can make changes"') def radicale_set_owner_write(session_browser): application.radicale_set_access_rights(session_browser, 'owner_write') @@ -412,9 +407,8 @@ def radicale_check_owner_only(session_browser): session_browser) == 'owner_only' -@then( - 'the access rights should be "any user can view, but only the owner can make changes"' -) +@then('the access rights should be "any user can view, but only the ' + 'owner can make changes"') def radicale_check_owner_write(session_browser): assert application.radicale_get_access_rights( session_browser) == 'owner_write' diff --git a/plinth/tests/functional/step_definitions/site.py b/plinth/tests/functional/step_definitions/site.py index 038cc9df0..c5b23d6ba 100644 --- a/plinth/tests/functional/step_definitions/site.py +++ b/plinth/tests/functional/step_definitions/site.py @@ -22,8 +22,8 @@ def access_application(session_browser, app_name): @when( parsers.parse( - 'I upload an image named {image:S} to mediawiki with credentials {username:w} and ' - '{password:w}')) + 'I upload an image named {image:S} to mediawiki with credentials ' + '{username:w} and {password:w}')) def upload_image(session_browser, username, password, image): site.upload_image_mediawiki(session_browser, username, password, image) @@ -43,9 +43,8 @@ def verify_upload_password(session_browser, password): @when( - parsers.parse( - 'I upload the sample local file to coquelicot with password {password:w}' - )) + parsers.parse('I upload the sample local file to coquelicot with password ' + '{password:w}')) def coquelicot_upload_file(session_browser, sample_local_file, password): url = site.upload_file_to_coquelicot(session_browser, sample_local_file['file_path'], diff --git a/plinth/tests/functional/step_definitions/system.py b/plinth/tests/functional/step_definitions/system.py index f4913d5c2..89a308c01 100644 --- a/plinth/tests/functional/step_definitions/system.py +++ b/plinth/tests/functional/step_definitions/system.py @@ -168,9 +168,8 @@ def dynamicdns_has_original_config(session_browser): @when( - parsers.parse( - 'I create a backup of the {app_name:w} app data with name {archive_name:w}' - )) + parsers.parse('I create a backup of the {app_name:w} app data with ' + 'name {archive_name:w}')) def backup_create(session_browser, app_name, archive_name): system.backup_create(session_browser, app_name, archive_name) @@ -203,9 +202,8 @@ def backup_restore_from_upload(session_browser, app_name, @when( - parsers.parse( - 'I configure pagekite with host {host:S}, port {port:d}, kite name {kite_name:S} and kite secret {kite_secret:w}' - )) + parsers.parse('I configure pagekite with host {host:S}, port {port:d}, ' + 'kite name {kite_name:S} and kite secret {kite_secret:w}')) def pagekite_configure(session_browser, host, port, kite_name, kite_secret): system.pagekite_configure(session_browser, host, port, kite_name, kite_secret) @@ -213,8 +211,8 @@ def pagekite_configure(session_browser, host, port, kite_name, kite_secret): @then( parsers.parse( - 'pagekite should be configured with host {host:S}, port {port:d}, kite name {kite_name:S} and kite secret {kite_secret:w}' - )) + 'pagekite should be configured with host {host:S}, port {port:d}, ' + 'kite name {kite_name:S} and kite secret {kite_secret:w}')) def pagekite_assert_configured(session_browser, host, port, kite_name, kite_secret): assert (host, port, kite_name, diff --git a/plinth/tests/functional/support/__init__.py b/plinth/tests/functional/support/__init__.py index 9b1d7becd..9532249c2 100644 --- a/plinth/tests/functional/support/__init__.py +++ b/plinth/tests/functional/support/__init__.py @@ -9,5 +9,5 @@ config.read(pathlib.Path(__file__).parent.with_name('config.ini')) config['DEFAULT']['url'] = os.environ.get('FREEDOMBOX_URL', config['DEFAULT']['url']) -config['DEFAULT']['samba_port'] = os.environ.get('FREEDOMBOX_SAMBA_PORT', - config['DEFAULT']['samba_port']) +config['DEFAULT']['samba_port'] = os.environ.get( + 'FREEDOMBOX_SAMBA_PORT', config['DEFAULT']['samba_port']) diff --git a/plinth/tests/functional/support/site.py b/plinth/tests/functional/support/site.py index 0217b65e4..bd8ec80fc 100644 --- a/plinth/tests/functional/support/site.py +++ b/plinth/tests/functional/support/site.py @@ -216,7 +216,8 @@ def mldonkey_remove_all_ed2k_files(browser): def mldonkey_upload_sample_ed2k_file(browser): """Upload a sample ed2k file into mldonkey.""" browser.visit(config['DEFAULT']['url'] + '/mldonkey/') - dllink_command = 'dllink ed2k://|file|foo.bar|123|0123456789ABCDEF0123456789ABCDEF|/' + dllink_command = 'dllink ed2k://|file|foo.bar|123|' \ + '0123456789ABCDEF0123456789ABCDEF|/' _mldonkey_submit_command(browser, dllink_command) From 80dff7bf9cb7f803203ecc6f2db0a31eb8ed9741 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 19 May 2020 23:54:55 -0700 Subject: [PATCH 13/41] tests: functional: Re-organize step definitions and helper methods - Move non-reusable app specific step definitions and helper methods into /tests/test_functional.py. - Merge reusable helper methods into plinth.tests.functional - Merge reusable step definitions into plinth.tests.functional.step_definitions - avahi, datetime, ikiwiki: Reuse common methods to avoid repetition. Avoid mapping from app nicknames to actual app names. - deluge, transmission: Make a copy of sample.torrent for each app to avoid clogging common place. - Implement functional.visit() to simplify a lot of browser.visit() calls. - Ensure that name of the mark on functional tests for an app is same as name of the app. This will help with predicting the mark when running tests for a particular app. Tests performed: - Run all functional tests. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- conftest.py | 6 +- plinth/modules/avahi/tests/avahi.feature | 20 +- .../modules/backups/tests/test_functional.py | 84 +- plinth/modules/bind/tests/test_functional.py | 38 +- plinth/modules/config/tests/config.feature | 3 +- .../modules/config/tests/test_functional.py | 71 +- .../coquelicot/tests/test_functional.py | 120 ++- .../modules/datetime/tests/datetime.feature | 18 +- .../modules/datetime/tests/test_functional.py | 27 +- .../deluge/tests}/data/sample.torrent | Bin .../modules/deluge/tests/test_functional.py | 168 +++- .../dynamicdns/tests/test_functional.py | 67 +- .../modules/ejabberd/tests/test_functional.py | 86 +- .../modules/gitweb/tests/test_functional.py | 307 ++++++- plinth/modules/help/tests/test_functional.py | 22 +- plinth/modules/ikiwiki/tests/ikiwiki.feature | 22 +- .../modules/ikiwiki/tests/test_functional.py | 48 +- .../mediawiki/tests/test_functional.py | 212 ++++- .../modules/mldonkey/tests/test_functional.py | 56 +- .../monkeysphere/tests/test_functional.py | 75 +- .../modules/openvpn/tests/test_functional.py | 40 +- .../modules/pagekite/tests/test_functional.py | 41 +- .../modules/radicale/tests/test_functional.py | 114 ++- plinth/modules/samba/tests/test_functional.py | 113 ++- plinth/modules/searx/tests/test_functional.py | 33 +- .../modules/security/tests/test_functional.py | 39 +- .../shadowsocks/tests/test_functional.py | 39 +- .../modules/sharing/tests/test_functional.py | 141 +++- .../modules/snapshot/tests/test_functional.py | 121 ++- .../modules/storage/tests/test_functional.py | 19 +- .../syncthing/tests/test_functional.py | 137 +++- plinth/modules/tahoe/tests/test_functional.py | 68 +- plinth/modules/tor/tests/test_functional.py | 130 ++- .../transmission/tests/data/sample.torrent | Bin 0 -> 46608 bytes .../transmission/tests/test_functional.py | 63 +- plinth/modules/ttrss/tests/test_functional.py | 69 +- .../modules/upgrades/tests/test_functional.py | 43 +- plinth/modules/users/tests/test_functional.py | 136 +++- plinth/modules/users/tests/users.feature | 2 +- plinth/tests/functional/__init__.py | 448 +++++++++++ plinth/tests/functional/step_definitions.py | 163 ++++ .../functional/step_definitions/__init__.py | 0 .../step_definitions/application.py | 639 --------------- .../functional/step_definitions/interface.py | 90 --- .../functional/step_definitions/service.py | 37 - .../tests/functional/step_definitions/site.py | 234 ------ .../functional/step_definitions/system.py | 341 -------- plinth/tests/functional/support/__init__.py | 13 - .../tests/functional/support/application.py | 752 ------------------ plinth/tests/functional/support/interface.py | 150 ---- plinth/tests/functional/support/service.py | 79 -- plinth/tests/functional/support/site.py | 589 -------------- plinth/tests/functional/support/system.py | 417 ---------- 53 files changed, 3340 insertions(+), 3410 deletions(-) rename plinth/{tests/functional => modules/deluge/tests}/data/sample.torrent (100%) create mode 100644 plinth/modules/transmission/tests/data/sample.torrent create mode 100644 plinth/tests/functional/step_definitions.py delete mode 100644 plinth/tests/functional/step_definitions/__init__.py delete mode 100644 plinth/tests/functional/step_definitions/application.py delete mode 100644 plinth/tests/functional/step_definitions/interface.py delete mode 100644 plinth/tests/functional/step_definitions/service.py delete mode 100644 plinth/tests/functional/step_definitions/site.py delete mode 100644 plinth/tests/functional/step_definitions/system.py delete mode 100644 plinth/tests/functional/support/__init__.py delete mode 100644 plinth/tests/functional/support/application.py delete mode 100644 plinth/tests/functional/support/interface.py delete mode 100644 plinth/tests/functional/support/service.py delete mode 100644 plinth/tests/functional/support/site.py delete mode 100644 plinth/tests/functional/support/system.py diff --git a/conftest.py b/conftest.py index c70aa0843..873409358 100644 --- a/conftest.py +++ b/conftest.py @@ -15,11 +15,7 @@ try: except ImportError: _bdd_available = False else: - from plinth.tests.functional.step_definitions.application import * - from plinth.tests.functional.step_definitions.interface import * - from plinth.tests.functional.step_definitions.service import * - from plinth.tests.functional.step_definitions.site import * - from plinth.tests.functional.step_definitions.system import * + from plinth.tests.functional.step_definitions import * def pytest_ignore_collect(path, config): diff --git a/plinth/modules/avahi/tests/avahi.feature b/plinth/modules/avahi/tests/avahi.feature index c8606dec6..0ab01d1cb 100644 --- a/plinth/modules/avahi/tests/avahi.feature +++ b/plinth/modules/avahi/tests/avahi.feature @@ -1,18 +1,18 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@system @essential @service_discovery -Feature: Service Discovery +@system @essential @avahi +Feature: Avahi Service Discovery Configure service discovery. Background: Given I'm a logged in user -Scenario: Disable service discovery application - Given the service discovery application is enabled - When I disable the service discovery application - Then the service discovery service should not be running +Scenario: Disable avahi application + Given the avahi application is enabled + When I disable the avahi application + Then the avahi service should not be running -Scenario: Enable service discovery application - Given the service discovery application is disabled - When I enable the service discovery application - Then the service discovery service should be running +Scenario: Enable avahi application + Given the avahi application is disabled + When I enable the avahi application + Then the avahi service should be running diff --git a/plinth/modules/backups/tests/test_functional.py b/plinth/modules/backups/tests/test_functional.py index 4c6a3171f..535c387bc 100644 --- a/plinth/modules/backups/tests/test_functional.py +++ b/plinth/modules/backups/tests/test_functional.py @@ -3,6 +3,88 @@ Functional, browser based tests for backups app. """ -from pytest_bdd import scenarios +import os +import tempfile +import urllib.parse + +import requests +from pytest import fixture +from pytest_bdd import parsers, scenarios, then, when + +from plinth.tests import functional scenarios('backups.feature') + + +@fixture(scope='session') +def downloaded_file_info(): + return dict() + + +@when(parsers.parse('I open the main page')) +def open_main_page(session_browser): + _open_main_page(session_browser) + + +@then(parsers.parse('the main page should be shown')) +def main_page_is_shown(session_browser): + assert (session_browser.url.endswith('/plinth/')) + + +@when( + parsers.parse('I download the app data backup with name {archive_name:w}')) +def backup_download(session_browser, downloaded_file_info, archive_name): + file_path = _download(session_browser, archive_name) + downloaded_file_info['path'] = file_path + + +@when(parsers.parse('I restore the downloaded app data backup')) +def backup_restore_from_upload(session_browser, app_name, + downloaded_file_info): + path = downloaded_file_info["path"] + try: + _upload_and_restore(session_browser, app_name, path) + except Exception as err: + raise err + finally: + os.remove(path) + + +def _open_main_page(browser): + with functional.wait_for_page_update(browser): + browser.find_link_by_href('/plinth/').first.click() + + +def _download_file_logged_in(browser, url, suffix=''): + """Download a file from Plinth, pretend being logged in via cookies""" + if not url.startswith("http"): + current_url = urllib.parse.urlparse(browser.url) + url = "%s://%s%s" % (current_url.scheme, current_url.netloc, url) + cookies = browser.driver.get_cookies() + cookies = {cookie["name"]: cookie["value"] for cookie in cookies} + response = requests.get(url, verify=False, cookies=cookies) + with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as temp_file: + for chunk in response.iter_content(chunk_size=128): + temp_file.write(chunk) + return temp_file.name + + +def _download(browser, archive_name=None): + functional.nav_to_module(browser, 'backups') + href = f'/plinth/sys/backups/root/download/{archive_name}/' + url = functional.base_url + href + file_path = _download_file_logged_in(browser, url, suffix='.tar.gz') + return file_path + + +def _upload_and_restore(browser, app_name, downloaded_file_path): + functional.nav_to_module(browser, 'backups') + browser.find_link_by_href('/plinth/sys/backups/upload/').first.click() + fileinput = browser.driver.find_element_by_id('id_backups-file') + fileinput.send_keys(downloaded_file_path) + # submit upload form + functional.submit(browser) + # submit restore form + with functional.wait_for_page_update(browser, + expected_url='/plinth/sys/backups/'): + functional.submit(browser) diff --git a/plinth/modules/bind/tests/test_functional.py b/plinth/modules/bind/tests/test_functional.py index 4c5e69b5b..78e47183a 100644 --- a/plinth/modules/bind/tests/test_functional.py +++ b/plinth/modules/bind/tests/test_functional.py @@ -3,6 +3,42 @@ Functional, browser based tests for bind app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('bind.feature') + + +@given(parsers.parse('bind DNSSEC is {enable:w}')) +def bind_given_enable_dnssec(session_browser, enable): + should_enable = (enable == 'enabled') + _enable_dnssec(session_browser, should_enable) + + +@when(parsers.parse('I {enable:w} bind DNSSEC')) +def bind_enable_dnssec(session_browser, enable): + should_enable = (enable == 'enable') + _enable_dnssec(session_browser, should_enable) + + +@then(parsers.parse('bind DNSSEC should be {enabled:w}')) +def bind_assert_dnssec(session_browser, enabled): + assert _get_dnssec(session_browser) == (enabled == 'enabled') + + +def _enable_dnssec(browser, enable): + """Enable/disable DNSSEC in bind configuration.""" + functional.nav_to_module(browser, 'bind') + if enable: + browser.check('enable_dnssec') + else: + browser.uncheck('enable_dnssec') + + functional.submit(browser, form_class='form-configuration') + + +def _get_dnssec(browser): + """Return whether DNSSEC is enabled/disabled in bind configuration.""" + functional.nav_to_module(browser, 'bind') + return browser.find_by_name('enable_dnssec').first.checked diff --git a/plinth/modules/config/tests/config.feature b/plinth/modules/config/tests/config.feature index bdddf4e61..eb90d751c 100644 --- a/plinth/modules/config/tests/config.feature +++ b/plinth/modules/config/tests/config.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@system @essential @configuration +@system @essential @config Feature: Configuration Configure the system. @@ -21,4 +21,3 @@ Scenario: Change webserver home page And the home page is syncthing When I change the home page to plinth Then the home page should be plinth - diff --git a/plinth/modules/config/tests/test_functional.py b/plinth/modules/config/tests/test_functional.py index 84479a4f2..d1d79f74c 100644 --- a/plinth/modules/config/tests/test_functional.py +++ b/plinth/modules/config/tests/test_functional.py @@ -3,6 +3,75 @@ Functional, browser based tests for config app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('config.feature') + + +@given(parsers.parse('the home page is {app_name:w}')) +def set_home_page(session_browser, app_name): + _set_home_page(session_browser, app_name) + + +@when(parsers.parse('I change the hostname to {hostname:w}')) +def change_hostname_to(session_browser, hostname): + _set_hostname(session_browser, hostname) + + +@when(parsers.parse('I change the domain name to {domain:S}')) +def change_domain_name_to(session_browser, domain): + functional.set_domain_name(session_browser, domain) + + +@when(parsers.parse('I change the home page to {app_name:w}')) +def change_home_page_to(session_browser, app_name): + _set_home_page(session_browser, app_name) + + +@then(parsers.parse('the hostname should be {hostname:w}')) +def hostname_should_be(session_browser, hostname): + assert _get_hostname(session_browser) == hostname + + +@then(parsers.parse('the domain name should be {domain:S}')) +def domain_name_should_be(session_browser, domain): + assert _get_domain_name(session_browser) == domain + + +@then(parsers.parse('the home page should be {app_name:w}')) +def home_page_should_be(session_browser, app_name): + assert _check_home_page_redirect(session_browser, app_name) + + +def _get_hostname(browser): + functional.nav_to_module(browser, 'config') + return browser.find_by_id('id_hostname').value + + +def _set_hostname(browser, hostname): + functional.nav_to_module(browser, 'config') + browser.find_by_id('id_hostname').fill(hostname) + functional.submit(browser) + + +def _get_domain_name(browser): + functional.nav_to_module(browser, 'config') + return browser.find_by_id('id_domainname').value + + +def _set_home_page(browser, home_page): + if 'plinth' not in home_page and 'apache' not in home_page: + home_page = 'shortcut-' + home_page + + functional.nav_to_module(browser, 'config') + drop_down = browser.find_by_id('id_homepage') + drop_down.select(home_page) + functional.submit(browser) + + +def _check_home_page_redirect(browser, app_name): + functional.visit(browser, '/') + return browser.find_by_xpath( + "//a[contains(@href, '/plinth/') and @title='FreedomBox']") diff --git a/plinth/modules/coquelicot/tests/test_functional.py b/plinth/modules/coquelicot/tests/test_functional.py index b9eb4da65..e8c8a08fe 100644 --- a/plinth/modules/coquelicot/tests/test_functional.py +++ b/plinth/modules/coquelicot/tests/test_functional.py @@ -3,6 +3,124 @@ Functional, browser based tests for coquelicot app. """ -from pytest_bdd import scenarios +import random +import tempfile + +from pytest_bdd import given, parsers, scenarios, then, when +from selenium.webdriver.common.action_chains import ActionChains +from selenium.webdriver.common.keys import Keys + +from plinth.tests import functional scenarios('coquelicot.feature') + + +@given('a sample local file') +def sample_local_file(): + file_path, contents = _create_sample_local_file() + return dict(file_path=file_path, contents=contents) + + +@when(parsers.parse('I modify the maximum file size of coquelicot to {size:d}') + ) +def modify_max_file_size(session_browser, size): + _modify_max_file_size(session_browser, size) + + +@then(parsers.parse('the maximum file size of coquelicot should be {size:d}')) +def assert_max_file_size(session_browser, size): + assert _get_max_file_size(session_browser) == size + + +@when(parsers.parse('I modify the coquelicot upload password to {password:w}')) +def modify_upload_password(session_browser, password): + _modify_upload_password(session_browser, password) + + +@then( + parsers.parse( + 'I should be able to login to coquelicot with password {password:w}')) +def verify_upload_password(session_browser, password): + _verify_upload_password(session_browser, password) + + +@when( + parsers.parse('I upload the sample local file to coquelicot with password ' + '{password:w}')) +def coquelicot_upload_file(session_browser, sample_local_file, password): + url = _upload_file(session_browser, sample_local_file['file_path'], + password) + sample_local_file['upload_url'] = url + + +@when('I download the uploaded file from coquelicot') +def coquelicot_download_file(sample_local_file): + file_path = functional.download_file_outside_browser( + sample_local_file['upload_url']) + sample_local_file['download_path'] = file_path + + +@then('contents of downloaded sample file should be same as sample local file') +def coquelicot_compare_upload_download_files(sample_local_file): + _compare_files(sample_local_file['file_path'], + sample_local_file['download_path']) + + +def _create_sample_local_file(): + """Create a sample file for upload using browser.""" + contents = bytearray(random.getrandbits(8) for _ in range(64)) + with tempfile.NamedTemporaryFile(delete=False) as temp_file: + temp_file.write(contents) + + return temp_file.name, contents + + +def _verify_upload_password(browser, password): + functional.visit(browser, '/coquelicot') + # ensure the password form is scrolled into view + browser.execute_script('window.scrollTo(100, 0)') + browser.find_by_id('upload_password').fill(password) + actions = ActionChains(browser.driver) + actions.send_keys(Keys.RETURN) + actions.perform() + assert functional.eventually(browser.is_element_present_by_css, + args=['div[style*="display: none;"]']) + + +def _upload_file(browser, file_path, password): + """Upload a local file from disk to coquelicot.""" + _verify_upload_password(browser, password) + browser.attach_file('file', file_path) + functional.submit(browser) + assert functional.eventually(browser.is_element_present_by_css, + args=['#content .url']) + url_textarea = browser.find_by_css('#content .url textarea').first + return url_textarea.value + + +def _modify_max_file_size(browser, size): + """Change the maximum file size of coquelicot to the given value""" + functional.visit(browser, '/plinth/apps/coquelicot/') + browser.find_by_id('id_max_file_size').fill(size) + functional.submit(browser, form_class='form-configuration') + + +def _get_max_file_size(browser): + """Get the maximum file size of coquelicot""" + functional.visit(browser, '/plinth/apps/coquelicot/') + return int(browser.find_by_id('id_max_file_size').value) + + +def _modify_upload_password(browser, password): + """Change the upload password for coquelicot to the given value""" + functional.visit(browser, '/plinth/apps/coquelicot/') + browser.find_by_id('id_upload_password').fill(password) + functional.submit(browser, form_class='form-configuration') + + +def _compare_files(file1, file2): + """Assert that the contents of two files are the same.""" + file1_contents = open(file1, 'rb').read() + file2_contents = open(file2, 'rb').read() + + assert file1_contents == file2_contents diff --git a/plinth/modules/datetime/tests/datetime.feature b/plinth/modules/datetime/tests/datetime.feature index e36b75f5e..718e51992 100644 --- a/plinth/modules/datetime/tests/datetime.feature +++ b/plinth/modules/datetime/tests/datetime.feature @@ -1,6 +1,6 @@ # SPDX-License-Identifier: AGPL-3.0-or-later -@essential @date_and_time @system +@essential @datetime @system Feature: Date and Time Configure time zone and network time service. @@ -8,16 +8,16 @@ Background: Given I'm a logged in user Scenario: Disable network time application - Given the network time application can be disabled - And the network time application is enabled - When I disable the network time application - Then the network time service should not be running + Given the datetime application can be disabled + And the datetime application is enabled + When I disable the datetime application + Then the datetime service should not be running Scenario: Enable network time application - Given the network time application can be disabled - And the network time application is disabled - When I enable the network time application - Then the network time service should be running + Given the datetime application can be disabled + And the datetime application is disabled + When I enable the datetime application + Then the datetime service should be running Scenario: Set timezone When I set the time zone to Africa/Abidjan diff --git a/plinth/modules/datetime/tests/test_functional.py b/plinth/modules/datetime/tests/test_functional.py index de8e87c77..8d4921f88 100644 --- a/plinth/modules/datetime/tests/test_functional.py +++ b/plinth/modules/datetime/tests/test_functional.py @@ -3,6 +3,31 @@ Functional, browser based tests for datetime app. """ -from pytest_bdd import scenarios +from pytest_bdd import parsers, scenarios, then, when + +from plinth.tests import functional scenarios('datetime.feature') + + +@when(parsers.parse('I set the time zone to {time_zone:S}')) +def time_zone_set(session_browser, time_zone): + _time_zone_set(session_browser, time_zone) + + +@then(parsers.parse('the time zone should be {time_zone:S}')) +def time_zone_assert(session_browser, time_zone): + assert time_zone == _time_zone_get(session_browser) + + +def _time_zone_set(browser, time_zone): + """Set the system time zone.""" + functional.nav_to_module(browser, 'datetime') + browser.select('time_zone', time_zone) + functional.submit(browser, form_class='form-configuration') + + +def _time_zone_get(browser): + """Set the system time zone.""" + functional.nav_to_module(browser, 'datetime') + return browser.find_by_name('time_zone').first.value diff --git a/plinth/tests/functional/data/sample.torrent b/plinth/modules/deluge/tests/data/sample.torrent similarity index 100% rename from plinth/tests/functional/data/sample.torrent rename to plinth/modules/deluge/tests/data/sample.torrent diff --git a/plinth/modules/deluge/tests/test_functional.py b/plinth/modules/deluge/tests/test_functional.py index 11f4c84e8..b2b8d88df 100644 --- a/plinth/modules/deluge/tests/test_functional.py +++ b/plinth/modules/deluge/tests/test_functional.py @@ -3,6 +3,172 @@ Functional, browser based tests for deluge app. """ -from pytest_bdd import scenarios +import os +import time + +from pytest_bdd import parsers, scenarios, then, when + +from plinth.tests import functional scenarios('deluge.feature') + + +@when('all torrents are removed from deluge') +def deluge_remove_all_torrents(session_browser): + _remove_all_torrents(session_browser) + + +@when('I upload a sample torrent to deluge') +def deluge_upload_sample_torrent(session_browser): + _upload_sample_torrent(session_browser) + + +@then( + parsers.parse( + 'there should be {torrents_number:d} torrents listed in deluge')) +def deluge_assert_number_of_torrents(session_browser, torrents_number): + assert torrents_number == _get_number_of_torrents(session_browser) + + +def _get_active_window_title(browser): + """Return the title of the currently active window in Deluge.""" + return browser.evaluate_script( + 'Ext.WindowMgr.getActive() ? Ext.WindowMgr.getActive().title : null') + + +def _ensure_logged_in(browser): + """Ensure that password dialog is answered and we can interact.""" + url = functional.base_url + '/deluge' + + def service_is_available(): + if browser.is_element_present_by_xpath( + '//h1[text()="Service Unavailable"]'): + functional.access_url(browser, 'deluge') + return False + + return True + + if browser.url != url: + browser.visit(url) + # After a backup restore, service may not be available immediately + functional.eventually(service_is_available) + + time.sleep(1) # Wait for Ext.js application in initialize + + if _get_active_window_title(browser) != 'Login': + return + + browser.find_by_id('_password').first.fill('deluge') + _click_active_window_button(browser, 'Login') + + assert functional.eventually( + lambda: _get_active_window_title(browser) != 'Login') + functional.eventually(browser.is_element_not_present_by_css, + args=['#add.x-item-disabled'], timeout=0.3) + + +def _open_connection_manager(browser): + """Open the connection manager dialog if not already open.""" + title = 'Connection Manager' + if _get_active_window_title(browser) == title: + return + + browser.find_by_css('button.x-deluge-connection-manager').first.click() + functional.eventually(lambda: _get_active_window_title(browser) == title) + + +def _ensure_connected(browser): + """Type the connection password if required and start Deluge daemon.""" + _ensure_logged_in(browser) + + # Change Default Password window appears once. + if _get_active_window_title(browser) == 'Change Default Password': + _click_active_window_button(browser, 'No') + + assert functional.eventually(browser.is_element_not_present_by_css, + args=['#add.x-item-disabled']) + + +def _remove_all_torrents(browser): + """Remove all torrents from deluge.""" + _ensure_connected(browser) + + while browser.find_by_css('#torrentGrid .torrent-name'): + browser.find_by_css('#torrentGrid .torrent-name').first.click() + + # Click remove toolbar button + browser.find_by_id('remove').first.click() + + # Remove window shows up + assert functional.eventually( + lambda: _get_active_window_title(browser) == 'Remove Torrent') + + _click_active_window_button(browser, 'Remove With Data') + + # Remove window disappears + assert functional.eventually( + lambda: not _get_active_window_title(browser)) + + +def _get_active_window_id(browser): + """Return the ID of the currently active window.""" + return browser.evaluate_script('Ext.WindowMgr.getActive().id') + + +def _click_active_window_button(browser, button_text): + """Click an action button in the active window.""" + browser.execute_script(''' + active_window = Ext.WindowMgr.getActive(); + active_window.buttons.forEach(function (button) {{ + if (button.text == "{button_text}") + button.btnEl.dom.click() + }})'''.format(button_text=button_text)) + + +def _upload_sample_torrent(browser): + """Upload a sample torrent into deluge.""" + _ensure_connected(browser) + + number_of_torrents = _get_number_of_torrents(browser) + + # Click add toolbar button + browser.find_by_id('add').first.click() + + # Add window appears + functional.eventually( + lambda: _get_active_window_title(browser) == 'Add Torrents') + + file_path = os.path.join(os.path.dirname(__file__), 'data', + 'sample.torrent') + + if browser.find_by_id('fileUploadForm'): # deluge-web 2.x + browser.attach_file('file', file_path) + else: # deluge-web 1.x + browser.find_by_css('button.x-deluge-add-file').first.click() + + # Add from file window appears + functional.eventually( + lambda: _get_active_window_title(browser) == 'Add from File') + + # Attach file + browser.attach_file('file', file_path) + + # Click Add + _click_active_window_button(browser, 'Add') + + functional.eventually( + lambda: _get_active_window_title(browser) == 'Add Torrents') + + # Click Add + time.sleep(1) + _click_active_window_button(browser, 'Add') + + functional.eventually( + lambda: _get_number_of_torrents(browser) > number_of_torrents) + + +def _get_number_of_torrents(browser): + """Return the number torrents currently in deluge.""" + _ensure_connected(browser) + + return len(browser.find_by_css('#torrentGrid .torrent-name')) diff --git a/plinth/modules/dynamicdns/tests/test_functional.py b/plinth/modules/dynamicdns/tests/test_functional.py index 5438d0c4e..276c487e6 100644 --- a/plinth/modules/dynamicdns/tests/test_functional.py +++ b/plinth/modules/dynamicdns/tests/test_functional.py @@ -3,6 +3,71 @@ Functional, browser based tests for dynamicdns app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, scenarios, then, when + +from plinth.tests import functional scenarios('dynamicdns.feature') + + +@given('dynamicdns is configured') +def dynamicdns_configure(session_browser): + _configure(session_browser) + + +@when('I change the dynamicdns configuration') +def dynamicdns_change_config(session_browser): + _change_config(session_browser) + + +@then('dynamicdns should have the original configuration') +def dynamicdns_has_original_config(session_browser): + assert _has_original_config(session_browser) + + +def _configure(browser): + functional.nav_to_module(browser, 'dynamicdns') + browser.find_link_by_href( + '/plinth/sys/dynamicdns/configure/').first.click() + browser.find_by_id('id_enabled').check() + browser.find_by_id('id_service_type').select('GnuDIP') + browser.find_by_id('id_dynamicdns_server').fill('example.com') + browser.find_by_id('id_dynamicdns_domain').fill('freedombox.example.com') + browser.find_by_id('id_dynamicdns_user').fill('tester') + browser.find_by_id('id_dynamicdns_secret').fill('testingtesting') + browser.find_by_id('id_dynamicdns_ipurl').fill( + 'http://myip.datasystems24.de') + functional.submit(browser) + + +def _has_original_config(browser): + functional.nav_to_module(browser, 'dynamicdns') + browser.find_link_by_href( + '/plinth/sys/dynamicdns/configure/').first.click() + enabled = browser.find_by_id('id_enabled').value + service_type = browser.find_by_id('id_service_type').value + server = browser.find_by_id('id_dynamicdns_server').value + domain = browser.find_by_id('id_dynamicdns_domain').value + user = browser.find_by_id('id_dynamicdns_user').value + ipurl = browser.find_by_id('id_dynamicdns_ipurl').value + if enabled and service_type == 'GnuDIP' and server == 'example.com' \ + and domain == 'freedombox.example.com' and user == 'tester' \ + and ipurl == 'http://myip.datasystems24.de': + return True + else: + return False + + +def _change_config(browser): + functional.nav_to_module(browser, 'dynamicdns') + browser.find_link_by_href( + '/plinth/sys/dynamicdns/configure/').first.click() + browser.find_by_id('id_enabled').check() + browser.find_by_id('id_service_type').select('GnuDIP') + browser.find_by_id('id_dynamicdns_server').fill('2.example.com') + browser.find_by_id('id_dynamicdns_domain').fill('freedombox2.example.com') + browser.find_by_id('id_dynamicdns_user').fill('tester2') + browser.find_by_id('id_dynamicdns_secret').fill('testingtesting2') + browser.find_by_id('id_dynamicdns_ipurl').fill( + 'http://myip2.datasystems24.de') + functional.submit(browser) diff --git a/plinth/modules/ejabberd/tests/test_functional.py b/plinth/modules/ejabberd/tests/test_functional.py index 5564dd8b7..7a2755019 100644 --- a/plinth/modules/ejabberd/tests/test_functional.py +++ b/plinth/modules/ejabberd/tests/test_functional.py @@ -3,6 +3,90 @@ Functional, browser based tests for ejabberd app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('ejabberd.feature') + + +@given('I have added a contact to my roster') +def ejabberd_add_contact(session_browser): + _jsxc_add_contact(session_browser) + + +@when('I delete the contact from my roster') +def ejabberd_delete_contact(session_browser): + _jsxc_delete_contact(session_browser) + + +@then('I should have a contact on my roster') +def ejabberd_should_have_contact(session_browser): + assert functional.eventually(_jsxc_has_contact, [session_browser]) + + +@when(parsers.parse('I enable message archive management')) +def ejabberd_enable_archive_management(session_browser): + _enable_message_archive_management(session_browser) + + +@when(parsers.parse('I disable message archive management')) +def ejabberd_disable_archive_management(session_browser): + _disable_message_archive_management(session_browser) + + +def _enable_message_archive_management(browser): + """Enable Message Archive Management in Ejabberd.""" + functional.nav_to_module(browser, 'ejabberd') + functional.change_checkbox_status(browser, 'ejabberd', 'id_MAM_enabled', + 'enabled') + + +def _disable_message_archive_management(browser): + """Enable Message Archive Management in Ejabberd.""" + functional.nav_to_module(browser, 'ejabberd') + functional.change_checkbox_status(browser, 'ejabberd', 'id_MAM_enabled', + 'disabled') + + +def _jsxc_login(browser): + """Login to JSXC.""" + username = functional.config['DEFAULT']['username'] + password = functional.config['DEFAULT']['password'] + functional.access_url(browser, 'jsxc') + browser.find_by_id('jsxc-username').fill(username) + browser.find_by_id('jsxc-password').fill(password) + browser.find_by_id('jsxc-submit').click() + relogin = browser.find_by_text('relogin') + if relogin: + relogin.first.click() + browser.find_by_id('jsxc_username').fill(username) + browser.find_by_id('jsxc_password').fill(password) + browser.find_by_text('Connect').first.click() + + +def _jsxc_add_contact(browser): + """Add a contact to JSXC user's roster.""" + functional.set_domain_name(browser, 'localhost') + functional.install(browser, 'jsxc') + _jsxc_login(browser) + new = browser.find_by_text('new contact') + if new: # roster is empty + new.first.click() + browser.find_by_id('jsxc_username').fill('alice@localhost') + browser.find_by_text('Add').first.click() + + +def _jsxc_delete_contact(browser): + """Delete the contact from JSXC user's roster.""" + _jsxc_login(browser) + browser.find_by_css('div.jsxc_more').first.click() + browser.find_by_text('delete contact').first.click() + browser.find_by_text('Remove').first.click() + + +def _jsxc_has_contact(browser): + """Check whether the contact is in JSXC user's roster.""" + _jsxc_login(browser) + contact = browser.find_by_text('alice@localhost') + return bool(contact) diff --git a/plinth/modules/gitweb/tests/test_functional.py b/plinth/modules/gitweb/tests/test_functional.py index df1f610c9..2dbbbaf8c 100644 --- a/plinth/modules/gitweb/tests/test_functional.py +++ b/plinth/modules/gitweb/tests/test_functional.py @@ -3,6 +3,311 @@ Functional, browser based tests for gitweb app. """ -from pytest_bdd import scenarios +import contextlib +import os +import shutil +import subprocess +import tempfile + +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('gitweb.feature') + +_default_url = functional.config['DEFAULT']['url'] + + +@given('a public repository') +@given('a repository') +@given('at least one repository exists') +def gitweb_repo(session_browser): + _create_repo(session_browser, 'Test-repo', 'public', True) + + +@given('a private repository') +def gitweb_private_repo(session_browser): + _create_repo(session_browser, 'Test-repo', 'private', True) + + +@given('both public and private repositories exist') +def gitweb_public_and_private_repo(session_browser): + _create_repo(session_browser, 'Test-repo', 'public', True) + _create_repo(session_browser, 'Test-repo2', 'private', True) + + +@given(parsers.parse("a {access:w} repository that doesn't exist")) +def gitweb_nonexistent_repo(session_browser, access): + _delete_repo(session_browser, 'Test-repo', ignore_missing=True) + return dict(access=access) + + +@given('all repositories are private') +def gitweb_all_repositories_private(session_browser): + _set_all_repos_private(session_browser) + + +@given(parsers.parse('a repository metadata:\n{metadata}')) +def gitweb_repo_metadata(session_browser, metadata): + metadata_dict = {} + for item in metadata.split('\n'): + item = item.split(': ') + metadata_dict[item[0]] = item[1] + return metadata_dict + + +@when('I create the repository') +def gitweb_create_repo(session_browser, access): + _create_repo(session_browser, 'Test-repo', access) + + +@when('I delete the repository') +def gitweb_delete_repo(session_browser): + _delete_repo(session_browser, 'Test-repo') + + +@when('I set the metadata of the repository') +def gitweb_edit_repo_metadata(session_browser, gitweb_repo_metadata): + _edit_repo_metadata(session_browser, 'Test-repo', gitweb_repo_metadata) + + +@when('using a git client') +def gitweb_using_git_client(): + pass + + +@then('the repository should be restored') +@then('the repository should be listed as a public') +def gitweb_repo_should_exists(session_browser): + assert _repo_exists(session_browser, 'Test-repo', access='public') + + +@then('the repository should be listed as a private') +def gitweb_private_repo_should_exists(session_browser): + assert _repo_exists(session_browser, 'Test-repo', 'private') + + +@then('the repository should not be listed') +def gitweb_repo_should_not_exist(session_browser, gitweb_repo): + assert not _repo_exists(session_browser, gitweb_repo) + + +@then('the public repository should be listed on gitweb') +@then('the repository should be listed on gitweb') +def gitweb_repo_should_exist_on_gitweb(session_browser): + assert _site_repo_exists(session_browser, 'Test-repo') + + +@then('the private repository should not be listed on gitweb') +def gitweb_private_repo_should_exists_on_gitweb(session_browser): + assert not _site_repo_exists(session_browser, 'Test-repo2') + + +@then('the metadata of the repository should be as set') +def gitweb_repo_metadata_should_match(session_browser, gitweb_repo_metadata): + actual_metadata = _get_repo_metadata(session_browser, 'Test-repo') + assert all(item in actual_metadata.items() + for item in gitweb_repo_metadata.items()) + + +@then('the repository should be publicly readable') +def gitweb_repo_publicly_readable(): + assert _repo_is_readable('Test-repo') + assert _repo_is_readable('Test-repo', url_git_extension=True) + + +@then('the repository should not be publicly readable') +def gitweb_repo_not_publicly_readable(): + assert not _repo_is_readable('Test-repo') + assert not _repo_is_readable('Test-repo', url_git_extension=True) + + +@then('the repository should not be publicly writable') +def gitweb_repo_not_publicly_writable(): + assert not _repo_is_writable('Test-repo') + assert not _repo_is_writable('Test-repo', url_git_extension=True) + + +@then('the repository should be privately readable') +def gitweb_repo_privately_readable(): + assert _repo_is_readable('Test-repo', with_auth=True) + assert _repo_is_readable('Test-repo', with_auth=True, + url_git_extension=True) + + +@then('the repository should be privately writable') +def gitweb_repo_privately_writable(): + assert _repo_is_writable('Test-repo', with_auth=True) + assert _repo_is_writable('Test-repo', with_auth=True, + url_git_extension=True) + + +def _create_repo(browser, repo, access=None, ok_if_exists=False): + """Create repository.""" + if not _repo_exists(browser, repo, access): + _delete_repo(browser, repo, ignore_missing=True) + browser.find_link_by_href('/plinth/apps/gitweb/create/').first.click() + browser.find_by_id('id_gitweb-name').fill(repo) + if access == 'private': + browser.find_by_id('id_gitweb-is_private').check() + elif access == 'public': + browser.find_by_id('id_gitweb-is_private').uncheck() + functional.submit(browser) + elif not ok_if_exists: + assert False, 'Repo already exists.' + + +def _delete_repo(browser, repo, ignore_missing=False): + """Delete repository.""" + functional.nav_to_module(browser, 'gitweb') + delete_link = browser.find_link_by_href( + '/plinth/apps/gitweb/{}/delete/'.format(repo)) + if delete_link or not ignore_missing: + delete_link.first.click() + functional.submit(browser) + + +def _edit_repo_metadata(browser, repo, metadata): + """Set repository metadata.""" + functional.nav_to_module(browser, 'gitweb') + browser.find_link_by_href( + '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() + if 'name' in metadata: + browser.find_by_id('id_gitweb-name').fill(metadata['name']) + if 'description' in metadata: + browser.find_by_id('id_gitweb-description').fill( + metadata['description']) + if 'owner' in metadata: + browser.find_by_id('id_gitweb-owner').fill(metadata['owner']) + if 'access' in metadata: + if metadata['access'] == 'private': + browser.find_by_id('id_gitweb-is_private').check() + else: + browser.find_by_id('id_gitweb-is_private').uncheck() + functional.submit(browser) + + +def _get_repo_metadata(browser, repo): + """Get repository metadata.""" + functional.nav_to_module(browser, 'gitweb') + browser.find_link_by_href( + '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() + metadata = {} + for item in ['name', 'description', 'owner']: + metadata[item] = browser.find_by_id('id_gitweb-' + item).value + if browser.find_by_id('id_gitweb-is_private').value: + metadata['access'] = 'private' + else: + metadata['access'] = 'public' + return metadata + + +def _get_repo_url(repo, with_auth): + """"Get repository URL""" + scheme = 'http' + if _default_url.startswith('https://'): + scheme = 'https' + url = _default_url.split( + '://')[1] if '://' in _default_url else _default_url + password = 'gitweb_wrong_password' + if with_auth: + password = functional.config['DEFAULT']['password'] + + return '{0}://{1}:{2}@{3}/gitweb/{4}'.format( + scheme, functional.config['DEFAULT']['username'], password, url, repo) + + +@contextlib.contextmanager +def _gitweb_temp_directory(): + """Create temporary directory""" + name = tempfile.mkdtemp(prefix='plinth_test_gitweb_') + yield name + shutil.rmtree(name) + + +def _gitweb_git_command_is_successful(command, cwd): + """Check if a command runs successfully or gives authentication error""" + process = subprocess.run(command, capture_output=True, cwd=cwd) + if process.returncode != 0: + if 'Authentication failed' in process.stderr.decode(): + return False + print(process.stdout.decode()) + # raise exception + process.check_returncode() + return True + + +def _repo_exists(browser, repo, access=None): + """Check whether the repository exists.""" + functional.nav_to_module(browser, 'gitweb') + links_found = browser.find_link_by_href('/gitweb/{}.git'.format(repo)) + access_matches = True + if links_found and access: + parent = links_found.first.find_by_xpath('..').first + private_icon = parent.find_by_css('.repo-private-icon') + if access == 'private': + access_matches = bool(private_icon) + if access == 'public': + access_matches = not bool(private_icon) + return bool(links_found) and access_matches + + +def _repo_is_readable(repo, with_auth=False, url_git_extension=False): + """Check if a git repo is readable with git client.""" + url = _get_repo_url(repo, with_auth) + if url_git_extension: + url = url + '.git' + git_command = ['git', 'clone', '-c', 'http.sslverify=false', url] + with _gitweb_temp_directory() as cwd: + return _gitweb_git_command_is_successful(git_command, cwd) + + +def _repo_is_writable(repo, with_auth=False, url_git_extension=False): + """Check if a git repo is writable with git client.""" + url = _get_repo_url(repo, with_auth) + if url_git_extension: + url = url + '.git' + + with _gitweb_temp_directory() as cwd: + subprocess.run(['mkdir', 'test-project'], check=True, cwd=cwd) + cwd = os.path.join(cwd, 'test-project') + prepare_git_repo_commands = [ + 'git init -q', 'git config http.sslVerify false', + 'git -c "user.name=Tester" -c "user.email=tester" ' + 'commit -q --allow-empty -m "test"' + ] + for command in prepare_git_repo_commands: + subprocess.run(command, shell=True, check=True, cwd=cwd) + git_push_command = ['git', 'push', '-qf', url, 'master'] + + return _gitweb_git_command_is_successful(git_push_command, cwd) + + +def _set_repo_access(browser, repo, access): + """Set repository as public or private.""" + functional.nav_to_module(browser, 'gitweb') + browser.find_link_by_href( + '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() + if access == 'private': + browser.find_by_id('id_gitweb-is_private').check() + else: + browser.find_by_id('id_gitweb-is_private').uncheck() + functional.submit(browser) + + +def _set_all_repos_private(browser): + """Set all repositories private""" + functional.nav_to_module(browser, 'gitweb') + public_repos = [] + for element in browser.find_by_css('#gitweb-repo-list .list-group-item'): + if not element.find_by_css('.repo-private-icon'): + repo = element.find_by_css('.repo-label').first.text + public_repos.append(repo) + for repo in public_repos: + _set_repo_access(browser, repo, 'private') + + +def _site_repo_exists(browser, repo): + """Check whether the repository exists on Gitweb site.""" + browser.visit('{}/gitweb'.format(_default_url)) + return browser.find_by_css('a[href="/gitweb/{0}.git"]'.format(repo)) diff --git a/plinth/modules/help/tests/test_functional.py b/plinth/modules/help/tests/test_functional.py index e62284ce8..dcdc66b9d 100644 --- a/plinth/modules/help/tests/test_functional.py +++ b/plinth/modules/help/tests/test_functional.py @@ -3,6 +3,26 @@ Functional, browser based tests for help app. """ -from pytest_bdd import scenarios +from pytest_bdd import scenarios, then, when + +from plinth.tests import functional scenarios('help.feature') + + +@when('I go to the status logs page') +def help_go_to_status_logs(session_browser): + _go_to_status_logs(session_browser) + + +@then('status logs should be shown') +def help_status_logs_are_shown(session_browser): + assert _are_status_logs_shown(session_browser) + + +def _go_to_status_logs(browser): + functional.visit(browser, '/plinth/help/status-log/') + + +def _are_status_logs_shown(browser): + return browser.is_text_present('Logs begin') diff --git a/plinth/modules/ikiwiki/tests/ikiwiki.feature b/plinth/modules/ikiwiki/tests/ikiwiki.feature index 7b6ab085b..d70056851 100644 --- a/plinth/modules/ikiwiki/tests/ikiwiki.feature +++ b/plinth/modules/ikiwiki/tests/ikiwiki.feature @@ -6,23 +6,23 @@ Feature: ikiwiki Wiki and Blog Background: Given I'm a logged in user - Given the wiki application is installed + Given the ikiwiki application is installed -Scenario: Enable wiki application - Given the wiki application is disabled - When I enable the wiki application - Then the wiki site should be available +Scenario: Enable ikiwiki application + Given the ikiwiki application is disabled + When I enable the ikiwiki application + Then the ikiwiki site should be available @backups -Scenario: Backup and restore wiki - Given the wiki application is enabled +Scenario: Backup and restore ikiwiki + Given the ikiwiki application is enabled When there is an ikiwiki wiki And I create a backup of the ikiwiki app data with name test_ikiwiki And I delete the ikiwiki wiki And I restore the ikiwiki app data backup with name test_ikiwiki Then the ikiwiki wiki should be restored -Scenario: Disable wiki application - Given the wiki application is enabled - When I disable the wiki application - Then the wiki site should not be available +Scenario: Disable ikiwiki application + Given the ikiwiki application is enabled + When I disable the ikiwiki application + Then the ikiwiki site should not be available diff --git a/plinth/modules/ikiwiki/tests/test_functional.py b/plinth/modules/ikiwiki/tests/test_functional.py index c8a67665f..9f173973a 100644 --- a/plinth/modules/ikiwiki/tests/test_functional.py +++ b/plinth/modules/ikiwiki/tests/test_functional.py @@ -3,6 +3,52 @@ Functional, browser based tests for ikiwiki app. """ -from pytest_bdd import scenarios +from pytest_bdd import scenarios, then, when + +from plinth.tests import functional scenarios('ikiwiki.feature') + + +@when('there is an ikiwiki wiki') +def ikiwiki_create_wiki_if_needed(session_browser): + _create_wiki_if_needed(session_browser) + + +@when('I delete the ikiwiki wiki') +def ikiwiki_delete_wiki(session_browser): + _delete_wiki(session_browser) + + +@then('the ikiwiki wiki should be restored') +def ikiwiki_should_exist(session_browser): + assert _wiki_exists(session_browser) + + +def _create_wiki_if_needed(browser): + """Create wiki if it does not exist.""" + functional.nav_to_module(browser, 'ikiwiki') + wiki = browser.find_link_by_href('/ikiwiki/wiki') + if not wiki: + browser.find_link_by_href('/plinth/apps/ikiwiki/create/').first.click() + browser.find_by_id('id_ikiwiki-name').fill('wiki') + browser.find_by_id('id_ikiwiki-admin_name').fill( + functional.config['DEFAULT']['username']) + browser.find_by_id('id_ikiwiki-admin_password').fill( + functional.config['DEFAULT']['password']) + functional.submit(browser) + + +def _delete_wiki(browser): + """Delete wiki.""" + functional.nav_to_module(browser, 'ikiwiki') + browser.find_link_by_href( + '/plinth/apps/ikiwiki/wiki/delete/').first.click() + functional.submit(browser) + + +def _wiki_exists(browser): + """Check whether the wiki exists.""" + functional.nav_to_module(browser, 'ikiwiki') + wiki = browser.find_link_by_href('/ikiwiki/wiki') + return bool(wiki) diff --git a/plinth/modules/mediawiki/tests/test_functional.py b/plinth/modules/mediawiki/tests/test_functional.py index 62c41b3a5..626dfbd1b 100644 --- a/plinth/modules/mediawiki/tests/test_functional.py +++ b/plinth/modules/mediawiki/tests/test_functional.py @@ -3,6 +3,216 @@ Functional, browser based tests for mediawiki app. """ -from pytest_bdd import scenarios +import pathlib + +from pytest_bdd import parsers, scenarios, then, when + +from plinth.tests import functional scenarios('mediawiki.feature') + + +@when(parsers.parse('I enable mediawiki public registrations')) +def enable_mediawiki_public_registrations(session_browser): + _enable_public_registrations(session_browser) + + +@when(parsers.parse('I disable mediawiki public registrations')) +def disable_mediawiki_public_registrations(session_browser): + _disable_public_registrations(session_browser) + + +@when(parsers.parse('I enable mediawiki private mode')) +def enable_mediawiki_private_mode(session_browser): + _enable_private_mode(session_browser) + + +@when(parsers.parse('I disable mediawiki private mode')) +def disable_mediawiki_private_mode(session_browser): + _disable_private_mode(session_browser) + + +@when(parsers.parse('I set the mediawiki admin password to {password}')) +def set_mediawiki_admin_password(session_browser, password): + _set_admin_password(session_browser, password) + + +@then(parsers.parse('the mediawiki site should allow creating accounts')) +def mediawiki_allows_creating_accounts(session_browser): + _verify_create_account_link(session_browser) + + +@then(parsers.parse('the mediawiki site should not allow creating accounts')) +def mediawiki_does_not_allow_creating_accounts(session_browser): + _verify_no_create_account_link(session_browser) + + +@then( + parsers.parse('the mediawiki site should allow anonymous reads and writes') +) +def mediawiki_allows_anonymous_reads_edits(session_browser): + _verify_anonymous_reads_edits_link(session_browser) + + +@then( + parsers.parse( + 'the mediawiki site should not allow anonymous reads and writes')) +def mediawiki_does_not_allow__account_creation_anonymous_reads_edits( + session_browser): + _verify_no_anonymous_reads_edits_link(session_browser) + + +@then( + parsers.parse( + 'I should see the Upload File option in the side pane when logged in ' + 'with credentials {username:w} and {password:w}')) +def login_to_mediawiki_with_credentials(session_browser, username, password): + _login_with_credentials(session_browser, username, password) + + +@when('I delete the mediawiki main page') +def mediawiki_delete_main_page(session_browser): + _delete_main_page(session_browser) + + +@then('the mediawiki main page should be restored') +def mediawiki_verify_text(session_browser): + assert _has_main_page(session_browser) + + +@when( + parsers.parse( + 'I upload an image named {image:S} to mediawiki with credentials ' + '{username:w} and {password:w}')) +def upload_image(session_browser, username, password, image): + _upload_image(session_browser, username, password, image) + + +@then(parsers.parse('there should be {image:S} image')) +def uploaded_image_should_be_available(session_browser, image): + uploaded_image = _get_uploaded_image(session_browser, image) + assert image.lower() == uploaded_image.lower() + + +def _enable_public_registrations(browser): + """Enable public registrations in MediaWiki.""" + functional.nav_to_module(browser, 'mediawiki') + functional.change_checkbox_status(browser, 'mediawiki', + 'id_enable_public_registrations', + 'enabled') + + +def _disable_public_registrations(browser): + """Enable public registrations in MediaWiki.""" + functional.nav_to_module(browser, 'mediawiki') + functional.change_checkbox_status(browser, 'mediawiki', + 'id_enable_public_registrations', + 'disabled') + + +def _enable_private_mode(browser): + """Enable public registrations in MediaWiki.""" + functional.nav_to_module(browser, 'mediawiki') + functional.change_checkbox_status(browser, 'mediawiki', + 'id_enable_private_mode', 'enabled') + + +def _disable_private_mode(browser): + """Enable public registrations in MediaWiki.""" + functional.nav_to_module(browser, 'mediawiki') + functional.change_checkbox_status(browser, 'mediawiki', + 'id_enable_private_mode', 'disabled') + + +def _set_admin_password(browser, password): + """Set a password for the MediaWiki user called admin.""" + functional.nav_to_module(browser, 'mediawiki') + browser.find_by_id('id_password').fill(password) + functional.submit(browser, form_class='form-configuration') + + +def _verify_create_account_link(browser): + functional.visit(browser, '/mediawiki/index.php/Special:CreateAccount') + assert functional.eventually(browser.is_element_present_by_id, + args=['wpCreateaccount']) + + +def _verify_no_create_account_link(browser): + functional.visit(browser, '/mediawiki/index.php/Special:CreateAccount') + assert functional.eventually(browser.is_element_not_present_by_id, + args=['wpCreateaccount']) + + +def _verify_anonymous_reads_edits_link(browser): + functional.visit(browser, '/mediawiki') + assert functional.eventually(browser.is_element_present_by_id, + args=['ca-nstab-main']) + + +def _verify_no_anonymous_reads_edits_link(browser): + functional.visit(browser, '/mediawiki') + assert functional.eventually(browser.is_element_not_present_by_id, + args=['ca-nstab-main']) + assert functional.eventually(browser.is_element_present_by_id, + args=['ca-nstab-special']) + + +def _login(browser, username, password): + functional.visit(browser, '/mediawiki/index.php?title=Special:Login') + browser.find_by_id('wpName1').fill(username) + browser.find_by_id('wpPassword1').fill(password) + with functional.wait_for_page_update(browser): + browser.find_by_id('wpLoginAttempt').click() + + +def _login_with_credentials(browser, username, password): + _login(browser, username, password) + # Had to put it in the same step because sessions don't + # persist between steps + assert functional.eventually(browser.is_element_present_by_id, + args=['t-upload']) + + +def _upload_image(browser, username, password, image): + """Upload an image to MediaWiki. Idempotent.""" + functional.visit(browser, '/mediawiki') + _login(browser, username, password) + + # Upload file + functional.visit(browser, '/mediawiki/Special:Upload') + file_path = pathlib.Path(__file__).parent + file_path /= '../../../../static/themes/default/img/' + image + browser.attach_file('wpUploadFile', str(file_path.resolve())) + functional.submit(browser, element=browser.find_by_name('wpUpload')[0]) + + +def _get_number_of_uploaded_images(browser): + functional.visit(browser, '/mediawiki/Special:ListFiles') + return len(browser.find_by_css('.TablePager_col_img_timestamp')) + + +def _get_uploaded_image(browser, image): + functional.visit(browser, '/mediawiki/Special:ListFiles') + elements = browser.find_link_by_partial_href(image) + return elements[0].value + + +def _delete_main_page(browser): + """Delete the mediawiki main page.""" + _login(browser, 'admin', 'whatever123') + functional.visit(browser, + '/mediawiki/index.php?title=Main_Page&action=delete') + with functional.wait_for_page_update(browser): + browser.find_by_id('wpConfirmB').first.click() + + +def _has_main_page(browser): + """Check if mediawiki main page exists.""" + return functional.eventually(__has_main_page, [browser]) + + +def __has_main_page(browser): + """Check if mediawiki main page exists.""" + functional.visit(browser, '/mediawiki/Main_Page') + content = browser.find_by_id('mw-content-text').first + return 'This page has been deleted.' not in content.text diff --git a/plinth/modules/mldonkey/tests/test_functional.py b/plinth/modules/mldonkey/tests/test_functional.py index 4bc0d706d..5a53cc855 100644 --- a/plinth/modules/mldonkey/tests/test_functional.py +++ b/plinth/modules/mldonkey/tests/test_functional.py @@ -3,6 +3,60 @@ Functional, browser based tests for mldonkey app. """ -from pytest_bdd import scenarios +from pytest_bdd import parsers, scenarios, then, when + +from plinth.tests import functional scenarios('mldonkey.feature') + + +@when('all ed2k files are removed from mldonkey') +def mldonkey_remove_all_ed2k_files(session_browser): + _remove_all_ed2k_files(session_browser) + + +@when('I upload a sample ed2k file to mldonkey') +def mldonkey_upload_sample_ed2k_file(session_browser): + _upload_sample_ed2k_file(session_browser) + + +@then( + parsers.parse( + 'there should be {ed2k_files_number:d} ed2k files listed in mldonkey')) +def mldonkey_assert_number_of_ed2k_files(session_browser, ed2k_files_number): + assert ed2k_files_number == _get_number_of_ed2k_files(session_browser) + + +def _submit_command(browser, command): + """Submit a command to mldonkey.""" + with browser.get_iframe('commands') as commands_frame: + commands_frame.find_by_css('.txt2').fill(command) + commands_frame.find_by_css('.but2').click() + + +def _remove_all_ed2k_files(browser): + """Remove all ed2k files from mldonkey.""" + functional.visit(browser, '/mldonkey/') + _submit_command(browser, 'cancel all') + _submit_command(browser, 'confirm yes') + + +def _upload_sample_ed2k_file(browser): + """Upload a sample ed2k file into mldonkey.""" + functional.visit(browser, '/mldonkey/') + dllink_command = 'dllink ed2k://|file|foo.bar|123|' \ + '0123456789ABCDEF0123456789ABCDEF|/' + _submit_command(browser, dllink_command) + + +def _get_number_of_ed2k_files(browser): + """Return the number of ed2k files currently in mldonkey.""" + functional.visit(browser, '/mldonkey/') + + with browser.get_iframe('commands') as commands_frame: + commands_frame.find_by_xpath( + '//tr//td[contains(text(), "Transfers")]').click() + + with browser.get_iframe('output') as output_frame: + return len(output_frame.find_by_css('.dl-1')) + len( + output_frame.find_by_css('.dl-2')) diff --git a/plinth/modules/monkeysphere/tests/test_functional.py b/plinth/modules/monkeysphere/tests/test_functional.py index f475b9320..45ab8383d 100644 --- a/plinth/modules/monkeysphere/tests/test_functional.py +++ b/plinth/modules/monkeysphere/tests/test_functional.py @@ -3,6 +3,79 @@ Functional, browser based tests for monkeysphere app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('monkeysphere.feature') + + +@given( + parsers.parse( + 'the {key_type:w} key for {domain:S} is imported in monkeysphere')) +def monkeysphere_given_import_key(session_browser, key_type, domain): + _import_key(session_browser, key_type.lower(), domain) + + +@when(parsers.parse('I import {key_type:w} key for {domain:S} in monkeysphere') + ) +def monkeysphere_import_key(session_browser, key_type, domain): + _import_key(session_browser, key_type.lower(), domain) + + +@then( + parsers.parse( + 'the {key_type:w} key should imported for {domain:S} in monkeysphere')) +def monkeysphere_assert_imported_key(session_browser, key_type, domain): + _assert_imported_key(session_browser, key_type.lower(), domain) + + +@then( + parsers.parse('I should be able to publish {key_type:w} key for ' + '{domain:S} in monkeysphere')) +def monkeysphere_publish_key(session_browser, key_type, domain): + _publish_key(session_browser, key_type.lower(), domain) + + +def _find_domain(browser, key_type, domain_type, domain): + """Iterate every domain of a given type which given key type.""" + keys_of_type = browser.find_by_css( + '.monkeysphere-service-{}'.format(key_type)) + for key_of_type in keys_of_type: + search_domains = key_of_type.find_by_css( + '.monkeysphere-{}-domain'.format(domain_type)) + for search_domain in search_domains: + if search_domain.text == domain: + return key_of_type, search_domain + + raise IndexError('Domain not found') + + +def _import_key(browser, key_type, domain): + """Import a key of specified type for given domain into monkeysphere.""" + try: + monkeysphere_assert_imported_key(browser, key_type, domain) + except IndexError: + pass + else: + return + + key, _ = _find_domain(browser, key_type, 'importable', domain) + with functional.wait_for_page_update(browser): + key.find_by_css('.button-import').click() + + +def _assert_imported_key(browser, key_type, domain): + """Assert that a key of specified type for given domain was imported..""" + functional.nav_to_module(browser, 'monkeysphere') + return _find_domain(browser, key_type, 'imported', domain) + + +def _publish_key(browser, key_type, domain): + """Publish a key of specified type for given domain from monkeysphere.""" + functional.nav_to_module(browser, 'monkeysphere') + key, _ = _find_domain(browser, key_type, 'imported', domain) + with functional.wait_for_page_update(browser): + key.find_by_css('.button-publish').click() + + functional.wait_for_config_update(browser, 'monkeysphere') diff --git a/plinth/modules/openvpn/tests/test_functional.py b/plinth/modules/openvpn/tests/test_functional.py index 176632bec..2c5fa58d8 100644 --- a/plinth/modules/openvpn/tests/test_functional.py +++ b/plinth/modules/openvpn/tests/test_functional.py @@ -3,6 +3,44 @@ Functional, browser based tests for openvpn app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then + +from plinth.tests import functional scenarios('openvpn.feature') + + +@given(parsers.parse('the openvpn application is setup')) +def openvpn_setup(session_browser): + """Setup the OpenVPN application after installation.""" + functional.nav_to_module(session_browser, 'openvpn') + setup_form = session_browser.find_by_css('.form-setup') + if not setup_form: + return + + functional.submit(session_browser, form_class='form-setup') + functional.wait_for_config_update(session_browser, 'openvpn') + + +@given('I download openvpn profile') +def openvpn_download_profile(session_browser): + return _download_profile(session_browser) + + +@then('the openvpn profile should be downloadable') +def openvpn_profile_downloadable(session_browser): + _download_profile(session_browser) + + +@then('the openvpn profile downloaded should be same as before') +def openvpn_profile_download_compare(session_browser, + openvpn_download_profile): + new_profile = _download_profile(session_browser) + assert openvpn_download_profile == new_profile + + +def _download_profile(browser): + """Download the current user's profile into a file and return path.""" + functional.nav_to_module(browser, 'openvpn') + url = browser.find_by_css('.form-profile')['action'] + return functional.download_file(browser, url) diff --git a/plinth/modules/pagekite/tests/test_functional.py b/plinth/modules/pagekite/tests/test_functional.py index 227edad44..d18168619 100644 --- a/plinth/modules/pagekite/tests/test_functional.py +++ b/plinth/modules/pagekite/tests/test_functional.py @@ -3,6 +3,45 @@ Functional, browser based tests for pagekite app. """ -from pytest_bdd import scenarios +from pytest_bdd import parsers, scenarios, then, when + +from plinth.tests import functional scenarios('pagekite.feature') + + +@when( + parsers.parse('I configure pagekite with host {host:S}, port {port:d}, ' + 'kite name {kite_name:S} and kite secret {kite_secret:w}')) +def pagekite_configure(session_browser, host, port, kite_name, kite_secret): + _configure(session_browser, host, port, kite_name, kite_secret) + + +@then( + parsers.parse( + 'pagekite should be configured with host {host:S}, port {port:d}, ' + 'kite name {kite_name:S} and kite secret {kite_secret:w}')) +def pagekite_assert_configured(session_browser, host, port, kite_name, + kite_secret): + assert (host, port, kite_name, + kite_secret) == _get_configuration(session_browser) + + +def _configure(browser, host, port, kite_name, kite_secret): + """Configure pagekite basic parameters.""" + functional.nav_to_module(browser, 'pagekite') + # time.sleep(0.250) # Wait for 200ms show animation to complete + browser.fill('pagekite-server_domain', host) + browser.fill('pagekite-server_port', str(port)) + browser.fill('pagekite-kite_name', kite_name) + browser.fill('pagekite-kite_secret', kite_secret) + functional.submit(browser, form_class='form-configuration') + + +def _get_configuration(browser): + """Return pagekite basic parameters.""" + functional.nav_to_module(browser, 'pagekite') + return (browser.find_by_name('pagekite-server_domain').value, + int(browser.find_by_name('pagekite-server_port').value), + browser.find_by_name('pagekite-kite_name').value, + browser.find_by_name('pagekite-kite_secret').value) diff --git a/plinth/modules/radicale/tests/test_functional.py b/plinth/modules/radicale/tests/test_functional.py index 5af778039..7b3a29463 100644 --- a/plinth/modules/radicale/tests/test_functional.py +++ b/plinth/modules/radicale/tests/test_functional.py @@ -3,6 +3,118 @@ Functional, browser based tests for radicale app. """ -from pytest_bdd import scenarios +import logging +import requests +from pytest_bdd import given, scenarios, then, when + +from plinth.tests import functional + +logger = logging.getLogger(__name__) scenarios('radicale.feature') + + +@given('the access rights are set to "only the owner can view or make changes"' + ) +def radicale_given_owner_only(session_browser): + _set_access_rights(session_browser, 'owner_only') + + +@given('the access rights are set to "any user can view, but only the ' + 'owner can make changes"') +def radicale_given_owner_write(session_browser): + _set_access_rights(session_browser, 'owner_write') + + +@given('the access rights are set to "any user can view or make changes"') +def radicale_given_authenticated(session_browser): + _set_access_rights(session_browser, 'authenticated') + + +@when('I change the access rights to "only the owner can view or make changes"' + ) +def radicale_set_owner_only(session_browser): + _set_access_rights(session_browser, 'owner_only') + + +@when('I change the access rights to "any user can view, but only the ' + 'owner can make changes"') +def radicale_set_owner_write(session_browser): + _set_access_rights(session_browser, 'owner_write') + + +@when('I change the access rights to "any user can view or make changes"') +def radicale_set_authenticated(session_browser): + _set_access_rights(session_browser, 'authenticated') + + +@then('the access rights should be "only the owner can view or make changes"') +def radicale_check_owner_only(session_browser): + assert _get_access_rights(session_browser) == 'owner_only' + + +@then('the access rights should be "any user can view, but only the ' + 'owner can make changes"') +def radicale_check_owner_write(session_browser): + assert _get_access_rights(session_browser) == 'owner_write' + + +@then('the access rights should be "any user can view or make changes"') +def radicale_check_authenticated(session_browser): + assert _get_access_rights(session_browser) == 'authenticated' + + +@then('the calendar should be available') +def assert_calendar_is_available(session_browser): + assert _calendar_is_available(session_browser) + + +@then('the calendar should not be available') +def assert_calendar_is_not_available(session_browser): + assert not _calendar_is_available(session_browser) + + +@then('the addressbook should be available') +def assert_addressbook_is_available(session_browser): + assert _addressbook_is_available(session_browser) + + +@then('the addressbook should not be available') +def assert_addressbook_is_not_available(session_browser): + assert not _addressbook_is_available(session_browser) + + +def _get_access_rights(browser): + access_rights_types = ['owner_only', 'owner_write', 'authenticated'] + functional.nav_to_module(browser, 'radicale') + for access_rights_type in access_rights_types: + if browser.find_by_value(access_rights_type).checked: + return access_rights_type + + +def _set_access_rights(browser, access_rights_type): + functional.nav_to_module(browser, 'radicale') + browser.choose('access_rights', access_rights_type) + functional.submit(browser, form_class='form-configuration') + + +def _calendar_is_available(browser): + """Return whether calendar is available at well-known URL.""" + conf = functional.config['DEFAULT'] + url = functional.base_url + '/.well-known/caldav' + logging.captureWarnings(True) + request = requests.get(url, auth=(conf['username'], conf['password']), + verify=False) + logging.captureWarnings(False) + return request.status_code != 404 + + +def _addressbook_is_available(browser): + """Return whether addressbook is available at well-known URL.""" + conf = functional.config['DEFAULT'] + url = functional.base_url + '/.well-known/carddav' + logging.captureWarnings(True) + request = requests.get(url, auth=(conf['username'], conf['password']), + verify=False) + logging.captureWarnings(False) + return request.status_code != 404 diff --git a/plinth/modules/samba/tests/test_functional.py b/plinth/modules/samba/tests/test_functional.py index 237a1171c..5b2319fb0 100644 --- a/plinth/modules/samba/tests/test_functional.py +++ b/plinth/modules/samba/tests/test_functional.py @@ -3,6 +3,117 @@ Functional, browser based tests for samba app. """ -from pytest_bdd import scenarios +import random +import string +import subprocess +import urllib + +from pytest_bdd import parsers, scenarios, then, when + +from plinth.tests import functional scenarios('samba.feature') + + +@when(parsers.parse('I {task:w} the {share_type:w} samba share')) +def samba_enable_share(session_browser, task, share_type): + if task == 'enable': + _set_share(session_browser, share_type, status='enabled') + elif task == 'disable': + _set_share(session_browser, share_type, status='disabled') + + +@then(parsers.parse('I can write to the {share_type:w} samba share')) +def samba_share_should_be_writable(share_type): + _assert_share_is_writable(share_type) + + +@then(parsers.parse('a guest user can write to the {share_type:w} samba share') + ) +def samba_share_should_be_writable_to_guest(share_type): + _assert_share_is_writable(share_type, as_guest=True) + + +@then( + parsers.parse('a guest user can\'t access the {share_type:w} samba share')) +def samba_share_should_not_be_accessible_to_guest(share_type): + _assert_share_is_not_accessible(share_type, as_guest=True) + + +@then(parsers.parse('the {share_type:w} samba share should not be available')) +def samba_share_should_not_be_available(share_type): + _assert_share_is_not_available(share_type) + + +def _set_share(browser, share_type, status='enabled'): + """Enable or disable samba share.""" + disk_name = 'disk' + share_type_name = '{0}_share'.format(share_type) + functional.nav_to_module(browser, 'samba') + for elem in browser.find_by_tag('td'): + if elem.text == disk_name: + share_form = elem.find_by_xpath('(..//*)[2]/form').first + share_btn = share_form.find_by_name(share_type_name).first + if status == 'enabled' and share_btn['value'] == 'enable': + share_btn.click() + elif status == 'disabled' and share_btn['value'] == 'disable': + share_btn.click() + break + + +def _write_to_share(share_type, as_guest=False): + """Write to the samba share, return output messages as string.""" + disk_name = 'disk' + default_url = functional.config['DEFAULT']['url'] + if share_type == 'open': + share_name = disk_name + else: + share_name = '{0}_{1}'.format(disk_name, share_type) + hostname = urllib.parse.urlparse(default_url).hostname + servicename = '\\\\{0}\\{1}'.format(hostname, share_name) + directory = '_plinth-test_{0}'.format(''.join( + random.SystemRandom().choices(string.ascii_letters, k=8))) + port = functional.config['DEFAULT']['samba_port'] + + smb_command = ['smbclient', '-W', 'WORKGROUP', '-p', port] + if as_guest: + smb_command += ['-N'] + else: + smb_command += [ + '-U', '{0}%{1}'.format(functional.config['DEFAULT']['username'], + functional.config['DEFAULT']['password']) + ] + smb_command += [ + servicename, '-c', 'mkdir {0}; rmdir {0}'.format(directory) + ] + + return subprocess.check_output(smb_command).decode() + + +def _assert_share_is_writable(share_type, as_guest=False): + """Assert that samba share is writable.""" + output = _write_to_share(share_type, as_guest=False) + + assert not output, output + + +def _assert_share_is_not_accessible(share_type, as_guest=False): + """Assert that samba share is not accessible.""" + try: + _write_to_share(share_type, as_guest) + except subprocess.CalledProcessError as err: + err_output = err.output.decode() + assert 'NT_STATUS_ACCESS_DENIED' in err_output, err_output + else: + assert False, 'Can access the share.' + + +def _assert_share_is_not_available(share_type): + """Assert that samba share is not accessible.""" + try: + _write_to_share(share_type) + except subprocess.CalledProcessError as err: + err_output = err.output.decode() + assert 'NT_STATUS_BAD_NETWORK_NAME' in err_output, err_output + else: + assert False, 'Can access the share.' diff --git a/plinth/modules/searx/tests/test_functional.py b/plinth/modules/searx/tests/test_functional.py index 459de6735..e24ca2548 100644 --- a/plinth/modules/searx/tests/test_functional.py +++ b/plinth/modules/searx/tests/test_functional.py @@ -3,6 +3,37 @@ Functional, browser based tests for searx app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, scenarios, when + +from plinth.tests import functional scenarios('searx.feature') + + +@given('public access is enabled in searx') +def searx_public_access_enabled(session_browser): + _enable_public_access(session_browser) + + +@when('I enable public access in searx') +def searx_enable_public_access(session_browser): + _enable_public_access(session_browser) + + +@when('I disable public access in searx') +def searx_disable_public_access(session_browser): + _disable_public_access(session_browser) + + +def _enable_public_access(browser): + """Enable Public Access in SearX""" + functional.nav_to_module(browser, 'searx') + browser.find_by_id('id_public_access').check() + functional.submit(browser, form_class='form-configuration') + + +def _disable_public_access(browser): + """Enable Public Access in SearX""" + functional.nav_to_module(browser, 'searx') + browser.find_by_id('id_public_access').uncheck() + functional.submit(browser, form_class='form-configuration') diff --git a/plinth/modules/security/tests/test_functional.py b/plinth/modules/security/tests/test_functional.py index af98e32d5..c0266b111 100644 --- a/plinth/modules/security/tests/test_functional.py +++ b/plinth/modules/security/tests/test_functional.py @@ -3,6 +3,43 @@ Functional, browser based tests for security app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('security.feature') + + +@given(parsers.parse('restricted console logins are {enabled}')) +def security_given_enable_restricted_logins(session_browser, enabled): + should_enable = (enabled == 'enabled') + _enable_restricted_logins(session_browser, should_enable) + + +@when(parsers.parse('I {enable} restricted console logins')) +def security_enable_restricted_logins(session_browser, enable): + should_enable = (enable == 'enable') + _enable_restricted_logins(session_browser, should_enable) + + +@then(parsers.parse('restricted console logins should be {enabled}')) +def security_assert_restricted_logins(session_browser, enabled): + enabled = (enabled == 'enabled') + assert _get_restricted_logins(session_browser) == enabled + + +def _enable_restricted_logins(browser, should_enable): + """Enable/disable restricted logins in security module.""" + functional.nav_to_module(browser, 'security') + if should_enable: + browser.check('security-restricted_access') + else: + browser.uncheck('security-restricted_access') + + functional.submit(browser) + + +def _get_restricted_logins(browser): + """Return whether restricted console logins is enabled.""" + functional.nav_to_module(browser, 'security') + return browser.find_by_name('security-restricted_access').first.checked diff --git a/plinth/modules/shadowsocks/tests/test_functional.py b/plinth/modules/shadowsocks/tests/test_functional.py index 3ee9d1237..3e6095690 100644 --- a/plinth/modules/shadowsocks/tests/test_functional.py +++ b/plinth/modules/shadowsocks/tests/test_functional.py @@ -3,6 +3,43 @@ Functional, browser based tests for shadowsocks app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('shadowsocks.feature') + + +@given('the shadowsocks application is configured') +def configure_shadowsocks(session_browser): + _configure(session_browser, 'example.com', 'fakepassword') + + +@when( + parsers.parse('I configure shadowsocks with server {server:S} and ' + 'password {password:w}')) +def configure_shadowsocks_with_details(session_browser, server, password): + _configure(session_browser, server, password) + + +@then( + parsers.parse('shadowsocks should be configured with server {server:S} ' + 'and password {password:w}')) +def assert_shadowsocks_configuration(session_browser, server, password): + assert (server, password) == _get_configuration(session_browser) + + +def _configure(browser, server, password): + """Configure shadowsocks client with given server details.""" + functional.visit(browser, '/plinth/apps/shadowsocks/') + browser.find_by_id('id_server').fill(server) + browser.find_by_id('id_password').fill(password) + functional.submit(browser, form_class='form-configuration') + + +def _get_configuration(browser): + """Return the server and password currently configured in shadowsocks.""" + functional.visit(browser, '/plinth/apps/shadowsocks/') + server = browser.find_by_id('id_server').value + password = browser.find_by_id('id_password').value + return server, password diff --git a/plinth/modules/sharing/tests/test_functional.py b/plinth/modules/sharing/tests/test_functional.py index 974840cec..7ce837e68 100644 --- a/plinth/modules/sharing/tests/test_functional.py +++ b/plinth/modules/sharing/tests/test_functional.py @@ -3,6 +3,145 @@ Functional, browser based tests for sharing app. """ -from pytest_bdd import scenarios +import pytest +import splinter +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('sharing.feature') + + +@given(parsers.parse('share {name:w} is not available')) +def remove_share(session_browser, name): + _remove_share(session_browser, name) + + +@when(parsers.parse('I add a share {name:w} from path {path} for {group:w}')) +def add_share(session_browser, name, path, group): + _add_share(session_browser, name, path, group) + + +@when( + parsers.parse('I edit share {old_name:w} to {new_name:w} from path {path} ' + 'for {group:w}')) +def edit_share(session_browser, old_name, new_name, path, group): + _edit_share(session_browser, old_name, new_name, path, group) + + +@when(parsers.parse('I remove share {name:w}')) +def remove_share2(session_browser, name): + _remove_share(session_browser, name) + + +@when(parsers.parse('I edit share {name:w} to be public')) +def edit_share_public_access(session_browser, name): + _make_share_public(session_browser, name) + + +@then( + parsers.parse( + 'the share {name:w} should be listed from path {path} for {group:w}')) +def verify_share(session_browser, name, path, group): + _verify_share(session_browser, name, path, group) + + +@then(parsers.parse('the share {name:w} should not be listed')) +def verify_invalid_share(session_browser, name): + with pytest.raises(splinter.exceptions.ElementDoesNotExist): + _get_share(session_browser, name) + + +@then(parsers.parse('the share {name:w} should be accessible')) +def access_share(session_browser, name): + _access_share(session_browser, name) + + +@then(parsers.parse('the share {name:w} should not exist')) +def verify_nonexistant_share(session_browser, name): + _verify_nonexistant_share(session_browser, name) + + +@then(parsers.parse('the share {name:w} should not be accessible')) +def verify_inaccessible_share(session_browser, name): + _verify_inaccessible_share(session_browser, name) + + +def _remove_share(browser, name): + """Remove a share in sharing app.""" + try: + share_row = _get_share(browser, name) + except splinter.exceptions.ElementDoesNotExist: + pass + else: + share_row.find_by_css('.share-remove')[0].click() + + +def _add_share(browser, name, path, group): + """Add a share in sharing app.""" + functional.visit(browser, '/plinth/apps/sharing/add/') + browser.fill('sharing-name', name) + browser.fill('sharing-path', path) + browser.find_by_css( + '#id_sharing-groups input[value="{}"]'.format(group)).check() + functional.submit(browser) + + +def _edit_share(browser, old_name, new_name, path, group): + """Edit a share in sharing app.""" + row = _get_share(browser, old_name) + with functional.wait_for_page_update(browser): + row.find_by_css('.share-edit')[0].click() + browser.fill('sharing-name', new_name) + browser.fill('sharing-path', path) + browser.find_by_css('#id_sharing-groups input').uncheck() + browser.find_by_css( + '#id_sharing-groups input[value="{}"]'.format(group)).check() + functional.submit(browser) + + +def _get_share(browser, name): + """Return the row for a given share.""" + functional.visit(browser, '/plinth/apps/sharing/') + return browser.find_by_id('share-{}'.format(name))[0] + + +def _verify_share(browser, name, path, group): + """Verfiy that a share exists in list of shares.""" + href = f'{functional.base_url}/share/{name}' + url = f'/share/{name}' + row = _get_share(browser, name) + assert row.find_by_css('.share-name')[0].text == name + assert row.find_by_css('.share-path')[0].text == path + assert row.find_by_css('.share-url a')[0]['href'] == href + assert row.find_by_css('.share-url a')[0].text == url + assert row.find_by_css('.share-groups')[0].text == group + + +def _access_share(browser, name): + """Visit a share and see if it is accessible.""" + row = _get_share(browser, name) + url = row.find_by_css('.share-url a')[0]['href'] + browser.visit(url) + assert '/share/{}'.format(name) in browser.title + + +def _make_share_public(browser, name): + """Make share publicly accessible.""" + row = _get_share(browser, name) + with functional.wait_for_page_update(browser): + row.find_by_css('.share-edit')[0].click() + browser.find_by_id('id_sharing-is_public').check() + functional.submit(browser) + + +def _verify_nonexistant_share(browser, name): + """Verify that given URL for a given share name is a 404.""" + functional.visit(browser, f'/share/{name}') + assert '404' in browser.title + + +def _verify_inaccessible_share(browser, name): + """Verify that given URL for a given share name denies permission.""" + functional.visit(browser, f'/share/{name}') + functional.eventually(lambda: '/plinth' in browser.url, args=[]) diff --git a/plinth/modules/snapshot/tests/test_functional.py b/plinth/modules/snapshot/tests/test_functional.py index 4fc5aee8d..0eecf3c53 100644 --- a/plinth/modules/snapshot/tests/test_functional.py +++ b/plinth/modules/snapshot/tests/test_functional.py @@ -3,6 +3,125 @@ Functional, browser based tests for snapshot app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('snapshot.feature') + + +@given('the list of snapshots is empty') +def empty_snapshots_list(session_browser): + _delete_all(session_browser) + + +@when('I manually create a snapshot') +def create_snapshot(session_browser): + _create(session_browser) + + +@then(parsers.parse('there should be {count:d} snapshot in the list')) +def verify_snapshot_count(session_browser, count): + num_snapshots = _get_count(session_browser) + assert num_snapshots == count + + +@given( + parsers.parse( + 'snapshots are configured with free space {free_space:d}, timeline ' + 'snapshots {timeline_enabled:w}, software snapshots ' + '{software_enabled:w}, hourly limit {hourly:d}, daily limit {daily:d}' + ', weekly limit {weekly:d}, monthly limit {monthly:d}, yearly limit ' + '{yearly:d}')) +def snapshot_given_set_configuration(session_browser, free_space, + timeline_enabled, software_enabled, + hourly, daily, weekly, monthly, yearly): + timeline_enabled = (timeline_enabled == 'enabled') + software_enabled = (software_enabled == 'enabled') + _set_configuration(session_browser, free_space, timeline_enabled, + software_enabled, hourly, daily, weekly, monthly, + yearly) + + +@when( + parsers.parse( + 'I configure snapshots with free space {free_space:d}, ' + 'timeline snapshots {timeline_enabled:w}, ' + 'software snapshots {software_enabled:w}, hourly limit {hourly:d}, ' + 'daily limit {daily:d}, weekly limit {weekly:d}, monthly limit ' + '{monthly:d}, yearly limit {yearly:d}')) +def snapshot_set_configuration(session_browser, free_space, timeline_enabled, + software_enabled, hourly, daily, weekly, + monthly, yearly): + timeline_enabled = (timeline_enabled == 'enabled') + software_enabled = (software_enabled == 'enabled') + _set_configuration(session_browser, free_space, timeline_enabled, + software_enabled, hourly, daily, weekly, monthly, + yearly) + + +@then( + parsers.parse( + 'snapshots should be configured with free space {free_space:d}, ' + 'timeline snapshots {timeline_enabled:w}, software snapshots ' + '{software_enabled:w}, hourly limit {hourly:d}, daily limit ' + '{daily:d}, weekly limit {weekly:d}, monthly limit {monthly:d}, ' + 'yearly limit {yearly:d}')) +def snapshot_assert_configuration(session_browser, free_space, + timeline_enabled, software_enabled, hourly, + daily, weekly, monthly, yearly): + timeline_enabled = (timeline_enabled == 'enabled') + software_enabled = (software_enabled == 'enabled') + assert (free_space, timeline_enabled, software_enabled, hourly, daily, + weekly, monthly, yearly) == _get_configuration(session_browser) + + +def _delete_all(browser): + if _get_count(browser): + browser.find_by_id('select-all').check() + functional.submit(browser, browser.find_by_name('delete_selected')) + + confirm_button = browser.find_by_name('delete_confirm') + if confirm_button: # Only if redirected to confirm page + functional.submit(browser, confirm_button) + + +def _create(browser): + functional.visit(browser, '/plinth/sys/snapshot/manage/') + functional.submit(browser) # Click on 'Create Snapshot' + + +def _get_count(browser): + functional.visit(browser, '/plinth/sys/snapshot/manage/') + # Subtract 1 for table header + return len(browser.find_by_xpath('//tr')) - 1 + + +def _set_configuration(browser, free_space, timeline_enabled, software_enabled, + hourly, daily, weekly, monthly, yearly): + """Set the configuration for snapshots.""" + functional.nav_to_module(browser, 'snapshot') + browser.find_by_name('free_space').select(free_space / 100) + browser.find_by_name('enable_timeline_snapshots').select( + 'yes' if timeline_enabled else 'no') + browser.find_by_name('enable_software_snapshots').select( + 'yes' if software_enabled else 'no') + browser.find_by_name('hourly_limit').fill(hourly) + browser.find_by_name('daily_limit').fill(daily) + browser.find_by_name('weekly_limit').fill(weekly) + browser.find_by_name('monthly_limit').fill(monthly) + browser.find_by_name('yearly_limit').fill(yearly) + functional.submit(browser) + + +def _get_configuration(browser): + """Return the current configuration for snapshots.""" + functional.nav_to_module(browser, 'snapshot') + return (int(float(browser.find_by_name('free_space').value) * 100), + browser.find_by_name('enable_timeline_snapshots').value == 'yes', + browser.find_by_name('enable_software_snapshots').value == 'yes', + int(browser.find_by_name('hourly_limit').value), + int(browser.find_by_name('daily_limit').value), + int(browser.find_by_name('weekly_limit').value), + int(browser.find_by_name('monthly_limit').value), + int(browser.find_by_name('yearly_limit').value)) diff --git a/plinth/modules/storage/tests/test_functional.py b/plinth/modules/storage/tests/test_functional.py index 737f32ef1..aa1cce7e1 100644 --- a/plinth/modules/storage/tests/test_functional.py +++ b/plinth/modules/storage/tests/test_functional.py @@ -3,6 +3,23 @@ Functional, browser based tests for storage app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then + +from plinth.tests import functional scenarios('storage.feature') + + +@then('the root disk should be shown') +def storage_root_disk_is_shown(session_browser): + assert _is_root_disk_shown(session_browser) + + +@given(parsers.parse("I'm on the {name:w} page")) +def go_to_module(session_browser, name): + functional.nav_to_module(session_browser, name) + + +def _is_root_disk_shown(browser): + table_cells = browser.find_by_tag('td') + return any(cell.text == '/' for cell in table_cells) diff --git a/plinth/modules/syncthing/tests/test_functional.py b/plinth/modules/syncthing/tests/test_functional.py index eac5eb009..6709948d1 100644 --- a/plinth/modules/syncthing/tests/test_functional.py +++ b/plinth/modules/syncthing/tests/test_functional.py @@ -3,6 +3,141 @@ Functional, browser based tests for syncthing app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('syncthing.feature') + + +@given(parsers.parse('syncthing folder {folder_name:w} is not present')) +def syncthing_folder_not_present(session_browser, folder_name): + if _folder_is_present(session_browser, folder_name): + _remove_folder(session_browser, folder_name) + + +@given( + parsers.parse( + 'folder {folder_path:S} is present as syncthing folder {folder_name:w}' + )) +def syncthing_folder_present(session_browser, folder_name, folder_path): + if not _folder_is_present(session_browser, folder_name): + _add_folder(session_browser, folder_name, folder_path) + + +@when( + parsers.parse( + 'I add a folder {folder_path:S} as syncthing folder {folder_name:w}')) +def syncthing_add_folder(session_browser, folder_name, folder_path): + _add_folder(session_browser, folder_name, folder_path) + + +@when(parsers.parse('I remove syncthing folder {folder_name:w}')) +def syncthing_remove_folder(session_browser, folder_name): + _remove_folder(session_browser, folder_name) + + +@then(parsers.parse('syncthing folder {folder_name:w} should be present')) +def syncthing_assert_folder_present(session_browser, folder_name): + assert _folder_is_present(session_browser, folder_name) + + +@then(parsers.parse('syncthing folder {folder_name:w} should not be present')) +def syncthing_assert_folder_not_present(session_browser, folder_name): + assert not _folder_is_present(session_browser, folder_name) + + +def _load_main_interface(browser): + """Close the dialog boxes that many popup after visiting the URL.""" + functional.access_url(browser, 'syncthing') + + def service_is_available(): + if browser.is_element_present_by_xpath( + '//h1[text()="Service Unavailable"]'): + functional.access_url(browser, 'syncthing') + return False + + return True + + # After a backup restore, service may not be available immediately + functional.eventually(service_is_available) + + # Wait for javascript loading process to complete + browser.execute_script(''' + document.is_ui_online = false; + var old_console_log = console.log; + console.log = function(message) { + old_console_log.apply(null, arguments); + if (message == 'UIOnline') { + document.is_ui_online = true; + console.log = old_console_log; + } + }; + ''') + functional.eventually( + lambda: browser.evaluate_script('document.is_ui_online'), timeout=5) + + # Dismiss the Usage Reporting consent dialog + usage_reporting = browser.find_by_id('ur').first + functional.eventually(lambda: usage_reporting.visible, timeout=2) + if usage_reporting.visible: + yes_xpath = './/button[contains(@ng-click, "declineUR")]' + usage_reporting.find_by_xpath(yes_xpath).first.click() + functional.eventually(lambda: not usage_reporting.visible) + + +def _folder_is_present(browser, folder_name): + """Return whether a folder is present in Syncthing.""" + _load_main_interface(browser) + folder_names = browser.find_by_css('#folders .panel-title-text span') + folder_names = [folder_name.text for folder_name in folder_names] + return folder_name in folder_names + + +def _add_folder(browser, folder_name, folder_path): + """Add a new folder to Synthing.""" + _load_main_interface(browser) + add_folder_xpath = '//button[contains(@ng-click, "addFolder")]' + browser.find_by_xpath(add_folder_xpath).click() + + folder_dialog = browser.find_by_id('editFolder').first + functional.eventually(lambda: folder_dialog.visible) + browser.find_by_id('folderLabel').fill(folder_name) + browser.find_by_id('folderPath').fill(folder_path) + save_folder_xpath = './/button[contains(@ng-click, "saveFolder")]' + folder_dialog.find_by_xpath(save_folder_xpath).first.click() + functional.eventually(lambda: not folder_dialog.visible) + + +def _remove_folder(browser, folder_name): + """Remove a folder from Synthing.""" + _load_main_interface(browser) + + # Find folder + folder = None + for current_folder in browser.find_by_css('#folders > .panel'): + name = current_folder.find_by_css('.panel-title-text span').first.text + if name == folder_name: + folder = current_folder + break + + # Edit folder button + folder.find_by_css('button.panel-heading').first.click() + functional.eventually(lambda: folder.find_by_css('div.collapse.in')) + edit_folder_xpath = './/button[contains(@ng-click, "editFolder")]' + edit_folder_button = folder.find_by_xpath(edit_folder_xpath).first + edit_folder_button.click() + + # Edit folder dialog + folder_dialog = browser.find_by_id('editFolder').first + functional.eventually(lambda: folder_dialog.visible) + remove_button_xpath = './/button[contains(@data-target, "remove-folder")]' + folder_dialog.find_by_xpath(remove_button_xpath).first.click() + + # Remove confirmation dialog + remove_folder_dialog = browser.find_by_id('remove-folder-confirmation') + functional.eventually(lambda: remove_folder_dialog.visible) + remove_button_xpath = './/button[contains(@ng-click, "deleteFolder")]' + remove_folder_dialog.find_by_xpath(remove_button_xpath).first.click() + + functional.eventually(lambda: not folder_dialog.visible) diff --git a/plinth/modules/tahoe/tests/test_functional.py b/plinth/modules/tahoe/tests/test_functional.py index 899cc62c2..c6ebedb29 100644 --- a/plinth/modules/tahoe/tests/test_functional.py +++ b/plinth/modules/tahoe/tests/test_functional.py @@ -3,6 +3,72 @@ Functional, browser based tests for tahoe app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('tahoe.feature') + + +@then( + parsers.parse( + '{domain:S} should be a tahoe {introducer_type:w} introducer')) +def tahoe_assert_introducer(session_browser, domain, introducer_type): + assert _get_introducer(session_browser, domain, introducer_type) + + +@then( + parsers.parse( + '{domain:S} should not be a tahoe {introducer_type:w} introducer')) +def tahoe_assert_not_introducer(session_browser, domain, introducer_type): + assert not _get_introducer(session_browser, domain, introducer_type) + + +@given(parsers.parse('{domain:S} is not a tahoe introducer')) +def tahoe_given_remove_introducer(session_browser, domain): + if _get_introducer(session_browser, domain, 'connected'): + _remove_introducer(session_browser, domain) + + +@when(parsers.parse('I add {domain:S} as a tahoe introducer')) +def tahoe_add_introducer(session_browser, domain): + _add_introducer(session_browser, domain) + + +@given(parsers.parse('{domain:S} is a tahoe introducer')) +def tahoe_given_add_introducer(session_browser, domain): + if not _get_introducer(session_browser, domain, 'connected'): + _add_introducer(session_browser, domain) + + +@when(parsers.parse('I remove {domain:S} as a tahoe introducer')) +def tahoe_remove_introducer(session_browser, domain): + _remove_introducer(session_browser, domain) + + +def _get_introducer(browser, domain, introducer_type): + """Return an introducer element with a given type from tahoe-lafs.""" + functional.nav_to_module(browser, 'tahoe') + css_class = '.{}-introducers .introducer-furl'.format(introducer_type) + for furl in browser.find_by_css(css_class): + if domain in furl.text: + return furl.parent + + return None + + +def _add_introducer(browser, domain): + """Add a new introducer into tahoe-lafs.""" + functional.nav_to_module(browser, 'tahoe') + + furl = 'pb://ewe4zdz6kxn7xhuvc7izj2da2gpbgeir@tcp:{}:3456/' \ + 'fko4ivfwgqvybppwar3uehkx6spaaou7'.format(domain) + browser.fill('pet_name', 'testintroducer') + browser.fill('furl', furl) + functional.submit(browser, form_class='form-add-introducer') + + +def _remove_introducer(browser, domain): + """Remove an introducer from tahoe-lafs.""" + introducer = _get_introducer(browser, domain, 'connected') + functional.submit(browser, element=introducer.find_by_css('.form-remove')) diff --git a/plinth/modules/tor/tests/test_functional.py b/plinth/modules/tor/tests/test_functional.py index bad412e97..ae159ca46 100644 --- a/plinth/modules/tor/tests/test_functional.py +++ b/plinth/modules/tor/tests/test_functional.py @@ -3,6 +3,134 @@ Functional, browser based tests for tor app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional + +_TOR_FEATURE_TO_ELEMENT = { + 'relay': 'tor-relay_enabled', + 'bridge-relay': 'tor-bridge_relay_enabled', + 'hidden-services': 'tor-hs_enabled', + 'software': 'tor-apt_transport_tor_enabled' +} scenarios('tor.feature') + + +@given(parsers.parse('tor relay is {enabled:w}')) +def tor_given_relay_enable(session_browser, enabled): + _feature_enable(session_browser, 'relay', enabled) + + +@when(parsers.parse('I {enable:w} tor relay')) +def tor_relay_enable(session_browser, enable): + _feature_enable(session_browser, 'relay', enable) + + +@then(parsers.parse('tor relay should be {enabled:w}')) +def tor_assert_relay_enabled(session_browser, enabled): + _assert_feature_enabled(session_browser, 'relay', enabled) + + +@then(parsers.parse('tor {port_name:w} port should be displayed')) +def tor_assert_port_displayed(session_browser, port_name): + assert port_name in _get_relay_ports(session_browser) + + +@given(parsers.parse('tor bridge relay is {enabled:w}')) +def tor_given_bridge_relay_enable(session_browser, enabled): + _feature_enable(session_browser, 'bridge-relay', enabled) + + +@when(parsers.parse('I {enable:w} tor bridge relay')) +def tor_bridge_relay_enable(session_browser, enable): + _feature_enable(session_browser, 'bridge-relay', enable) + + +@then(parsers.parse('tor bridge relay should be {enabled:w}')) +def tor_assert_bridge_relay_enabled(session_browser, enabled): + _assert_feature_enabled(session_browser, 'bridge-relay', enabled) + + +@given(parsers.parse('tor hidden services are {enabled:w}')) +def tor_given_hidden_services_enable(session_browser, enabled): + _feature_enable(session_browser, 'hidden-services', enabled) + + +@when(parsers.parse('I {enable:w} tor hidden services')) +def tor_hidden_services_enable(session_browser, enable): + _feature_enable(session_browser, 'hidden-services', enable) + + +@then(parsers.parse('tor hidden services should be {enabled:w}')) +def tor_assert_hidden_services_enabled(session_browser, enabled): + _assert_feature_enabled(session_browser, 'hidden-services', enabled) + + +@then(parsers.parse('tor hidden services information should be displayed')) +def tor_assert_hidden_services(session_browser): + _assert_hidden_services(session_browser) + + +@given(parsers.parse('download software packages over tor is {enabled:w}')) +def tor_given_download_software_over_tor_enable(session_browser, enabled): + _feature_enable(session_browser, 'software', enabled) + + +@when(parsers.parse('I {enable:w} download software packages over tor')) +def tor_download_software_over_tor_enable(session_browser, enable): + _feature_enable(session_browser, 'software', enable) + + +@then( + parsers.parse('download software packages over tor should be {enabled:w}')) +def tor_assert_download_software_over_tor(session_browser, enabled): + _assert_feature_enabled(session_browser, 'software', enabled) + + +def _feature_enable(browser, feature, should_enable): + """Enable/disable a Tor feature.""" + if not isinstance(should_enable, bool): + should_enable = should_enable in ('enable', 'enabled') + + element_name = _TOR_FEATURE_TO_ELEMENT[feature] + functional.nav_to_module(browser, 'tor') + checkbox_element = browser.find_by_name(element_name).first + if should_enable == checkbox_element.checked: + return + + if should_enable: + if feature == 'bridge-relay': + browser.find_by_name('tor-relay_enabled').first.check() + + checkbox_element.check() + else: + checkbox_element.uncheck() + + functional.submit(browser, form_class='form-configuration') + functional.wait_for_config_update(browser, 'tor') + + +def _assert_feature_enabled(browser, feature, enabled): + """Assert whether Tor relay is enabled or disabled.""" + if not isinstance(enabled, bool): + enabled = enabled in ('enable', 'enabled') + + element_name = _TOR_FEATURE_TO_ELEMENT[feature] + functional.nav_to_module(browser, 'tor') + assert browser.find_by_name(element_name).first.checked == enabled + + +def _get_relay_ports(browser): + """Return the list of ports shown in the relay table.""" + functional.nav_to_module(browser, 'tor') + return [ + port_name.text + for port_name in browser.find_by_css('.tor-relay-port-name') + ] + + +def _assert_hidden_services(browser): + """Assert that hidden service information is shown.""" + functional.nav_to_module(browser, 'tor') + assert browser.find_by_css('.tor-hs .tor-hs-hostname') diff --git a/plinth/modules/transmission/tests/data/sample.torrent b/plinth/modules/transmission/tests/data/sample.torrent new file mode 100644 index 0000000000000000000000000000000000000000..4c2ed6bf45c6f87d3c745764b5ca62979cd87f4c GIT binary patch literal 46608 zcmV(>K-j-zF)%t~a%Ew3Wn>^?c{4CNRB~Z%b8TsJb7^mGFETDUG$1HsIAu04Wo0xp zW+^cN0LE@^XbF)})EX=P(&AZ%rBXLM+3F*7kRH!@{5I&f)aV`XzRHZ(9WIuWRpcMWj6 zlPjtDd1Amd9pN$8c?OIt;b6t?6-F(y)C?Ni>AquxBZ?0#M&FQ$x?83S=~;f`=$J}N z7`gZqT}H58V5d}Tg}lIWE#88GrYI68KQsQ!XWyW}X^ZO3Q)?UX8V2)J@cDA=!8jKH zRlz8PYI|!LIc`*PKBUH(=H1Dmn8F3L4qWSIQ(LWl(ham7tEtex)j;6w0+go+#sB^} zHnR;l)p5$|X6x=}4uuI23&!ZI%>W_H26*mj5d~M;F`}0Vuz5DWBu#B|HZ!|9_O)la z%IqUH{u$3`luRy2l~u&T9F7g2u}>qnpn$oI2$I1RhS!#i6#%3$Fon85ohbLmT_9zuV!83V)VzVd_xcV1)c*P(UU9DyU^1Vnj?Zg);u(F?YqABd_apn4CT;Mt7xYgtyH-=3p&4&UE3SaRuvb#G*OT)1Dxwg z&&*l(F!7NXBHnaH7N1eg2)sch`-|KHh+7KqtDec9-c!P(=Ge*&@UZt-kwGezSW=BG zZ;pN~8ya9@Ki)jQYE32e{>)f|*jiAkC9-(jxaXe_dM0#0#dYxA69&T&bcI;;jGfp9 z>|wI?`aIoyxXOQ`mb$xx?Jq2@b3IL7i?$eiS~+`b4Hou^{9z&#n|-6t?Xv2|7;-J8 zRTVW`&5?IhT>f4JJFp9eRY zJM!(&SdA{sWlDI)%8ENWPXhGI5IM-nr(RD2NM5;Y_lO^Cj^eRzNXJ{5iqAyl?#yzY zH#RDEDKow0f-BKczU5c}$=eJ&f&_;!uVaHo!OHKNc@3TI#^=xB-~$$-WUt+I!(5Z@ zf`6*(twAhE2o<3!(kwk2e8r&K^N>(DwP~{T>0S!*!l*!PX5Wcfclpn6<%z0Z=@J0+ zjU$LIputIdkM+GexhJ&KTw`ri|A3N<6Ke0<%vIbVC_5w5#Uc}R;hBmMUj=dm(~pqO z7MDzUE=z<`Ia2VMb}RlM9aty~2Imi?`ep!@p%%d%{G=NEA;Yg&?B5f)qo9cTJ{qOx zpvvdM**cd24P5G2+(L`?8tc<%fkObZMaez3qAly~#SJ1Wq3 zoL!KQ@|d7rX@|&82+kW*C&S2MtLm+Bz}ss%^U}fopRNQa4W`=$gWPr(D@ND~Z0i8+ zBA%qvbTys%wCLq?zI6(Bd*ZmWePsM-LkKl}HIOicAm|&4Q6(2VK5YLwnP%)WI8ERj zQP}eJTYq@JQlOLa0u_Uc>tG08cb%-k$C)0cuBaAQ0#JL%+kfi|T!hFr45YW;Eu38h zt7?{9ZUl|+gg%*lubDB>g^rmL;ND06UB*XUftdL9z1VgLSG|Qd>5L{_X{MlXbDw$H znYiQxPz~N>)Z1xT5}(E4Kd6)-exfKSnT-e8|Jq6L|Ef*5;OU=wsgxrKA;mM2OxC@h zXWLDJyD7Jf9li;A0GdeKv~gtu<j@H3zc(ekYViHJFLCeiv-*z3Z?j(L^8!)(071ckJGCkw6A!#^#xh zH()gHV56ORYSSy!Ofb~u`@o;e7V#=_=2ku+*)TLsfz7fGDjzw*792~@4BHi|()yAq zNr6IeV-l=ky;xsBh|$78Nnr?g=9|8%*Cr4vL=fg@V$7q5bu3uOxR)D~xN0USyS}J} z6I_Spx!b01jtE3mF0ZUF=~M^~Lt(<*C?`@a9wV9_Bey!#R}=n2lY*a!9FN|p>xW$C z2xq>x{+7WXgXg&2$I|22xhqNbZS#b*~T*~(TY-TmC_jsD6+XSz~?C*Im`AhbY zxOnNY)^J=Y>ur9B$z9Q)iAx!x4-HgEyO@*PO4HVx@?Xpsyc!SkcJ6wm$5B=OGL)nZ z4vo-s(x;D|AL)ml(~@6sT+nf`5s>BOZ0l!_$Um);>Zl%aS{BSRyu?cDsBpoLEW}SC zOB&6dQ0t_Ct@~)_q7{Dl?_)<%rtVTNgbyUGEG1g(R#IfIFn$Y-AdpWfFl_M%gu4=t zUj??)J&xge%p`>3{VNX3j*RzXG5!h&|F5O+tmdwp<$C!AeP|b!xi)3;Pfh|QcUfvu z@jBZA`oe54Z36PaZtq5M@IkU%oTE8*2ZDneqh?hF>DP0EB2-1h$hNG91x)D(BC+V# z5c4hh)F`fTYl_T~x!eAK1 zVhcp)?|?=BL;HvYMih&lAKa5vc&g|b)rm*!f(HDPB=Js_RT3m*{z$WWV%U)e^;m3g zWEF^UMh`E1LD``idX8#nF4iPOG(tnBZko0UxX(V%7Bq7fQt%J(?M*i|$cW0@P@sk3 zPVw>7mgeMw+Q52YA#GpZ?SZ?Rhxs2fdAF(fzXOrsjFL7Bufi7hbko&mv6Ly9^nEm9*!lX{TL{&qBdR>A~jX&A#c zH?8YxA~1WX@dMg#^CJ<-h1DPp2!6Hc@%@9>xd*=r75k_cxjDn6mF z8$5xczqjG?PkwQ?f$nQ5cb()NWo6MhB||d zoyIPNzD8yj?Xc4tDwE%+pP#KsED3bv7)Dw2Mx){(9ms080$?So3kcuXW^b;awk5O@ zcJQ}xEne0)YL8k>wyV0*Es$XO>aPX_M3CFy-*BT{mo{K)#Y3v`HZL-qsWKp& zd-nl)`4Zc4+>Sj{ptB~>?pn?w!XMrYtA|oQkU5prY?*^mUx^k35Kj@hUgDGU;e2Tk z<++XZeU)5h2Q02p_k>ABNYsHk?-0Lz;XscCT^yW zM$YUP^QE=U7EzHGiXm_92P9m-sl?{TaVZUM2Xea@reqwrX6$ESM9izH>Hu55C|Lfv zCW_F4!ERbI%&yLXltyMVAP0$0k3ABlReEaU_$R4yAI$O?{uPXvroh+^C+?Ab z^Jc2}&tps#EiX`Jz-gGuc#IV(D<-4jvdOcYTeZ3OdaLmvbA;waH6UK;nXN zTkl4Y65}@$+;wOT)|We(7;H(G4A{o9zWkd1re0(s8ifWVT)b_A5ChGc~w7HO<^OUa?nQyY~9yMx)Mu3PnTAz87PX250he&c#j z1u7oSuVx)VJBlpXR9;`=4{6On_ir&_2d(~#F#Bwwzj6&Mu8USaJ3^HKd)D{EIV>y4 zZ?kal^&D2kM3g8Rm3*|^kwK3`ADaecdR~j0ANF(-1g6cq{OzU4|oGrL&F`7}>L>A3b@Tni=mp&5tep95l z$`1Kl5!pB&kW}L?q>sur`BG+~9B7$enWivIj~w`Izfp(@Iz=_AEDKUaC<3x6r)A@g z3P%x0p}5!wk4V40O-~zKOJjRp=LLi6*lqsUWm2bb=>q#GV0GnwGu>n^DvM;1=oii5 zmTJ|623MoaK%6fG zI@|1Og2yq*T~6iJW|fI^Zb=|kxb#&(PTI35c9eFD##Deewf$wEXGOE3Bu--IhduCC z#`m~sJ-n3J2#Y~}y;vPQ4(E;3e$_8=Ufj2^o>4%hLb+M&DNYzL>9fUACrX|`GLcsF zl~1fHA{Ade3#IZmknet zNmYztk0n?A!`Zed9z^Tg5%(<1k*dz>OZUC_(#!;YNjR!h50tT(iWa{a;yg3tZAo{; z6K}l>d$}}X>s>!k&_!I@zYja}2dj40K(WFnTFB)k#i;X}<>6t?{1fu)Sr*_FGWAz3 zalP>q`C!z)V6o);32blF$DwumS+v?s4?Y1t9pzNcdF;k%P0LaQ(K;zoMCDqDFf`Eb zEO*T4jW&61bjTa!<%_XK3opwIHn2m3J>B9{9;<&DQ6d93&pWd?p5uIYef3_AD$4tm z0~YWNAE;DMJ*`2tXmNk2-edN$h8Q+;*ZuPiuap5B%oUKgug~0HCH%eB{Io;B%x~s9$MQ`F+%~ zs|$OoEUoK90D-=JlP63><(6R-(}@&X-2R<+S|o`!PQFP-)-XhR=OI zAAwwKwunc8SPrh57*X%HX6(MoOL)6SR2yR-D`#CPj|DtI<~D-y=|pwF;>ivb61sIf z^4`bu9JH{J6gMw@$5E2}bd{5LjjH6S-vm**euG(hg(=EPF*#bKfYMAMc3v;pJLF{L z&;W1%_9oX=iT#TpfBkCr_n!nM3Fk-gcKq$BO<)eKM@AL95CI_+8u3V%&o3a?zMq~7 zL~p(~>YI|;E_Atc=-D8p9daYM5LsT5Bfs-ex7Pv!$;p%RCOuxOp{LJ`so}L zE#zTJJz-?SLNt;H`{Q42Zv^C*FawW%{DAJ9&v|;IJb63IegME43@s+2Wt;Y`rg@a* zpe-3J<#(%!zplmyPdw|{ipyPMK%`}pfj$CQ$9;1OJD~1#mt~Cv%?899kepBpNzqrJ zP-};JosTEkNzM*0&dV@>QeWdS{kwDxeqwYE=vaU?ODp5h_I}S!%02ssCgI;Cy*_mJ zF1+bTfLL+K!>tI4^#=hwSxKV;US5TS*YRw8nPg)Tvt9+0MyXA?j1-l@@smLaV4tL* zWxOX(n^4)_NR84`x>3~}+@d|}q>M#fw6u4T1Jsi2Fx00c-RZ142L`__*YZg>`)l_N zm}hC4|IIzCryt-A>$DDU8LjRgbP5Ens<@Y}_)eN`QO2PfdexWU5#!p&xG5M3A#Fp| ze#aP?HSxEFm~l4#)=*~OR|W2iZ3&(ABa-${w_vo4m$f^Fk1^=o=>tiCqAdHfz#Y6r zEXw@Yl!KXOk=>#ckZfD^di2cyJK^XUscZrSl8H&wRrJrbDLy;E8=q5h-FmVobu`Ks zhCKF-+L8hxETZS6B%N!N<0RCJ6k};_&&UwpuqS)nE@okO44~q!Ty#)Q!BeVrDU}La zrS(2=p+0k5Kqr5wandhee2Vl<#d zPx?~&v*4}fEpgg3KgGZbpJVmKTy(^I<*Tka0DoB+;oIDMjqjb_Y}>(UWW{ImQNQg! zs;Li_57LFqOO>w^6;X6t=Xz&EV;=GJMm#s$V%f9OfXzBP$41-#xGk?K6dseZZy(O> z|6-7Bh^Od(wpES;A^FGJ(5Qu{G}{t{w=g=UGgAw`TUwbxXM{LKbG2nTv!okT0s#Q- zg_G8QwzaX;ZGIovM(tv-eijjjs=^xz^AhsCwSRPwDVPKm#_TM4*8?^zIP}eV@IF0& zwL^_>qQo=?Hwe5aU7v4hl5iDWVFV`vI8h@t7i4Q{?}m5FuF2HLp(o zQfNqVh2t^F#8(87P%KJWPe-OCOUjTe&*JRf&+J4@?n~B1vKb{2 zJRig<9G~O0g;;fFp9Zxa-B3OVi?SI)3me+VT)=4*_SN7VGLU z%0_t#S;4EGPk`$k1@^aWLPO6!H~$|>1^r}>&?5yjAwK>r%`q% z3Xq%sHF|kcYmH5K_wbb8%?=hDoxW|giB)Duuwt{}jR;1*gRae8;GD`KrQh3R;U<~2 zPwp+^2MQfR1vUA$qhf`O+MX2l?JTMYkaer_FWbNt*lzqKLTRVGN*tIZpr2kH;@GR` zMueE+4x^8sE(-0)iVo(K3IE8%^qpB)_&P}XhyJMz6>QL<>5If9nl-^A(?Uj6G?my<>GMPM5}+>XQ=Vv($pI{oftZCK;GqhP+&PxN}ej;+84X8C4+v1cY- zsRk6{zjCh*PK=p)(hD|)f(hDhC>b{Mlo@j*93YZ#7f*N{OBH(Eo2u9~C42gKZ&t~@ zM(zjL!4t(=#)Ix+x u{&6W@2Vxy5?r)B|thECY)34+;^26|c$?Mm(08^cl6bDK- z(C0vz61wuVVnqbs9~c@AWi6pg&e}+y>!iL1dpoxG>FuZEz-I+`s~4=}faIX$fj55_ z4Xf{RuiUa8fDN-I5R`z%9NUUK zStP;2e#gCkI;*2t5!9M)&87XT3l7`s*%f`)Edkh3D~L!)GQv2l!NN#c-~EDq!B5FG zH3tVVy2))!6pSdP3xP_HQX5~GIVrVs3_f@1p1^9ei{FnoMSLDQ#26y5z%p^~I`5hZ zPTB!8A_ntpmDAmpA(JV*w#X?XlWQ}jVds3rT*jg8EEPL}5PFH+>{~3}qPDHF7g)Vs z#DFgooHRPxlnx*14gy172WzNeo*N{rwq-Sdj&n3v7G?kHKvp4Z z!qJ)=l2obPb$MC_LA_o|&CEC2JnuSM6iB>l5x2*0ri{6hdZqxxY$RKzFOBqEozlY<=hOw0`Jw7V=}*gk zF{AMm6Y213w0=K4#{t}-=pW0U9THHY1CHx<>~zrS0|@n-YQKZG;SHcTdZI<63QEM5 z1k%(#2cI3BCR)b@!&}j*xcEZH$^V;c1UIP8oPzBPVV%U$6R|~nU1zn2j=kJxRz#S+ zZtU7^K9h-Y7&@BNXR=kLI+@Jbw>HC&h18$o?CV}yxc^*GtmK@^W=GX0er|<*@$Zw2~tb!cvmb zygFy8v%h$8F8}*2=9+r`1GwYGrxM!Pa0)Nz**@VpA~30;RW*ifY4o(hIB4BjOBS;L}R{)0{ed@N`y6r z!_Ksi(ByR@GDGr$%rANy(hfU1-+)Z~9$=T137*X{L=4cgIgO=f;$APdht?Q7<{aEc zTqe|291>Pq6W(^Gto<+32t}^$R2NSQSke(2rM92yLDUNnBJ@gRgh>_-4SsSRJpWzs zls%FZsv_}4d{qfY+Vz@Z)Rhr^==Q%_i&0R5Zw=>$+d|c*pm+bbW;jo&ZEV#YiIN~ zb_Eh0ZPddrwR>^o=gMgIs4>sFC+9^(mla{s?Pm>Ul%u@|JYp?bJW+S^q%xybqf79(IK=2{k+CHpi37-3#i#`ROC<{=ao5KInkH z`(nsGqgOK_{W(0*(G`)p)aZh(!H{@Mq#sDW0RZ4PK|Kju>n;Bu8bi zzNYNfI<8%qo<$epqYUIX$YDz3bk2hT;2l_U5hSJq+4S|cSRfgW{v#9cV zrm^Asd5SUj%7+ACXsa`ZF9HSbEn%oQ!$bFeMK1>P)Ke;k7y*e1wGKrO^IIhi_a8c| zoRHDlVQqk~>hZFb%2!7gTu)*$DM;*`{_7fYhXyrH$_WutzLkR(7-MJ~mbIw`-`Pnx zQB=MVy>DrKZp^T2p(iXLXpKBMvx*Ynu*Y>375A5c0=dFCWhU!wy2o%vo%AIwJ<-h@ zUcg)YugBDpHt4iUGJcV=fbU=t9W~%sq+1KxgUsKag&G*AR|J>Ab()E}1FbCr(_|EG zGc&}SCmLpJ#9MB1AyMaC5cRg@8$HJD>gxnezk$L!p}E)8a`*Is3LHL&GyGM zs({BEVRj_f@&r`@B)4cC8F9Dn6(&0W&1+S3O_OS*V8FC@#@b;!iluFdJyL`1(ai;& z%={HCC`gVVpg_!Zu6I*r>X_;WN++SuA#+L(GLQcL)+ee4@h&J6^3bic{deVjqt$(^obX6@` z`F+9j-k2wkqn<(;OE~KujrQxYZxt%oZwiIulAL3-Utw64zWQ(=HKSQ1h9^+OcSEB%X=b+^F zogM7+xh?;Gu0%YiZ{!^4%0BGqc_t0c8gVFmI^W`=;x849V$d|98dtjqWQdD29nj>e z8;|UuN;O{BzX2J>Vn}!Kxr|aJQ8-+KTZmxBmwNEn&fCv!Iq|#mSLzy%>#O1(B$0hz zRY5GV5}l}7aLy(Jyl%~^3;S9pc${C*S%R;=9YSqMx#q(v_`1Z`^MylkY(CR{?REWV zvarY>uRC*>YJ<~!=?#_coW1(@%GBX?{x+CESjrLnQM1zJwnZifl0nX`!4~Db1H+1} z2YHN_*@Ma_qlHQCj5?nv<*pcmx}hZ#n-Z!i>5NUXxK zBSb1D7^^V2AHNd7PX~7BaO7zAiXC8oWFH?%u&oS697xv|MUTgVaMa@;3PjVTL1-ee zhf-<(IHb_)M_?O+r(+=-@`p&PyKgMZN2p+(I^!{Ba2%f=V!*?W1iC=aJMh!0mOLKI zOxlj-A*|m>n72~TD?M%!_$BY+3l*0C>8G;j^zpUepQ%Ey3{{wT0AO8z$yN!e0zpUM z|DqiOX$Aow!T*Url}2Sq7Gb-3{zO;m+%AO~iHfu2dZwRr#!Bc{^rs=RyvircQ?ui( z@IAk~mV`qnIQy`2e0*#+jJ$c5L~u>&4_9G6ELDR^q03hKlI~BnFe@bs6&M@|@&?@8 zL}dS$pZi&8_yp4?__=R(ZYc_KL?OE4L=ZO=u1DUX@U_&gdcI+d_H9g}3H;7gaz7$GSsExyn5RV%Au;!xyDl12#vx0nJdU-b7g& z%c~n1W(5AlD*yB-+L07j$%pjHAWcdl!s~X-yqOtzz35-GAO*Zn?Z;;UFCH{*|J9rP z_lMEYZ$7P4Tl?)C1)vDS3dR}$lQf#(w0_| zD3T?hb|eaavjZ%=b0al(tF@? z+^c%VfSfDNaSm^(rCOSGl|GO9JqAniv!_vB2;k%DMkO{v&U8@6LF~5+w7aZdaQFcn z|NS##&(heaJkqO`YL0HurYtOFAov=lkT5zajPb5!t?qdak3*x^s-m>Gi_>8nEXfhJ zC*gysyU=1R7=Kynf|k#E>*bO6$?_^KLuWQJe(SuQ#3%L{AAT@otmB<(d&IphX`H5g0cgtR1vMm&Ezm8@+qOd?6{R&jg;=OhwM`F@aqy*T8Qy zU#d6s^y<~wo0(;yeLqr6pO=xRxCzh4YvHjSaTE|k6vU@F6N-34UX(zNWJJaGw32Ge zr+*2IhZQc?`Js6OY|SEmekmZ7h!epGciUT{Sna{tP^C!!HgYeQNS+OUDgyZnOk-I1 z*;)tUJHMyUKKLqZQ0ykBY+o3uC2cspDNJsM>@0F(jG5jSoEvZ%KS|3Q@%n8Tl3Cn> zDYxCx=F?}2qvyb$zy%y(%XwOWxnD%NEa86x{Ra@8n5X&%c+6g?1U$0W+ezx+>#`af zH<1dBP9AE@5M<=2vjKp^*cC>JBb+=>D0)HJ@zDoi`HHA;eW5a8yqj#JU@@QV);Xut z1dsUNkwh~En0mMDMDJgn9{YBpOJJ&MqTtB3;9>GdgM6i4DjNxj3-+`F5q8cbE4!ix|lyA76MhtQAhxI9Y{BW`EN` zmiGWD5>=8FXyZ0MF1f+ONKtWmqI1PIX7>Q-m~$?HhJpaE$3EkQq&!Y%d4j{_X?Mg2)}v*IDK|GJX1}uv6GaaW8eQx)!hYv zna+bgeQP>-BOfJ7kqiw9N@MfTe_FJ=nJ=&g>0-=FgrKQ?kfY%$2 z%wBdTeqUYJHKv40=tYx0U^FK`K68w+oOo{5d%tGtF5;#Bi@jvv0u`B~?xM{BAZ7hbd@7Y=*925qt0%FW6&q|)6rln!zX2;}`j8|REYrDywmc==UL2@ zocSzmQ@wP2O=ljJ6!G&=7 z_R$SRV6B?m?I5gl?!N;DA_?fZFGi8a&UN7VM4 zF9$jE_xMD|E~n^2b@5DO-KlcODT0H^*hFnDgs_$qp=jLuprxQjgdnX|XVSD26O2ip zE=h>|FJ5TjRyrcymhm7@M+vfZ(tsvjFMA@FB(Yb~8az5mrie-V7w4vPpmNXY*>yyp zs{SrP%wQLCKIjQv!WWzL&&r*%0vF;*4I#B8iWdKM*A_i%5C3IIt2OAVp^`*ZbEEAg zj-e42YHo|ipWn}v4BgYvBvBUp0uTd*SyEwk8ciM*9pmI{5{?BjCo5MU(DS`o;4V4( z*PAdnSO{!!V2$42gWLig*UnjS&bk25kg^5+lLVMU8Eh}z%m`3p zrt5DLDfo(u!9XJ#UyrtpvG*K1rCXmS!vVZLBDK8n#1F%F=lCK^{fI2#behVl2`MG= zYWJi3*%U-OZp{xP1zD=D9iP`BQfFqFi$69E-xw)KeWXLK=_Vi9-DS~par8min5|ql z9FWu^)4=f>=x{T`+XvJzrc=3M3hd_`C9~g3Y;8iD9e)2cb=C6=>SU(P@ z%h6no?-

8Vx1>P?R*T7 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 literal 0 HcmV?d00001 diff --git a/plinth/modules/transmission/tests/test_functional.py b/plinth/modules/transmission/tests/test_functional.py index 1ece1c1b3..ae7236b2e 100644 --- a/plinth/modules/transmission/tests/test_functional.py +++ b/plinth/modules/transmission/tests/test_functional.py @@ -3,6 +3,67 @@ Functional, browser based tests for transmission app. """ -from pytest_bdd import scenarios +import os + +from pytest_bdd import parsers, scenarios, then, when + +from plinth.tests import functional scenarios('transmission.feature') + + +@when('all torrents are removed from transmission') +def transmission_remove_all_torrents(session_browser): + _remove_all_torrents(session_browser) + + +@when('I upload a sample torrent to transmission') +def transmission_upload_sample_torrent(session_browser): + _upload_sample_torrent(session_browser) + + +@then( + parsers.parse( + 'there should be {torrents_number:d} torrents listed in transmission')) +def transmission_assert_number_of_torrents(session_browser, torrents_number): + assert torrents_number == _get_number_of_torrents(session_browser) + + +def _remove_all_torrents(browser): + """Remove all torrents from transmission.""" + functional.visit(browser, '/transmission') + while True: + torrents = browser.find_by_css('#torrent_list .torrent') + if not torrents: + break + + torrents.first.click() + functional.eventually(browser.is_element_not_present_by_css, + args=['#toolbar-remove.disabled']) + browser.click_link_by_id('toolbar-remove') + functional.eventually( + browser.is_element_not_present_by_css, + args=['#dialog-container[style="display: none;"]']) + browser.click_link_by_id('dialog_confirm_button') + functional.eventually(browser.is_element_present_by_css, + args=['#toolbar-remove.disabled']) + + +def _upload_sample_torrent(browser): + """Upload a sample torrent into transmission.""" + functional.visit(browser, '/transmission') + file_path = os.path.join(os.path.dirname(__file__), 'data', + 'sample.torrent') + browser.click_link_by_id('toolbar-open') + functional.eventually(browser.is_element_not_present_by_css, + args=['#upload-container[style="display: none;"]']) + browser.attach_file('torrent_files[]', [file_path]) + browser.click_link_by_id('upload_confirm_button') + functional.eventually(browser.is_element_present_by_css, + args=['#torrent_list .torrent']) + + +def _get_number_of_torrents(browser): + """Return the number torrents currently in transmission.""" + functional.visit(browser, '/transmission') + return len(browser.find_by_css('#torrent_list .torrent')) diff --git a/plinth/modules/ttrss/tests/test_functional.py b/plinth/modules/ttrss/tests/test_functional.py index a94acba7b..ef44d5598 100644 --- a/plinth/modules/ttrss/tests/test_functional.py +++ b/plinth/modules/ttrss/tests/test_functional.py @@ -3,6 +3,73 @@ Functional, browser based tests for ttrss app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, scenarios, then, when + +from plinth.tests import functional scenarios('ttrss.feature') + + +@given('I subscribe to a feed in ttrss') +def ttrss_subscribe(session_browser): + _subscribe(session_browser) + + +@when('I unsubscribe from the feed in ttrss') +def ttrss_unsubscribe(session_browser): + _unsubscribe(session_browser) + + +@then('I should be subscribed to the feed in ttrss') +def ttrss_assert_subscribed(session_browser): + assert _is_subscribed(session_browser) + + +def _ttrss_load_main_interface(browser): + """Load the TT-RSS interface.""" + functional.access_url(browser, 'ttrss') + overlay = browser.find_by_id('overlay') + functional.eventually(lambda: not overlay.visible) + + +def _is_feed_shown(browser, invert=False): + return browser.is_text_present('Planet Debian') != invert + + +def _subscribe(browser): + """Subscribe to a feed in TT-RSS.""" + _ttrss_load_main_interface(browser) + browser.find_by_text('Actions...').click() + browser.find_by_text('Subscribe to feed...').click() + browser.find_by_id('feedDlg_feedUrl').fill( + 'https://planet.debian.org/atom.xml') + browser.find_by_text('Subscribe').click() + if browser.is_text_present('You are already subscribed to this feed.'): + browser.find_by_text('Cancel').click() + + expand = browser.find_by_css('span.dijitTreeExpandoClosed') + if expand: + expand.first.click() + + assert functional.eventually(_is_feed_shown, [browser]) + + +def _unsubscribe(browser): + """Unsubscribe from a feed in TT-RSS.""" + _ttrss_load_main_interface(browser) + expand = browser.find_by_css('span.dijitTreeExpandoClosed') + if expand: + expand.first.click() + + browser.find_by_text('Planet Debian').click() + browser.execute_script("quickMenuGo('qmcRemoveFeed')") + prompt = browser.get_alert() + prompt.accept() + + assert functional.eventually(_is_feed_shown, [browser, True]) + + +def _is_subscribed(browser): + """Return whether subscribed to a feed in TT-RSS.""" + _ttrss_load_main_interface(browser) + return browser.is_text_present('Planet Debian') diff --git a/plinth/modules/upgrades/tests/test_functional.py b/plinth/modules/upgrades/tests/test_functional.py index 272599b14..48e2c60fd 100644 --- a/plinth/modules/upgrades/tests/test_functional.py +++ b/plinth/modules/upgrades/tests/test_functional.py @@ -3,6 +3,47 @@ Functional, browser based tests for upgrades app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('upgrades.feature') + + +@given(parsers.parse('automatic upgrades are {enabled:w}')) +def upgrades_given_enable_automatic(session_browser, enabled): + should_enable = (enabled == 'enabled') + _enable_automatic(session_browser, should_enable) + + +@when(parsers.parse('I {enable:w} automatic upgrades')) +def upgrades_enable_automatic(session_browser, enable): + should_enable = (enable == 'enable') + _enable_automatic(session_browser, should_enable) + + +@then(parsers.parse('automatic upgrades should be {enabled:w}')) +def upgrades_assert_automatic(session_browser, enabled): + should_be_enabled = (enabled == 'enabled') + assert _get_automatic(session_browser) == should_be_enabled + + +def _enable_automatic(browser, should_enable): + """Enable/disable automatic software upgrades.""" + functional.nav_to_module(browser, 'upgrades') + checkbox_element = browser.find_by_name('auto_upgrades_enabled').first + if should_enable == checkbox_element.checked: + return + + if should_enable: + checkbox_element.check() + else: + checkbox_element.uncheck() + + functional.submit(browser) + + +def _get_automatic(browser): + """Return whether automatic software upgrades is enabled.""" + functional.nav_to_module(browser, 'upgrades') + return browser.find_by_name('auto_upgrades_enabled').first.checked diff --git a/plinth/modules/users/tests/test_functional.py b/plinth/modules/users/tests/test_functional.py index 92b26c540..02cfd78dc 100644 --- a/plinth/modules/users/tests/test_functional.py +++ b/plinth/modules/users/tests/test_functional.py @@ -3,6 +3,140 @@ Functional, browser based tests for users app. """ -from pytest_bdd import scenarios +from pytest_bdd import given, parsers, scenarios, then, when + +from plinth.tests import functional scenarios('users.feature') + +_language_codes = { + 'Deutsch': 'de', + 'Nederlands': 'nl', + 'Português': 'pt', + 'Türkçe': 'tr', + 'dansk': 'da', + 'español': 'es', + 'français': 'fr', + 'norsk (bokmål)': 'nb', + 'polski': 'pl', + 'svenska': 'sv', + 'Русский': 'ru', + 'తెలుగు': 'te', + '简体中文': 'zh-hans' +} + +_config_page_title_language_map = { + 'da': 'Generel Konfiguration', + 'de': 'Allgemeine Konfiguration', + 'es': 'Configuración general', + 'fr': 'Configuration générale', + 'nb': 'Generelt oppsett', + 'nl': 'Algemene Instellingen', + 'pl': 'Ustawienia główne', + 'pt': 'Configuração Geral', + 'ru': 'Общие настройки', + 'sv': 'Allmän Konfiguration', + 'te': 'సాధారణ ఆకృతీకరణ', + 'tr': 'Genel Yapılandırma', + 'zh-hans': '常规配置', +} + + +@given(parsers.parse("the user {name:w} doesn't exist")) +def new_user_does_not_exist(session_browser, name): + _delete_user(session_browser, name) + + +@given(parsers.parse('the user {name:w} exists')) +def test_user_exists(session_browser, name): + functional.nav_to_module(session_browser, 'users') + user_link = session_browser.find_link_by_href('/plinth/sys/users/' + name + + '/edit/') + if not user_link: + create_user(session_browser, name, 'secret123') + + +@when( + parsers.parse('I create a user named {name:w} with password {password:w}')) +def create_user(session_browser, name, password): + _create_user(session_browser, name, password) + + +@when(parsers.parse('I rename the user {old_name:w} to {new_name:w}')) +def rename_user(session_browser, old_name, new_name): + _rename_user(session_browser, old_name, new_name) + + +@when(parsers.parse('I delete the user {name:w}')) +def delete_user(session_browser, name): + _delete_user(session_browser, name) + + +@then(parsers.parse('{name:w} should be listed as a user')) +def new_user_is_listed(session_browser, name): + assert _is_user(session_browser, name) + + +@then(parsers.parse('{name:w} should not be listed as a user')) +def new_user_is_not_listed(session_browser, name): + assert not _is_user(session_browser, name) + + +@when('I change the language to ') +def change_language(session_browser, language): + _set_language(session_browser, _language_codes[language]) + + +@then('Plinth language should be ') +def plinth_language_should_be(session_browser, language): + assert _check_language(session_browser, _language_codes[language]) + + +def _create_user(browser, name, password): + functional.nav_to_module(browser, 'users') + with functional.wait_for_page_update(browser): + browser.find_link_by_href('/plinth/sys/users/create/').first.click() + browser.find_by_id('id_username').fill(name) + browser.find_by_id('id_password1').fill(password) + browser.find_by_id('id_password2').fill(password) + functional.submit(browser) + + +def _rename_user(browser, old_name, new_name): + functional.nav_to_module(browser, 'users') + with functional.wait_for_page_update(browser): + browser.find_link_by_href('/plinth/sys/users/' + old_name + + '/edit/').first.click() + browser.find_by_id('id_username').fill(new_name) + functional.submit(browser) + + +def _delete_user(browser, name): + functional.nav_to_module(browser, 'users') + delete_link = browser.find_link_by_href('/plinth/sys/users/' + name + + '/delete/') + if delete_link: + with functional.wait_for_page_update(browser): + delete_link.first.click() + functional.submit(browser) + + +def _is_user(browser, name): + functional.nav_to_module(browser, 'users') + edit_link = browser.find_link_by_href('/plinth/sys/users/' + name + + '/edit/') + return bool(edit_link) + + +def _set_language(browser, language_code): + username = functional.config['DEFAULT']['username'] + functional.visit(browser, '/plinth/sys/users/{}/edit/'.format(username)) + browser.find_by_xpath('//select[@id="id_language"]//option[@value="' + + language_code + '"]').first.click() + functional.submit(browser) + + +def _check_language(browser, language_code): + functional.nav_to_module(browser, 'config') + return browser.find_by_css('.app-titles').first.find_by_tag( + 'h2').first.value == _config_page_title_language_map[language_code] diff --git a/plinth/modules/users/tests/users.feature b/plinth/modules/users/tests/users.feature index 52ce217f0..fcebebd10 100644 --- a/plinth/modules/users/tests/users.feature +++ b/plinth/modules/users/tests/users.feature @@ -8,7 +8,7 @@ # TODO Scenario: Make user active # TODO Scenario: Change user password -@system @essential @users_groups +@system @essential @users Feature: Users and Groups Manage users and groups. diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index e69de29bb..2f757e2f5 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -0,0 +1,448 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Utilities for functional testing. +""" + +import configparser +import logging +import os +import pathlib +import tempfile +import time +from contextlib import contextmanager + +import requests +from selenium.common.exceptions import StaleElementReferenceException +from selenium.webdriver.support.ui import WebDriverWait + +config = configparser.ConfigParser() +config.read(pathlib.Path(__file__).with_name('config.ini')) + +config['DEFAULT']['url'] = os.environ.get('FREEDOMBOX_URL', + config['DEFAULT']['url']) +config['DEFAULT']['samba_port'] = os.environ.get( + 'FREEDOMBOX_SAMBA_PORT', config['DEFAULT']['samba_port']) + +logger = logging.getLogger(__name__) + +base_url = config['DEFAULT']['url'] + +_app_checkbox_id = { + 'tor': 'id_tor-enabled', + 'openvpn': 'id_openvpn-enabled', +} + +_apps_with_loaders = ['tor'] + +# unlisted sites just use '/' + site_name as url +_site_url = { + 'wiki': '/ikiwiki', + 'jsxc': '/plinth/apps/jsxc/jsxc/', + 'cockpit': '/_cockpit/', + 'syncthing': '/syncthing/', +} + +_sys_modules = [ + 'avahi', 'backups', 'bind', 'cockpit', 'config', 'datetime', 'diagnostics', + 'dynamicdns', 'firewall', 'letsencrypt', 'monkeysphere', 'names', + 'networks', 'pagekite', 'performance', 'power', 'security', 'snapshot', + 'ssh', 'storage', 'upgrades', 'users' +] + + +###################### +# Browser Extensions # +###################### +def visit(browser, path): + """Visit a path assuming the base URL as configured.""" + browser.visit(config['DEFAULT']['url'] + path) + + +def eventually(function, args=[], timeout=30): + """Execute a function returning a boolean expression till it returns + True or a timeout is reached""" + end_time = time.time() + timeout + current_time = time.time() + while current_time < end_time: + if function(*args): + return True + + time.sleep(0.1) + current_time = time.time() + + return False + + +class _PageLoaded(): + """ + Wait until a page (re)loaded. + + - element: Wait until this element gets stale + - expected_url (optional): Wait for the URL to become . + This can be necessary to wait for a redirect to finish. + """ + + def __init__(self, element, expected_url=None): + self.element = element + self.expected_url = expected_url + + def __call__(self, driver): + is_stale = False + try: + self.element.has_class('whatever_class') + except StaleElementReferenceException: + if self.expected_url is None: + is_stale = True + else: + if driver.url.endswith(self.expected_url): + is_stale = True + return is_stale + + +@contextmanager +def wait_for_page_update(browser, timeout=300, expected_url=None): + page_body = browser.find_by_tag('body').first + yield + WebDriverWait(browser, timeout).until(_PageLoaded(page_body, expected_url)) + + +def _get_site_url(site_name): + if site_name.startswith('share'): + site_name = site_name.replace('_', '/') + url = '/' + site_name + url = _site_url.get(site_name, url) + return url + + +def access_url(browser, site_name): + browser.visit(config['DEFAULT']['url'] + _get_site_url(site_name)) + + +def is_available(browser, site_name): + url_to_visit = config['DEFAULT']['url'] + _get_site_url(site_name) + browser.visit(url_to_visit) + time.sleep(3) + browser.reload() + not_404 = '404' not in browser.title + # The site might have a default path after the sitename, + # e.g /mediawiki/Main_Page + no_redirect = browser.url.startswith(url_to_visit.strip('/')) + return not_404 and no_redirect + + +def download_file(browser, url): + """Return file contents after downloading a URL.""" + cookies = browser.cookies.all() + response = requests.get(url, cookies=cookies, verify=False) + if response.status_code != 200: + raise Exception('URL download failed') + + return response.content + + +def download_file_outside_browser(url): + """Download a file to disk given a URL.""" + with tempfile.NamedTemporaryFile(delete=False) as temp_file: + logging.captureWarnings(True) + request = requests.get(url, verify=False) + logging.captureWarnings(False) + temp_file.write(request.content) + + return temp_file.name + + +########################### +# Form handling utilities # +########################### +def submit(browser, element=None, form_class=None, expected_url=None): + with wait_for_page_update(browser, expected_url=expected_url): + if element: + element.click() + elif form_class: + browser.find_by_css( + '.{} input[type=submit]'.format(form_class)).click() + else: + browser.find_by_css('input[type=submit]').click() + + +def change_checkbox_status(browser, app_name, checkbox_id, + change_status_to='enabled'): + """Change checkbox status.""" + checkbox = browser.find_by_id(checkbox_id) + if change_status_to == 'enabled': + checkbox.check() + else: + checkbox.uncheck() + + submit(browser, form_class='form-configuration') + + if app_name in _apps_with_loaders: + wait_for_config_update(browser, app_name) + + +def wait_for_config_update(browser, app_name): + while browser.is_element_present_by_css('.running-status.loading'): + time.sleep(0.1) + + +############################ +# Login handling utilities # +############################ +def is_login_prompt(browser): + return all( + [browser.find_by_id('id_username'), + browser.find_by_id('id_password')]) + + +def _create_admin_account(browser, username, password): + browser.find_by_id('id_username').fill(username) + browser.find_by_id('id_password1').fill(password) + browser.find_by_id('id_password2').fill(password) + submit(browser) + + +def login(browser, url, username, password): + + # XXX: Find a way to remove the hardcoded jsxc URL + if '/plinth/' not in browser.url or '/jsxc/jsxc' in browser.url: + browser.visit(url) + + apps_link = browser.find_link_by_href('/plinth/apps/') + if len(apps_link): + return + + login_button = browser.find_link_by_href('/plinth/accounts/login/') + if login_button: + login_button.first.click() + if login_button: + browser.fill('username', username) + browser.fill('password', password) + submit(browser) + else: + browser.visit(base_url + '/plinth/firstboot/welcome') + submit(browser) # click the "Start Setup" button + _create_admin_account(browser, username, password) + if '/network-topology-first-boot' in browser.url: + submit(browser, element=browser.find_by_name('skip')[0]) + + if '/internet-connection-type' in browser.url: + submit(browser, element=browser.find_by_name('skip')[0]) + + +################# +# App utilities # +################# +def nav_to_module(browser, module): + sys_or_apps = 'sys' if module in _sys_modules else 'apps' + required_url = base_url + f'/plinth/{sys_or_apps}/{module}/' + if browser.url != required_url: + browser.visit(required_url) + + +def app_select_domain_name(browser, app_name, domain_name): + browser.visit('{}/plinth/apps/{}/setup/'.format(base_url, app_name)) + drop_down = browser.find_by_id('id_domain_name') + drop_down.select(domain_name) + submit(browser, form_class='form-configuration') + + +######################### +# App install utilities # +######################### +def _find_install_button(browser, app_name): + nav_to_module(browser, app_name) + return browser.find_by_css('.form-install input[type=submit]') + + +def is_installed(browser, app_name): + install_button = _find_install_button(browser, app_name) + return not bool(install_button) + + +def install(browser, app_name): + install_button = _find_install_button(browser, app_name) + + def install_in_progress(): + selectors = [ + '.install-state-' + state + for state in ['pre', 'post', 'installing'] + ] + return any( + browser.is_element_present_by_css(selector) + for selector in selectors) + + def is_server_restarting(): + return browser.is_element_present_by_css('.neterror') + + def wait_for_install(): + if install_in_progress(): + time.sleep(1) + elif is_server_restarting(): + time.sleep(1) + browser.visit(browser.url) + else: + return + wait_for_install() + + if install_button: + install_button.click() + wait_for_install() + # sleep(2) # XXX This shouldn't be required. + + +################################ +# App enable/disable utilities # +################################ +def _change_app_status(browser, app_name, change_status_to='enabled'): + """Enable or disable application.""" + button = browser.find_by_css('button[name="app_enable_disable_button"]') + + if button: + should_enable_field = browser.find_by_id('id_should_enable') + if (should_enable_field.value == 'False' + and change_status_to == 'disabled') or ( + should_enable_field.value == 'True' + and change_status_to == 'enabled'): + submit(browser, element=button) + else: + checkbox_id = _app_checkbox_id[app_name] + change_checkbox_status(browser, app_name, checkbox_id, + change_status_to) + + if app_name in _apps_with_loaders: + wait_for_config_update(browser, app_name) + + +def app_enable(browser, app_name): + nav_to_module(browser, app_name) + _change_app_status(browser, app_name, 'enabled') + + +def app_disable(browser, app_name): + nav_to_module(browser, app_name) + _change_app_status(browser, app_name, 'disabled') + + +def app_can_be_disabled(browser, app_name): + """Return whether the application can be disabled.""" + nav_to_module(browser, app_name) + button = browser.find_by_css('button[name="app_enable_disable_button"]') + return bool(button) + + +######################### +# Domain name utilities # +######################### +def set_domain_name(browser, domain_name): + nav_to_module(browser, 'config') + browser.find_by_id('id_domainname').fill(domain_name) + submit(browser) + + +######################## +# Front page utilities # +######################## +def find_on_front_page(browser, app_name): + browser.visit(base_url) + shortcuts = browser.find_link_by_href(f'/{app_name}/') + return shortcuts + + +#################### +# Daemon utilities # +#################### +def service_is_running(browser, app_name): + nav_to_module(browser, app_name) + return len(browser.find_by_id('service-not-running')) == 0 + + +def service_is_not_running(browser, app_name): + nav_to_module(browser, app_name) + return len(browser.find_by_id('service-not-running')) != 0 + + +############################## +# System -> Config utilities # +############################## +def set_advanced_mode(browser, mode): + nav_to_module(browser, 'config') + advanced_mode = browser.find_by_id('id_advanced_mode') + if mode: + advanced_mode.check() + else: + advanced_mode.uncheck() + + submit(browser) + + +#################### +# Backup utilities # +#################### +def _click_button_and_confirm(browser, href): + buttons = browser.find_link_by_href(href) + if buttons: + buttons.first.click() + with wait_for_page_update(browser, + expected_url='/plinth/sys/backups/'): + submit(browser) + + +def _backup_delete_archive_by_name(browser, archive_name): + nav_to_module(browser, 'backups') + href = f'/plinth/sys/backups/root/delete/{archive_name}/' + _click_button_and_confirm(browser, href) + + +def backup_create(browser, app_name, archive_name=None): + install(browser, 'backups') + if archive_name: + _backup_delete_archive_by_name(browser, archive_name) + + browser.find_link_by_href('/plinth/sys/backups/create/').first.click() + browser.find_by_id('select-all').uncheck() + if archive_name: + browser.find_by_id('id_backups-name').fill(archive_name) + + # ensure the checkbox is scrolled into view + browser.execute_script('window.scrollTo(0, 0)') + browser.find_by_value(app_name).first.check() + submit(browser) + + +def backup_restore(browser, app_name, archive_name=None): + nav_to_module(browser, 'backups') + href = f'/plinth/sys/backups/root/restore-archive/{archive_name}/' + _click_button_and_confirm(browser, href) + + +###################### +# Networks utilities # +###################### +def networks_set_firewall_zone(browser, zone): + """"Set the network device firewall zone as internal or external.""" + nav_to_module(browser, 'networks') + device = browser.find_by_xpath( + '//span[contains(@class, "label-success") ' + 'and contains(@class, "connection-status-label")]/following::a').first + network_id = device['href'].split('/')[-3] + device.click() + edit_url = "/plinth/sys/networks/{}/edit/".format(network_id) + browser.find_link_by_href(edit_url).first.click() + browser.select('zone', zone) + browser.find_by_tag("form").first.find_by_tag('input')[-1].click() + + +################## +# Bind utilities # +################## +def set_forwarders(browser, forwarders): + """Set the forwarders list (space separated) in bind configuration.""" + nav_to_module(browser, 'bind') + browser.fill('forwarders', forwarders) + submit(browser, form_class='form-configuration') + + +def get_forwarders(browser): + """Return the forwarders list (space separated) in bind configuration.""" + nav_to_module(browser, 'bind') + return browser.find_by_name('forwarders').first.value diff --git a/plinth/tests/functional/step_definitions.py b/plinth/tests/functional/step_definitions.py new file mode 100644 index 000000000..034c002af --- /dev/null +++ b/plinth/tests/functional/step_definitions.py @@ -0,0 +1,163 @@ +# SPDX-License-Identifier: AGPL-3.0-or-later +""" +Step definitions used across apps. +""" + +import time + +import pytest +from pytest_bdd import given, parsers, then, when + +from plinth.tests import functional + + +@given("I'm a logged in user") +def logged_in_user(session_browser): + functional.login(session_browser, functional.base_url, + functional.config['DEFAULT']['username'], + functional.config['DEFAULT']['password']) + + +@given("I'm a logged out user") +def logged_out_user(session_browser): + functional.visit(session_browser, '/plinth/accounts/logout/') + + +@when("I log out") +def log_out_user(session_browser): + functional.visit(session_browser, '/plinth/accounts/logout/') + + +@given(parsers.parse('the {app_name:w} application is installed')) +def application_is_installed(session_browser, app_name): + functional.install(session_browser, app_name) + assert (functional.is_installed(session_browser, app_name)) + + +@given(parsers.parse('the {app_name:w} application is enabled')) +def application_is_enabled(session_browser, app_name): + functional.app_enable(session_browser, app_name) + + +@given(parsers.parse('the {app_name:w} application is disabled')) +def application_is_disabled(session_browser, app_name): + functional.app_disable(session_browser, app_name) + + +@when(parsers.parse('I enable the {app_name:w} application')) +def enable_application(session_browser, app_name): + functional.app_enable(session_browser, app_name) + + +@when(parsers.parse('I disable the {app_name:w} application')) +def disable_application(session_browser, app_name): + functional.app_disable(session_browser, app_name) + + +@given(parsers.parse('the {app_name:w} application can be disabled')) +def app_can_be_disabled(session_browser, app_name): + if not functional.app_can_be_disabled(session_browser, app_name): + pytest.skip(f'network time application can\'t be disabled') + + +@then(parsers.parse('the {service_name:w} service should be running')) +def service_should_be_running(session_browser, service_name): + assert functional.eventually(functional.service_is_running, + args=[session_browser, service_name]) + + +@then(parsers.parse('the {service_name:w} service should not be running')) +def service_should_not_be_running(session_browser, service_name): + assert functional.eventually(functional.service_is_not_running, + args=[session_browser, service_name]) + + +@then(parsers.parse('I should be prompted for login')) +def prompted_for_login(session_browser): + assert functional.is_login_prompt(session_browser) + + +@given(parsers.parse('the domain name is set to {domain:S}')) +def step_set_domain_name(session_browser, domain): + functional.set_domain_name(session_browser, domain) + + +@then(parsers.parse('the {site_name:w} site should be available')) +def site_should_be_available(session_browser, site_name): + assert functional.is_available(session_browser, site_name) + + +@then(parsers.parse('the {site_name:w} site should not be available')) +def site_should_not_be_available(session_browser, site_name): + assert not functional.is_available(session_browser, site_name) + + +@when(parsers.parse('I access {app_name:w} application')) +def access_application(session_browser, app_name): + functional.access_url(session_browser, app_name) + + +@given('advanced mode is on') +def advanced_mode_is_on(session_browser): + functional.set_advanced_mode(session_browser, True) + + +@when( + parsers.parse('I create a backup of the {app_name:w} app data with ' + 'name {archive_name:w}')) +def backup_create(session_browser, app_name, archive_name): + functional.backup_create(session_browser, app_name, archive_name) + + +@when(parsers.parse('I wait for {seconds} seconds')) +def sleep_for(seconds): + seconds = int(seconds) + time.sleep(seconds) + + +@when( + parsers.parse( + 'I restore the {app_name:w} app data backup with name {archive_name:w}' + )) +def backup_restore(session_browser, app_name, archive_name): + functional.backup_restore(session_browser, app_name, archive_name) + + +@given(parsers.parse('the network device is in the {zone:w} firewall zone')) +def networks_set_firewall_zone(session_browser, zone): + functional.networks_set_firewall_zone(session_browser, zone) + + +@given( + parsers.parse('the domain name for {app_name:w} is set to {domain_name:S}') +) +def select_domain_name(session_browser, app_name, domain_name): + functional.app_select_domain_name(session_browser, app_name, domain_name) + + +@then(parsers.parse('{app_name:w} app should be visible on the front page')) +def app_visible_on_front_page(session_browser, app_name): + shortcuts = functional.find_on_front_page(session_browser, app_name) + assert len(shortcuts) == 1 + + +@then(parsers.parse('{app_name:w} app should not be visible on the front page') + ) +def app_not_visible_on_front_page(session_browser, app_name): + shortcuts = functional.find_on_front_page(session_browser, app_name) + assert len(shortcuts) == 0 + + +@given(parsers.parse('bind forwarders are set to {forwarders}')) +def bind_given_set_forwarders(session_browser, forwarders): + functional.set_forwarders(session_browser, forwarders) + + +@when(parsers.parse('I set bind forwarders to {forwarders}')) +def bind_set_forwarders(session_browser, forwarders): + functional.set_forwarders(session_browser, forwarders) + + +@then(parsers.parse('bind forwarders should be {forwarders}')) +def bind_assert_forwarders(session_browser, forwarders): + assert functional.get_forwarders(session_browser) == forwarders diff --git a/plinth/tests/functional/step_definitions/__init__.py b/plinth/tests/functional/step_definitions/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/plinth/tests/functional/step_definitions/application.py b/plinth/tests/functional/step_definitions/application.py deleted file mode 100644 index 5692b5f64..000000000 --- a/plinth/tests/functional/step_definitions/application.py +++ /dev/null @@ -1,639 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import pytest -import splinter -from pytest_bdd import given, parsers, then, when - -from ..support import application - - -@given(parsers.parse('the {app_name:w} application is installed')) -def application_is_installed(session_browser, app_name): - application.install(session_browser, app_name) - assert (application.is_installed(session_browser, app_name)) - - -@given(parsers.parse('the {app_name:w} application is enabled')) -def application_is_enabled(session_browser, app_name): - application.enable(session_browser, app_name) - - -@given(parsers.parse('the {app_name:w} application is disabled')) -def application_is_disabled(session_browser, app_name): - application.disable(session_browser, app_name) - - -@given(parsers.parse('the network time application is enabled')) -def ntp_is_enabled(session_browser): - application.enable(session_browser, 'ntp') - - -@given(parsers.parse('the network time application is disabled')) -def ntp_is_disabled(session_browser): - application.disable(session_browser, 'ntp') - - -@given(parsers.parse('the network time application can be disabled')) -def ntp_can_be_disabled(session_browser): - if not application.can_be_disabled(session_browser, 'ntp'): - pytest.skip(f'network time application can\'t be disabled') - - -@when(parsers.parse('I set the time zone to {time_zone:S}')) -def time_zone_set(session_browser, time_zone): - application.time_zone_set(session_browser, time_zone) - - -@then(parsers.parse('the time zone should be {time_zone:S}')) -def time_zone_assert(session_browser, time_zone): - assert time_zone == application.time_zone_get(session_browser) - - -@given(parsers.parse('the service discovery application is enabled')) -def avahi_is_enabled(session_browser): - application.enable(session_browser, 'avahi') - - -@given(parsers.parse('the service discovery application is disabled')) -def avahi_is_disabled(session_browser): - application.disable(session_browser, 'avahi') - - -@when(parsers.parse('I enable the {app_name:w} application')) -def enable_application(session_browser, app_name): - application.enable(session_browser, app_name) - - -@when(parsers.parse('I disable the {app_name:w} application')) -def disable_application(session_browser, app_name): - application.disable(session_browser, app_name) - - -@when(parsers.parse('I enable the network time application')) -def enable_ntp(session_browser): - application.enable(session_browser, 'ntp') - - -@when(parsers.parse('I disable the network time application')) -def disable_ntp(session_browser): - application.disable(session_browser, 'ntp') - - -@when(parsers.parse('I enable the service discovery application')) -def enable_avahi(session_browser): - application.enable(session_browser, 'avahi') - - -@when(parsers.parse('I disable the service discovery application')) -def disable_avahi(session_browser): - application.disable(session_browser, 'avahi') - - -@given( - parsers.parse('the domain name for {app_name:w} is set to {domain_name:S}') -) -def select_domain_name(session_browser, app_name, domain_name): - application.select_domain_name(session_browser, app_name, domain_name) - - -@given('the shadowsocks application is configured') -def configure_shadowsocks(session_browser): - application.configure_shadowsocks(session_browser, 'example.com', - 'fakepassword') - - -@when( - parsers.parse('I configure shadowsocks with server {server:S} and ' - 'password {password:w}')) -def configure_shadowsocks_with_details(session_browser, server, password): - application.configure_shadowsocks(session_browser, server, password) - - -@then( - parsers.parse('shadowsocks should be configured with server {server:S} ' - 'and password {password:w}')) -def assert_shadowsocks_configuration(session_browser, server, password): - assert ( - server, - password) == application.shadowsocks_get_configuration(session_browser) - - -@when(parsers.parse('I modify the maximum file size of coquelicot to {size:d}') - ) -def modify_max_file_size(session_browser, size): - application.modify_max_file_size(session_browser, size) - - -@then(parsers.parse('the maximum file size of coquelicot should be {size:d}')) -def assert_max_file_size(session_browser, size): - assert application.get_max_file_size(session_browser) == size - - -@when(parsers.parse('I modify the coquelicot upload password to {password:w}')) -def modify_upload_password(session_browser, password): - application.modify_upload_password(session_browser, password) - - -@given(parsers.parse('share {name:w} is not available')) -def remove_share(session_browser, name): - application.remove_share(session_browser, name) - - -@when(parsers.parse('I add a share {name:w} from path {path} for {group:w}')) -def add_share(session_browser, name, path, group): - application.add_share(session_browser, name, path, group) - - -@when( - parsers.parse('I edit share {old_name:w} to {new_name:w} from path {path} ' - 'for {group:w}')) -def edit_share(session_browser, old_name, new_name, path, group): - application.edit_share(session_browser, old_name, new_name, path, group) - - -@when(parsers.parse('I remove share {name:w}')) -def remove_share2(session_browser, name): - application.remove_share(session_browser, name) - - -@when(parsers.parse('I edit share {name:w} to be public')) -def edit_share_public_access(session_browser, name): - application.make_share_public(session_browser, name) - - -@then( - parsers.parse( - 'the share {name:w} should be listed from path {path} for {group:w}')) -def verify_share(session_browser, name, path, group): - application.verify_share(session_browser, name, path, group) - - -@then(parsers.parse('the share {name:w} should not be listed')) -def verify_invalid_share(session_browser, name): - with pytest.raises(splinter.exceptions.ElementDoesNotExist): - application.get_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should be accessible')) -def access_share(session_browser, name): - application.access_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should not exist')) -def verify_nonexistant_share(session_browser, name): - application.verify_nonexistant_share(session_browser, name) - - -@then(parsers.parse('the share {name:w} should not be accessible')) -def verify_inaccessible_share(session_browser, name): - application.verify_inaccessible_share(session_browser, name) - - -@when(parsers.parse('I enable mediawiki public registrations')) -def enable_mediawiki_public_registrations(session_browser): - application.enable_mediawiki_public_registrations(session_browser) - - -@when(parsers.parse('I disable mediawiki public registrations')) -def disable_mediawiki_public_registrations(session_browser): - application.disable_mediawiki_public_registrations(session_browser) - - -@when(parsers.parse('I enable mediawiki private mode')) -def enable_mediawiki_private_mode(session_browser): - application.enable_mediawiki_private_mode(session_browser) - - -@when(parsers.parse('I disable mediawiki private mode')) -def disable_mediawiki_private_mode(session_browser): - application.disable_mediawiki_private_mode(session_browser) - - -@when(parsers.parse('I set the mediawiki admin password to {password}')) -def set_mediawiki_admin_password(session_browser, password): - application.set_mediawiki_admin_password(session_browser, password) - - -@when(parsers.parse('I enable message archive management')) -def ejabberd_enable_archive_management(session_browser): - application.enable_ejabberd_message_archive_management(session_browser) - - -@when(parsers.parse('I disable message archive management')) -def ejabberd_disable_archive_management(session_browser): - application.disable_ejabberd_message_archive_management(session_browser) - - -@when('there is an ikiwiki wiki') -def ikiwiki_create_wiki_if_needed(session_browser): - application.ikiwiki_create_wiki_if_needed(session_browser) - - -@when('I delete the ikiwiki wiki') -def ikiwiki_delete_wiki(session_browser): - application.ikiwiki_delete_wiki(session_browser) - - -@then('the ikiwiki wiki should be restored') -def ikiwiki_should_exist(session_browser): - assert application.ikiwiki_wiki_exists(session_browser) - - -@given('I have added a contact to my roster') -def ejabberd_add_contact(session_browser): - application.ejabberd_add_contact(session_browser) - - -@when('I delete the contact from my roster') -def ejabberd_delete_contact(session_browser): - application.ejabberd_delete_contact(session_browser) - - -@then('I should have a contact on my roster') -def ejabberd_should_have_contact(session_browser): - assert application.ejabberd_has_contact(session_browser) - - -@given(parsers.parse('tor relay is {enabled:w}')) -def tor_given_relay_enable(session_browser, enabled): - application.tor_feature_enable(session_browser, 'relay', enabled) - - -@when(parsers.parse('I {enable:w} tor relay')) -def tor_relay_enable(session_browser, enable): - application.tor_feature_enable(session_browser, 'relay', enable) - - -@then(parsers.parse('tor relay should be {enabled:w}')) -def tor_assert_relay_enabled(session_browser, enabled): - application.tor_assert_feature_enabled(session_browser, 'relay', enabled) - - -@then(parsers.parse('tor {port_name:w} port should be displayed')) -def tor_assert_port_displayed(session_browser, port_name): - assert port_name in application.tor_get_relay_ports(session_browser) - - -@given(parsers.parse('tor bridge relay is {enabled:w}')) -def tor_given_bridge_relay_enable(session_browser, enabled): - application.tor_feature_enable(session_browser, 'bridge-relay', enabled) - - -@when(parsers.parse('I {enable:w} tor bridge relay')) -def tor_bridge_relay_enable(session_browser, enable): - application.tor_feature_enable(session_browser, 'bridge-relay', enable) - - -@then(parsers.parse('tor bridge relay should be {enabled:w}')) -def tor_assert_bridge_relay_enabled(session_browser, enabled): - application.tor_assert_feature_enabled(session_browser, 'bridge-relay', - enabled) - - -@given(parsers.parse('tor hidden services are {enabled:w}')) -def tor_given_hidden_services_enable(session_browser, enabled): - application.tor_feature_enable(session_browser, 'hidden-services', enabled) - - -@when(parsers.parse('I {enable:w} tor hidden services')) -def tor_hidden_services_enable(session_browser, enable): - application.tor_feature_enable(session_browser, 'hidden-services', enable) - - -@then(parsers.parse('tor hidden services should be {enabled:w}')) -def tor_assert_hidden_services_enabled(session_browser, enabled): - application.tor_assert_feature_enabled(session_browser, 'hidden-services', - enabled) - - -@then(parsers.parse('tor hidden services information should be displayed')) -def tor_assert_hidden_services(session_browser): - application.tor_assert_hidden_services(session_browser) - - -@given(parsers.parse('download software packages over tor is {enabled:w}')) -def tor_given_download_software_over_tor_enable(session_browser, enabled): - application.tor_feature_enable(session_browser, 'software', enabled) - - -@when(parsers.parse('I {enable:w} download software packages over tor')) -def tor_download_software_over_tor_enable(session_browser, enable): - application.tor_feature_enable(session_browser, 'software', enable) - - -@then( - parsers.parse('download software packages over tor should be {enabled:w}')) -def tor_assert_download_software_over_tor(session_browser, enabled): - application.tor_assert_feature_enabled(session_browser, 'software', - enabled) - - -@then( - parsers.parse( - '{domain:S} should be a tahoe {introducer_type:w} introducer')) -def tahoe_assert_introducer(session_browser, domain, introducer_type): - assert application.tahoe_get_introducer(session_browser, domain, - introducer_type) - - -@then( - parsers.parse( - '{domain:S} should not be a tahoe {introducer_type:w} introducer')) -def tahoe_assert_not_introducer(session_browser, domain, introducer_type): - assert not application.tahoe_get_introducer(session_browser, domain, - introducer_type) - - -@given(parsers.parse('{domain:S} is not a tahoe introducer')) -def tahoe_given_remove_introducer(session_browser, domain): - if application.tahoe_get_introducer(session_browser, domain, 'connected'): - application.tahoe_remove_introducer(session_browser, domain) - - -@when(parsers.parse('I add {domain:S} as a tahoe introducer')) -def tahoe_add_introducer(session_browser, domain): - application.tahoe_add_introducer(session_browser, domain) - - -@given(parsers.parse('{domain:S} is a tahoe introducer')) -def tahoe_given_add_introducer(session_browser, domain): - if not application.tahoe_get_introducer(session_browser, domain, - 'connected'): - application.tahoe_add_introducer(session_browser, domain) - - -@when(parsers.parse('I remove {domain:S} as a tahoe introducer')) -def tahoe_remove_introducer(session_browser, domain): - application.tahoe_remove_introducer(session_browser, domain) - - -@given('the access rights are set to "only the owner can view or make changes"' - ) -def radicale_given_owner_only(session_browser): - application.radicale_set_access_rights(session_browser, 'owner_only') - - -@given('the access rights are set to "any user can view, but only the ' - 'owner can make changes"') -def radicale_given_owner_write(session_browser): - application.radicale_set_access_rights(session_browser, 'owner_write') - - -@given('the access rights are set to "any user can view or make changes"') -def radicale_given_authenticated(session_browser): - application.radicale_set_access_rights(session_browser, 'authenticated') - - -@when('I change the access rights to "only the owner can view or make changes"' - ) -def radicale_set_owner_only(session_browser): - application.radicale_set_access_rights(session_browser, 'owner_only') - - -@when('I change the access rights to "any user can view, but only the ' - 'owner can make changes"') -def radicale_set_owner_write(session_browser): - application.radicale_set_access_rights(session_browser, 'owner_write') - - -@when('I change the access rights to "any user can view or make changes"') -def radicale_set_authenticated(session_browser): - application.radicale_set_access_rights(session_browser, 'authenticated') - - -@then('the access rights should be "only the owner can view or make changes"') -def radicale_check_owner_only(session_browser): - assert application.radicale_get_access_rights( - session_browser) == 'owner_only' - - -@then('the access rights should be "any user can view, but only the ' - 'owner can make changes"') -def radicale_check_owner_write(session_browser): - assert application.radicale_get_access_rights( - session_browser) == 'owner_write' - - -@then('the access rights should be "any user can view or make changes"') -def radicale_check_authenticated(session_browser): - assert application.radicale_get_access_rights( - session_browser) == 'authenticated' - - -@given(parsers.parse('the openvpn application is setup')) -def openvpn_setup(session_browser): - application.openvpn_setup(session_browser) - - -@given('I download openvpn profile') -def openvpn_download_profile(session_browser): - return application.openvpn_download_profile(session_browser) - - -@then('the openvpn profile should be downloadable') -def openvpn_profile_downloadable(session_browser): - application.openvpn_download_profile(session_browser) - - -@then('the openvpn profile downloaded should be same as before') -def openvpn_profile_download_compare(session_browser, - openvpn_download_profile): - new_profile = application.openvpn_download_profile(session_browser) - assert openvpn_download_profile == new_profile - - -@given('public access is enabled in searx') -def searx_public_access_enabled(session_browser): - application.searx_enable_public_access(session_browser) - - -@when('I enable public access in searx') -def searx_enable_public_access(session_browser): - application.searx_enable_public_access(session_browser) - - -@when('I disable public access in searx') -def searx_disable_public_access(session_browser): - application.searx_disable_public_access(session_browser) - - -@then(parsers.parse('{app_name:w} app should be visible on the front page')) -def app_visible_on_front_page(session_browser, app_name): - shortcuts = application.find_on_front_page(session_browser, app_name) - assert len(shortcuts) == 1 - - -@then(parsers.parse('{app_name:w} app should not be visible on the front page') - ) -def app_not_visible_on_front_page(session_browser, app_name): - shortcuts = application.find_on_front_page(session_browser, app_name) - assert len(shortcuts) == 0 - - -@given('a public repository') -@given('a repository') -@given('at least one repository exists') -def gitweb_repo(session_browser): - application.gitweb_create_repo(session_browser, 'Test-repo', 'public', - True) - - -@given('a private repository') -def gitweb_private_repo(session_browser): - application.gitweb_create_repo(session_browser, 'Test-repo', 'private', - True) - - -@given('both public and private repositories exist') -def gitweb_public_and_private_repo(session_browser): - application.gitweb_create_repo(session_browser, 'Test-repo', 'public', - True) - application.gitweb_create_repo(session_browser, 'Test-repo2', 'private', - True) - - -@given(parsers.parse("a {access:w} repository that doesn't exist")) -def gitweb_nonexistent_repo(session_browser, access): - application.gitweb_delete_repo(session_browser, 'Test-repo', - ignore_missing=True) - return dict(access=access) - - -@given('all repositories are private') -def gitweb_all_repositories_private(session_browser): - application.gitweb_set_all_repos_private(session_browser) - - -@given(parsers.parse('a repository metadata:\n{metadata}')) -def gitweb_repo_metadata(session_browser, metadata): - metadata_dict = {} - for item in metadata.split('\n'): - item = item.split(': ') - metadata_dict[item[0]] = item[1] - return metadata_dict - - -@when('I create the repository') -def gitweb_create_repo(session_browser, access): - application.gitweb_create_repo(session_browser, 'Test-repo', access) - - -@when('I delete the repository') -def gitweb_delete_repo(session_browser): - application.gitweb_delete_repo(session_browser, 'Test-repo') - - -@when('I set the metadata of the repository') -def gitweb_edit_repo_metadata(session_browser, gitweb_repo_metadata): - application.gitweb_edit_repo_metadata(session_browser, 'Test-repo', - gitweb_repo_metadata) - - -@when('using a git client') -def gitweb_using_git_client(): - pass - - -@then('the repository should be restored') -@then('the repository should be listed as a public') -def gitweb_repo_should_exists(session_browser): - assert application.gitweb_repo_exists(session_browser, 'Test-repo', - access='public') - - -@then('the repository should be listed as a private') -def gitweb_private_repo_should_exists(session_browser): - assert application.gitweb_repo_exists(session_browser, 'Test-repo', - 'private') - - -@then('the repository should not be listed') -def gitweb_repo_should_not_exist(session_browser, gitweb_repo): - assert not application.gitweb_repo_exists(session_browser, gitweb_repo) - - -@then('the public repository should be listed on gitweb') -@then('the repository should be listed on gitweb') -def gitweb_repo_should_exist_on_gitweb(session_browser): - assert application.gitweb_site_repo_exists(session_browser, 'Test-repo') - - -@then('the private repository should not be listed on gitweb') -def gitweb_private_repo_should_exists_on_gitweb(session_browser): - assert not application.gitweb_site_repo_exists(session_browser, - 'Test-repo2') - - -@then('the metadata of the repository should be as set') -def gitweb_repo_metadata_should_match(session_browser, gitweb_repo_metadata): - actual_metadata = application.gitweb_get_repo_metadata( - session_browser, 'Test-repo') - assert all(item in actual_metadata.items() - for item in gitweb_repo_metadata.items()) - - -@then('the repository should be publicly readable') -def gitweb_repo_publicly_readable(): - assert application.gitweb_repo_is_readable('Test-repo') - assert application.gitweb_repo_is_readable('Test-repo', - url_git_extension=True) - - -@then('the repository should not be publicly readable') -def gitweb_repo_not_publicly_readable(): - assert not application.gitweb_repo_is_readable('Test-repo') - assert not application.gitweb_repo_is_readable('Test-repo', - url_git_extension=True) - - -@then('the repository should not be publicly writable') -def gitweb_repo_not_publicly_writable(): - assert not application.gitweb_repo_is_writable('Test-repo') - assert not application.gitweb_repo_is_writable('Test-repo', - url_git_extension=True) - - -@then('the repository should be privately readable') -def gitweb_repo_privately_readable(): - assert application.gitweb_repo_is_readable('Test-repo', with_auth=True) - assert application.gitweb_repo_is_readable('Test-repo', with_auth=True, - url_git_extension=True) - - -@then('the repository should be privately writable') -def gitweb_repo_privately_writable(): - assert application.gitweb_repo_is_writable('Test-repo', with_auth=True) - assert application.gitweb_repo_is_writable('Test-repo', with_auth=True, - url_git_extension=True) - - -@when(parsers.parse('I {task:w} the {share_type:w} samba share')) -def samba_enable_share(session_browser, task, share_type): - if task == 'enable': - application.samba_set_share(session_browser, share_type, - status='enabled') - elif task == 'disable': - application.samba_set_share(session_browser, share_type, - status='disabled') - - -@then(parsers.parse('I can write to the {share_type:w} samba share')) -def samba_share_should_be_writable(share_type): - application.samba_assert_share_is_writable(share_type) - - -@then(parsers.parse('a guest user can write to the {share_type:w} samba share') - ) -def samba_share_should_be_writable_to_guest(share_type): - application.samba_assert_share_is_writable(share_type, as_guest=True) - - -@then( - parsers.parse('a guest user can\'t access the {share_type:w} samba share')) -def samba_share_should_not_be_accessible_to_guest(share_type): - application.samba_assert_share_is_not_accessible(share_type, as_guest=True) - - -@then(parsers.parse('the {share_type:w} samba share should not be available')) -def samba_share_should_not_be_available(share_type): - application.samba_assert_share_is_not_available(share_type) diff --git a/plinth/tests/functional/step_definitions/interface.py b/plinth/tests/functional/step_definitions/interface.py deleted file mode 100644 index 512d7d953..000000000 --- a/plinth/tests/functional/step_definitions/interface.py +++ /dev/null @@ -1,90 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -from pytest_bdd import given, parsers, then, when - -from ..support import config, interface - -default_url = config['DEFAULT']['url'] - - -@given("I'm a logged in user") -def logged_in_user(session_browser): - interface.login(session_browser, default_url, - config['DEFAULT']['username'], - config['DEFAULT']['password']) - - -@given("I'm a logged out user") -def logged_out_user(session_browser): - session_browser.visit(default_url + '/plinth/accounts/logout/') - - -@when("I log out") -def log_out_user(session_browser): - session_browser.visit(default_url + '/plinth/accounts/logout/') - - -@then(parsers.parse('I should be prompted for login')) -def prompted_for_login(session_browser): - assert interface.is_login_prompt(session_browser) - - -@given(parsers.parse("the user {name:w} doesn't exist")) -def new_user_does_not_exist(session_browser, name): - interface.delete_user(session_browser, name) - - -@given(parsers.parse('the user {name:w} exists')) -def test_user_exists(session_browser, name): - interface.nav_to_module(session_browser, 'users') - user_link = session_browser.find_link_by_href('/plinth/sys/users/' + name + - '/edit/') - if not user_link: - create_user(session_browser, name, 'secret123') - - -@when( - parsers.parse('I create a user named {name:w} with password {password:w}')) -def create_user(session_browser, name, password): - interface.create_user(session_browser, name, password) - - -@when(parsers.parse('I rename the user {old_name:w} to {new_name:w}')) -def rename_user(session_browser, old_name, new_name): - interface.rename_user(session_browser, old_name, new_name) - - -@when(parsers.parse('I delete the user {name:w}')) -def delete_user(session_browser, name): - interface.delete_user(session_browser, name) - - -@then(parsers.parse('{name:w} should be listed as a user')) -def new_user_is_listed(session_browser, name): - assert interface.is_user(session_browser, name) - - -@then(parsers.parse('{name:w} should not be listed as a user')) -def new_user_is_not_listed(session_browser, name): - assert not interface.is_user(session_browser, name) - - -@given('a sample local file') -def sample_local_file(): - file_path, contents = interface.create_sample_local_file() - return dict(file_path=file_path, contents=contents) - - -@when('I go to the status logs page') -def help_go_to_status_logs(session_browser): - interface.go_to_status_logs(session_browser) - - -@then('status logs should be shown') -def help_status_logs_are_shown(session_browser): - assert interface.are_status_logs_shown(session_browser) - - -@given(parsers.parse("I'm on the {name:w} page")) -def go_to_module(session_browser, name): - interface.nav_to_module(session_browser, name) diff --git a/plinth/tests/functional/step_definitions/service.py b/plinth/tests/functional/step_definitions/service.py deleted file mode 100644 index ec543d136..000000000 --- a/plinth/tests/functional/step_definitions/service.py +++ /dev/null @@ -1,37 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -from pytest_bdd import parsers, then - -from ..support import service -from ..support.service import eventually - - -@then(parsers.parse('the {service_name:w} service should be running')) -def service_should_be_running(session_browser, service_name): - assert eventually(service.is_running, args=[session_browser, service_name]) - - -@then(parsers.parse('the {service_name:w} service should not be running')) -def service_should_not_be_running(session_browser, service_name): - assert eventually(service.is_not_running, - args=[session_browser, service_name]) - - -@then(parsers.parse('the network time service should be running')) -def ntp_should_be_running(session_browser): - assert service.is_running(session_browser, 'ntp') - - -@then(parsers.parse('the network time service should not be running')) -def ntp_should_not_be_running(session_browser): - assert not service.is_running(session_browser, 'ntp') - - -@then(parsers.parse('the service discovery service should be running')) -def avahi_should_be_running(session_browser): - assert service.is_running(session_browser, 'avahi') - - -@then(parsers.parse('the service discovery service should not be running')) -def avahi_should_not_be_running(session_browser): - assert not service.is_running(session_browser, 'avahi') diff --git a/plinth/tests/functional/step_definitions/site.py b/plinth/tests/functional/step_definitions/site.py deleted file mode 100644 index c5b23d6ba..000000000 --- a/plinth/tests/functional/step_definitions/site.py +++ /dev/null @@ -1,234 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -from pytest_bdd import given, parsers, then, when - -from ..support import interface, site - - -@then(parsers.parse('the {site_name:w} site should be available')) -def site_should_be_available(session_browser, site_name): - assert site.is_available(session_browser, site_name) - - -@then(parsers.parse('the {site_name:w} site should not be available')) -def site_should_not_be_available(session_browser, site_name): - assert not site.is_available(session_browser, site_name) - - -@when(parsers.parse('I access {app_name:w} application')) -def access_application(session_browser, app_name): - site.access_url(session_browser, app_name) - - -@when( - parsers.parse( - 'I upload an image named {image:S} to mediawiki with credentials ' - '{username:w} and {password:w}')) -def upload_image(session_browser, username, password, image): - site.upload_image_mediawiki(session_browser, username, password, image) - - -@then(parsers.parse('there should be {image:S} image')) -def uploaded_image_should_be_available(session_browser, image): - uploaded_image = site.get_uploaded_image_in_mediawiki( - session_browser, image) - assert image.lower() == uploaded_image.lower() - - -@then( - parsers.parse( - 'I should be able to login to coquelicot with password {password:w}')) -def verify_upload_password(session_browser, password): - site.verify_coquelicot_upload_password(session_browser, password) - - -@when( - parsers.parse('I upload the sample local file to coquelicot with password ' - '{password:w}')) -def coquelicot_upload_file(session_browser, sample_local_file, password): - url = site.upload_file_to_coquelicot(session_browser, - sample_local_file['file_path'], - password) - sample_local_file['upload_url'] = url - - -@when('I download the uploaded file from coquelicot') -def coquelicot_download_file(sample_local_file): - file_path = interface.download_file(sample_local_file['upload_url']) - sample_local_file['download_path'] = file_path - - -@then('contents of downloaded sample file should be same as sample local file') -def coquelicot_compare_upload_download_files(sample_local_file): - interface.compare_files(sample_local_file['file_path'], - sample_local_file['download_path']) - - -@then(parsers.parse('the mediawiki site should allow creating accounts')) -def mediawiki_allows_creating_accounts(session_browser): - site.verify_mediawiki_create_account_link(session_browser) - - -@then(parsers.parse('the mediawiki site should not allow creating accounts')) -def mediawiki_does_not_allow_creating_accounts(session_browser): - site.verify_mediawiki_no_create_account_link(session_browser) - - -@then( - parsers.parse('the mediawiki site should allow anonymous reads and writes') -) -def mediawiki_allows_anonymous_reads_edits(session_browser): - site.verify_mediawiki_anonymous_reads_edits_link(session_browser) - - -@then( - parsers.parse( - 'the mediawiki site should not allow anonymous reads and writes')) -def mediawiki_does_not_allow__account_creation_anonymous_reads_edits( - session_browser): - site.verify_mediawiki_no_anonymous_reads_edits_link(session_browser) - - -@then( - parsers.parse( - 'I should see the Upload File option in the side pane when logged in ' - 'with credentials {username:w} and {password:w}')) -def login_to_mediawiki_with_credentials(session_browser, username, password): - site.login_to_mediawiki_with_credentials(session_browser, username, - password) - - -@when('I delete the mediawiki main page') -def mediawiki_delete_main_page(session_browser): - site.mediawiki_delete_main_page(session_browser) - - -@then('the mediawiki main page should be restored') -def mediawiki_verify_text(session_browser): - assert site.mediawiki_has_main_page(session_browser) - - -@when('all ed2k files are removed from mldonkey') -def mldonkey_remove_all_ed2k_files(session_browser): - site.mldonkey_remove_all_ed2k_files(session_browser) - - -@when('I upload a sample ed2k file to mldonkey') -def mldonkey_upload_sample_ed2k_file(session_browser): - site.mldonkey_upload_sample_ed2k_file(session_browser) - - -@then( - parsers.parse( - 'there should be {ed2k_files_number:d} ed2k files listed in mldonkey')) -def mldonkey_assert_number_of_ed2k_files(session_browser, ed2k_files_number): - assert ed2k_files_number == site.mldonkey_get_number_of_ed2k_files( - session_browser) - - -@when('all torrents are removed from transmission') -def transmission_remove_all_torrents(session_browser): - site.transmission_remove_all_torrents(session_browser) - - -@when('I upload a sample torrent to transmission') -def transmission_upload_sample_torrent(session_browser): - site.transmission_upload_sample_torrent(session_browser) - - -@then( - parsers.parse( - 'there should be {torrents_number:d} torrents listed in transmission')) -def transmission_assert_number_of_torrents(session_browser, torrents_number): - assert torrents_number == site.transmission_get_number_of_torrents( - session_browser) - - -@when('all torrents are removed from deluge') -def deluge_remove_all_torrents(session_browser): - site.deluge_remove_all_torrents(session_browser) - - -@when('I upload a sample torrent to deluge') -def deluge_upload_sample_torrent(session_browser): - site.deluge_upload_sample_torrent(session_browser) - - -@then( - parsers.parse( - 'there should be {torrents_number:d} torrents listed in deluge')) -def deluge_assert_number_of_torrents(session_browser, torrents_number): - assert torrents_number == site.deluge_get_number_of_torrents( - session_browser) - - -@then('the calendar should be available') -def assert_calendar_is_available(session_browser): - assert site.calendar_is_available(session_browser) - - -@then('the calendar should not be available') -def assert_calendar_is_not_available(session_browser): - assert not site.calendar_is_available(session_browser) - - -@then('the addressbook should be available') -def assert_addressbook_is_available(session_browser): - assert site.addressbook_is_available(session_browser) - - -@then('the addressbook should not be available') -def assert_addressbook_is_not_available(session_browser): - assert not site.addressbook_is_available(session_browser) - - -@given(parsers.parse('syncthing folder {folder_name:w} is not present')) -def syncthing_folder_not_present(session_browser, folder_name): - if site.syncthing_folder_is_present(session_browser, folder_name): - site.syncthing_remove_folder(session_browser, folder_name) - - -@given( - parsers.parse( - 'folder {folder_path:S} is present as syncthing folder {folder_name:w}' - )) -def syncthing_folder_present(session_browser, folder_name, folder_path): - if not site.syncthing_folder_is_present(session_browser, folder_name): - site.syncthing_add_folder(session_browser, folder_name, folder_path) - - -@when( - parsers.parse( - 'I add a folder {folder_path:S} as syncthing folder {folder_name:w}')) -def syncthing_add_folder(session_browser, folder_name, folder_path): - site.syncthing_add_folder(session_browser, folder_name, folder_path) - - -@when(parsers.parse('I remove syncthing folder {folder_name:w}')) -def syncthing_remove_folder(session_browser, folder_name): - site.syncthing_remove_folder(session_browser, folder_name) - - -@then(parsers.parse('syncthing folder {folder_name:w} should be present')) -def syncthing_assert_folder_present(session_browser, folder_name): - assert site.syncthing_folder_is_present(session_browser, folder_name) - - -@then(parsers.parse('syncthing folder {folder_name:w} should not be present')) -def syncthing_assert_folder_not_present(session_browser, folder_name): - assert not site.syncthing_folder_is_present(session_browser, folder_name) - - -@given('I subscribe to a feed in ttrss') -def ttrss_subscribe(session_browser): - site.ttrss_subscribe(session_browser) - - -@when('I unsubscribe from the feed in ttrss') -def ttrss_unsubscribe(session_browser): - site.ttrss_unsubscribe(session_browser) - - -@then('I should be subscribed to the feed in ttrss') -def ttrss_assert_subscribed(session_browser): - assert site.ttrss_is_subscribed(session_browser) diff --git a/plinth/tests/functional/step_definitions/system.py b/plinth/tests/functional/step_definitions/system.py deleted file mode 100644 index 89a308c01..000000000 --- a/plinth/tests/functional/step_definitions/system.py +++ /dev/null @@ -1,341 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import os -import time - -from pytest import fixture -from pytest_bdd import given, parsers, then, when - -from ..support import system - -language_codes = { - 'Deutsch': 'de', - 'Nederlands': 'nl', - 'Português': 'pt', - 'Türkçe': 'tr', - 'dansk': 'da', - 'español': 'es', - 'français': 'fr', - 'norsk (bokmål)': 'nb', - 'polski': 'pl', - 'svenska': 'sv', - 'Русский': 'ru', - 'తెలుగు': 'te', - '简体中文': 'zh-hans' -} - - -@fixture(scope='session') -def downloaded_file_info(): - return dict() - - -@given(parsers.parse('the home page is {app_name:w}')) -def set_home_page(session_browser, app_name): - system.set_home_page(session_browser, app_name) - - -@given(parsers.parse('the domain name is set to {domain:S}')) -def set_domain_name(session_browser, domain): - system.set_domain_name(session_browser, domain) - - -@given('advanced mode is on') -def advanced_mode_is_on(session_browser): - system.set_advanced_mode(session_browser, True) - - -@when(parsers.parse('I change the hostname to {hostname:w}')) -def change_hostname_to(session_browser, hostname): - system.set_hostname(session_browser, hostname) - - -@when(parsers.parse('I change the domain name to {domain:S}')) -def change_domain_name_to(session_browser, domain): - system.set_domain_name(session_browser, domain) - - -@when(parsers.parse('I change the home page to {app_name:w}')) -def change_home_page_to(session_browser, app_name): - system.set_home_page(session_browser, app_name) - - -@when('I change the language to ') -def change_language(session_browser, language): - system.set_language(session_browser, language_codes[language]) - - -@then(parsers.parse('the hostname should be {hostname:w}')) -def hostname_should_be(session_browser, hostname): - assert system.get_hostname(session_browser) == hostname - - -@then(parsers.parse('the domain name should be {domain:S}')) -def domain_name_should_be(session_browser, domain): - assert system.get_domain_name(session_browser) == domain - - -@then('Plinth language should be ') -def plinth_language_should_be(session_browser, language): - assert system.check_language(session_browser, language_codes[language]) - - -@given('the list of snapshots is empty') -def empty_snapshots_list(session_browser): - system.delete_all_snapshots(session_browser) - - -@when('I manually create a snapshot') -def create_snapshot(session_browser): - system.create_snapshot(session_browser) - - -@then(parsers.parse('there should be {count:d} snapshot in the list')) -def verify_snapshot_count(session_browser, count): - num_snapshots = system.get_snapshot_count(session_browser) - assert num_snapshots == count - - -@given( - parsers.parse( - 'snapshots are configured with free space {free_space:d}, timeline ' - 'snapshots {timeline_enabled:w}, software snapshots ' - '{software_enabled:w}, hourly limit {hourly:d}, daily limit {daily:d}' - ', weekly limit {weekly:d}, monthly limit {monthly:d}, yearly limit ' - '{yearly:d}')) -def snapshot_given_set_configuration(session_browser, free_space, - timeline_enabled, software_enabled, - hourly, daily, weekly, monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - system.snapshot_set_configuration(session_browser, free_space, - timeline_enabled, software_enabled, - hourly, daily, weekly, monthly, yearly) - - -@when( - parsers.parse( - 'I configure snapshots with free space {free_space:d}, ' - 'timeline snapshots {timeline_enabled:w}, ' - 'software snapshots {software_enabled:w}, hourly limit {hourly:d}, ' - 'daily limit {daily:d}, weekly limit {weekly:d}, monthly limit ' - '{monthly:d}, yearly limit {yearly:d}')) -def snapshot_set_configuration(session_browser, free_space, timeline_enabled, - software_enabled, hourly, daily, weekly, - monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - system.snapshot_set_configuration(session_browser, free_space, - timeline_enabled, software_enabled, - hourly, daily, weekly, monthly, yearly) - - -@then( - parsers.parse( - 'snapshots should be configured with free space {free_space:d}, ' - 'timeline snapshots {timeline_enabled:w}, software snapshots ' - '{software_enabled:w}, hourly limit {hourly:d}, daily limit ' - '{daily:d}, weekly limit {weekly:d}, monthly limit {monthly:d}, ' - 'yearly limit {yearly:d}')) -def snapshot_assert_configuration(session_browser, free_space, - timeline_enabled, software_enabled, hourly, - daily, weekly, monthly, yearly): - timeline_enabled = (timeline_enabled == 'enabled') - software_enabled = (software_enabled == 'enabled') - assert (free_space, timeline_enabled, software_enabled, hourly, daily, - weekly, monthly, - yearly) == system.snapshot_get_configuration(session_browser) - - -@then(parsers.parse('the home page should be {app_name:w}')) -def home_page_should_be(session_browser, app_name): - assert system.check_home_page_redirect(session_browser, app_name) - - -@given('dynamicdns is configured') -def dynamicdns_configure(session_browser): - system.dynamicdns_configure(session_browser) - - -@when('I change the dynamicdns configuration') -def dynamicdns_change_config(session_browser): - system.dynamicdns_change_config(session_browser) - - -@then('dynamicdns should have the original configuration') -def dynamicdns_has_original_config(session_browser): - assert system.dynamicdns_has_original_config(session_browser) - - -@when( - parsers.parse('I create a backup of the {app_name:w} app data with ' - 'name {archive_name:w}')) -def backup_create(session_browser, app_name, archive_name): - system.backup_create(session_browser, app_name, archive_name) - - -@when( - parsers.parse('I download the app data backup with name {archive_name:w}')) -def backup_download(session_browser, downloaded_file_info, archive_name): - file_path = system.download_backup(session_browser, archive_name) - downloaded_file_info['path'] = file_path - - -@when( - parsers.parse( - 'I restore the {app_name:w} app data backup with name {archive_name:w}' - )) -def backup_restore(session_browser, app_name, archive_name): - system.backup_restore(session_browser, app_name, archive_name) - - -@when(parsers.parse('I restore the downloaded app data backup')) -def backup_restore_from_upload(session_browser, app_name, - downloaded_file_info): - path = downloaded_file_info["path"] - try: - system.backup_upload_and_restore(session_browser, app_name, path) - except Exception as err: - raise err - finally: - os.remove(path) - - -@when( - parsers.parse('I configure pagekite with host {host:S}, port {port:d}, ' - 'kite name {kite_name:S} and kite secret {kite_secret:w}')) -def pagekite_configure(session_browser, host, port, kite_name, kite_secret): - system.pagekite_configure(session_browser, host, port, kite_name, - kite_secret) - - -@then( - parsers.parse( - 'pagekite should be configured with host {host:S}, port {port:d}, ' - 'kite name {kite_name:S} and kite secret {kite_secret:w}')) -def pagekite_assert_configured(session_browser, host, port, kite_name, - kite_secret): - assert (host, port, kite_name, - kite_secret) == system.pagekite_get_configuration(session_browser) - - -@given(parsers.parse('bind forwarders are set to {forwarders}')) -def bind_given_set_forwarders(session_browser, forwarders): - system.bind_set_forwarders(session_browser, forwarders) - - -@when(parsers.parse('I set bind forwarders to {forwarders}')) -def bind_set_forwarders(session_browser, forwarders): - system.bind_set_forwarders(session_browser, forwarders) - - -@then(parsers.parse('bind forwarders should be {forwarders}')) -def bind_assert_forwarders(session_browser, forwarders): - assert system.bind_get_forwarders(session_browser) == forwarders - - -@given(parsers.parse('bind DNSSEC is {enable:w}')) -def bind_given_enable_dnssec(session_browser, enable): - should_enable = (enable == 'enabled') - system.bind_enable_dnssec(session_browser, should_enable) - - -@when(parsers.parse('I {enable:w} bind DNSSEC')) -def bind_enable_dnssec(session_browser, enable): - should_enable = (enable == 'enable') - system.bind_enable_dnssec(session_browser, should_enable) - - -@then(parsers.parse('bind DNSSEC should be {enabled:w}')) -def bind_assert_dnssec(session_browser, enabled): - assert system.bind_get_dnssec(session_browser) == (enabled == 'enabled') - - -@given(parsers.parse('restricted console logins are {enabled}')) -def security_given_enable_restricted_logins(session_browser, enabled): - should_enable = (enabled == 'enabled') - system.security_enable_restricted_logins(session_browser, should_enable) - - -@when(parsers.parse('I {enable} restricted console logins')) -def security_enable_restricted_logins(session_browser, enable): - should_enable = (enable == 'enable') - system.security_enable_restricted_logins(session_browser, should_enable) - - -@then(parsers.parse('restricted console logins should be {enabled}')) -def security_assert_restricted_logins(session_browser, enabled): - enabled = (enabled == 'enabled') - assert system.security_get_restricted_logins(session_browser) == enabled - - -@given(parsers.parse('automatic upgrades are {enabled:w}')) -def upgrades_given_enable_automatic(session_browser, enabled): - should_enable = (enabled == 'enabled') - system.upgrades_enable_automatic(session_browser, should_enable) - - -@when(parsers.parse('I {enable:w} automatic upgrades')) -def upgrades_enable_automatic(session_browser, enable): - should_enable = (enable == 'enable') - system.upgrades_enable_automatic(session_browser, should_enable) - - -@then(parsers.parse('automatic upgrades should be {enabled:w}')) -def upgrades_assert_automatic(session_browser, enabled): - should_be_enabled = (enabled == 'enabled') - assert system.upgrades_get_automatic(session_browser) == should_be_enabled - - -@given( - parsers.parse( - 'the {key_type:w} key for {domain:S} is imported in monkeysphere')) -def monkeysphere_given_import_key(session_browser, key_type, domain): - system.monkeysphere_import_key(session_browser, key_type.lower(), domain) - - -@when(parsers.parse('I import {key_type:w} key for {domain:S} in monkeysphere') - ) -def monkeysphere_import_key(session_browser, key_type, domain): - system.monkeysphere_import_key(session_browser, key_type.lower(), domain) - - -@then( - parsers.parse( - 'the {key_type:w} key should imported for {domain:S} in monkeysphere')) -def monkeysphere_assert_imported_key(session_browser, key_type, domain): - system.monkeysphere_assert_imported_key(session_browser, key_type.lower(), - domain) - - -@then( - parsers.parse('I should be able to publish {key_type:w} key for ' - '{domain:S} in monkeysphere')) -def monkeysphere_publish_key(session_browser, key_type, domain): - system.monkeysphere_publish_key(session_browser, key_type.lower(), domain) - - -@when(parsers.parse('I wait for {seconds} seconds')) -def sleep_for(seconds): - seconds = int(seconds) - time.sleep(seconds) - - -@when(parsers.parse('I open the main page')) -def open_main_page(session_browser): - system.open_main_page(session_browser) - - -@then(parsers.parse('the main page should be shown')) -def main_page_is_shown(session_browser): - assert (session_browser.url.endswith('/plinth/')) - - -@given(parsers.parse('the network device is in the {zone:w} firewall zone')) -def networks_set_firewall_zone(session_browser, zone): - system.networks_set_firewall_zone(session_browser, zone) - - -@then('the root disk should be shown') -def storage_root_disk_is_shown(session_browser): - assert system.storage_is_root_disk_shown(session_browser) diff --git a/plinth/tests/functional/support/__init__.py b/plinth/tests/functional/support/__init__.py deleted file mode 100644 index 9532249c2..000000000 --- a/plinth/tests/functional/support/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import configparser -import os -import pathlib - -config = configparser.ConfigParser() -config.read(pathlib.Path(__file__).parent.with_name('config.ini')) - -config['DEFAULT']['url'] = os.environ.get('FREEDOMBOX_URL', - config['DEFAULT']['url']) -config['DEFAULT']['samba_port'] = os.environ.get( - 'FREEDOMBOX_SAMBA_PORT', config['DEFAULT']['samba_port']) diff --git a/plinth/tests/functional/support/application.py b/plinth/tests/functional/support/application.py deleted file mode 100644 index 9fbb1e2c4..000000000 --- a/plinth/tests/functional/support/application.py +++ /dev/null @@ -1,752 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import contextlib -import os -import random -import shutil -import string -import subprocess -import tempfile -import urllib -from time import sleep - -import requests -import splinter - -from . import config, interface, site -from .interface import submit -from .service import eventually, wait_for_page_update - -# unlisted apps just use the app_name as module name -app_module = { - 'ntp': 'datetime', - 'wiki': 'ikiwiki', - 'tt-rss': 'ttrss', -} - -app_checkbox_id = { - 'tor': 'id_tor-enabled', -} - -default_url = config['DEFAULT']['url'] - -apps_with_loaders = ['tor'] - - -def get_app_module(app_name): - module = app_name - if app_name in app_module: - module = app_module[app_name] - return module - - -def _find_install_button(browser, app_name): - interface.nav_to_module(browser, get_app_module(app_name)) - return browser.find_by_css('.form-install input[type=submit]') - - -def install(browser, app_name): - install_button = _find_install_button(browser, app_name) - - def install_in_progress(): - selectors = [ - '.install-state-' + state - for state in ['pre', 'post', 'installing'] - ] - return any( - browser.is_element_present_by_css(selector) - for selector in selectors) - - def is_server_restarting(): - return browser.is_element_present_by_css('.neterror') - - def wait_for_install(): - if install_in_progress(): - sleep(1) - elif is_server_restarting(): - sleep(1) - browser.visit(browser.url) - else: - return - wait_for_install() - - if install_button: - install_button.click() - wait_for_install() - # sleep(2) # XXX This shouldn't be required. - - -def is_installed(browser, app_name): - install_button = _find_install_button(browser, app_name) - return not bool(install_button) - - -def _change_app_status(browser, app_name, change_status_to='enabled'): - """Enable or disable application.""" - button = browser.find_by_css('button[name="app_enable_disable_button"]') - - if button: - should_enable_field = browser.find_by_id('id_should_enable') - if (should_enable_field.value == 'False' - and change_status_to == 'disabled') or ( - should_enable_field.value == 'True' - and change_status_to == 'enabled'): - interface.submit(browser, element=button) - else: - checkbox_id = app_checkbox_id[app_name] - _change_status(browser, app_name, checkbox_id, change_status_to) - - if app_name in apps_with_loaders: - wait_for_config_update(browser, app_name) - - -def _change_status(browser, app_name, checkbox_id, change_status_to='enabled'): - """Change checkbox status.""" - checkbox = browser.find_by_id(checkbox_id) - checkbox.check() if change_status_to == 'enabled' else checkbox.uncheck() - interface.submit(browser, form_class='form-configuration') - - if app_name in apps_with_loaders: - wait_for_config_update(browser, app_name) - - -def enable(browser, app_name): - interface.nav_to_module(browser, get_app_module(app_name)) - _change_app_status(browser, app_name, 'enabled') - - -def disable(browser, app_name): - interface.nav_to_module(browser, get_app_module(app_name)) - _change_app_status(browser, app_name, 'disabled') - - -def can_be_disabled(browser, app_name): - """Return whether the application can be disabled.""" - interface.nav_to_module(browser, get_app_module(app_name)) - button = browser.find_by_css('button[name="app_enable_disable_button"]') - return bool(button) - - -def wait_for_config_update(browser, app_name): - while browser.is_element_present_by_css('.running-status.loading'): - sleep(0.1) - - -def _download_file(browser, url): - """Return file contents after downloading a URL.""" - cookies = browser.cookies.all() - response = requests.get(url, cookies=cookies, verify=False) - if response.status_code != 200: - raise Exception('URL download failed') - - return response.content - - -def select_domain_name(browser, app_name, domain_name): - browser.visit('{}/plinth/apps/{}/setup/'.format(default_url, app_name)) - drop_down = browser.find_by_id('id_domain_name') - drop_down.select(domain_name) - interface.submit(browser, form_class='form-configuration') - - -def configure_shadowsocks(browser, server, password): - """Configure shadowsocks client with given server details.""" - browser.visit('{}/plinth/apps/shadowsocks/'.format(default_url)) - browser.find_by_id('id_server').fill(server) - browser.find_by_id('id_password').fill(password) - interface.submit(browser, form_class='form-configuration') - - -def shadowsocks_get_configuration(browser): - """Return the server and password currently configured in shadowsocks.""" - browser.visit('{}/plinth/apps/shadowsocks/'.format(default_url)) - server = browser.find_by_id('id_server').value - password = browser.find_by_id('id_password').value - return server, password - - -def modify_max_file_size(browser, size): - """Change the maximum file size of coquelicot to the given value""" - browser.visit('{}/plinth/apps/coquelicot/'.format(default_url)) - browser.find_by_id('id_max_file_size').fill(size) - interface.submit(browser, form_class='form-configuration') - - -def get_max_file_size(browser): - """Get the maximum file size of coquelicot""" - browser.visit('{}/plinth/apps/coquelicot/'.format(default_url)) - return int(browser.find_by_id('id_max_file_size').value) - - -def modify_upload_password(browser, password): - """Change the upload password for coquelicot to the given value""" - browser.visit('{}/plinth/apps/coquelicot/'.format(default_url)) - browser.find_by_id('id_upload_password').fill(password) - interface.submit(browser, form_class='form-configuration') - - -# Sharing app helper functions - - -def remove_share(browser, name): - """Remove a share in sharing app.""" - try: - share_row = get_share(browser, name) - except splinter.exceptions.ElementDoesNotExist: - pass - else: - share_row.find_by_css('.share-remove')[0].click() - - -def add_share(browser, name, path, group): - """Add a share in sharing app.""" - browser.visit('{}/plinth/apps/sharing/add/'.format(default_url)) - browser.fill('sharing-name', name) - browser.fill('sharing-path', path) - browser.find_by_css( - '#id_sharing-groups input[value="{}"]'.format(group)).check() - submit(browser) - - -def edit_share(browser, old_name, new_name, path, group): - """Edit a share in sharing app.""" - row = get_share(browser, old_name) - with wait_for_page_update(browser): - row.find_by_css('.share-edit')[0].click() - browser.fill('sharing-name', new_name) - browser.fill('sharing-path', path) - browser.find_by_css('#id_sharing-groups input').uncheck() - browser.find_by_css( - '#id_sharing-groups input[value="{}"]'.format(group)).check() - submit(browser) - - -def get_share(browser, name): - """Return the row for a given share.""" - browser.visit('{}/plinth/apps/sharing/'.format(default_url)) - return browser.find_by_id('share-{}'.format(name))[0] - - -def verify_share(browser, name, path, group): - """Verfiy that a share exists in list of shares.""" - href = '{}/share/{}'.format(default_url, name) - url = '/share/{}'.format(name) - row = get_share(browser, name) - assert row.find_by_css('.share-name')[0].text == name - assert row.find_by_css('.share-path')[0].text == path - assert row.find_by_css('.share-url a')[0]['href'] == href - assert row.find_by_css('.share-url a')[0].text == url - assert row.find_by_css('.share-groups')[0].text == group - - -def access_share(browser, name): - """Visit a share and see if it is accessible.""" - row = get_share(browser, name) - url = row.find_by_css('.share-url a')[0]['href'] - browser.visit(url) - assert '/share/{}'.format(name) in browser.title - - -def make_share_public(browser, name): - """Make share publicly accessible.""" - row = get_share(browser, name) - with wait_for_page_update(browser): - row.find_by_css('.share-edit')[0].click() - browser.find_by_id('id_sharing-is_public').check() - interface.submit(browser) - - -def verify_nonexistant_share(browser, name): - """Verify that given URL for a given share name is a 404.""" - url = '{}/share/{}'.format(default_url, name) - browser.visit(url) - assert '404' in browser.title - - -def verify_inaccessible_share(browser, name): - """Verify that given URL for a given share name denies permission.""" - url = '{}/share/{}'.format(default_url, name) - browser.visit(url) - eventually(lambda: '/plinth' in browser.url, args=[]) - - -def enable_mediawiki_public_registrations(browser): - """Enable public registrations in MediaWiki.""" - interface.nav_to_module(browser, 'mediawiki') - _change_status(browser, 'mediawiki', 'id_enable_public_registrations', - 'enabled') - - -def disable_mediawiki_public_registrations(browser): - """Enable public registrations in MediaWiki.""" - interface.nav_to_module(browser, 'mediawiki') - _change_status(browser, 'mediawiki', 'id_enable_public_registrations', - 'disabled') - - -def enable_mediawiki_private_mode(browser): - """Enable public registrations in MediaWiki.""" - interface.nav_to_module(browser, 'mediawiki') - _change_status(browser, 'mediawiki', 'id_enable_private_mode', 'enabled') - - -def disable_mediawiki_private_mode(browser): - """Enable public registrations in MediaWiki.""" - interface.nav_to_module(browser, 'mediawiki') - _change_status(browser, 'mediawiki', 'id_enable_private_mode', 'disabled') - - -def set_mediawiki_admin_password(browser, password): - """Set a password for the MediaWiki user called admin.""" - interface.nav_to_module(browser, 'mediawiki') - browser.find_by_id('id_password').fill(password) - interface.submit(browser, form_class='form-configuration') - - -def enable_ejabberd_message_archive_management(browser): - """Enable Message Archive Management in Ejabberd.""" - interface.nav_to_module(browser, 'ejabberd') - _change_status(browser, 'ejabberd', 'id_MAM_enabled', 'enabled') - - -def disable_ejabberd_message_archive_management(browser): - """Enable Message Archive Management in Ejabberd.""" - interface.nav_to_module(browser, 'ejabberd') - _change_status(browser, 'ejabberd', 'id_MAM_enabled', 'disabled') - - -def ejabberd_add_contact(browser): - """Add a contact to Ejabberd user's roster.""" - site.jsxc_add_contact(browser) - - -def ejabberd_delete_contact(browser): - """Delete the contact from Ejabberd user's roster.""" - site.jsxc_delete_contact(browser) - - -def ejabberd_has_contact(browser): - """Check whether the contact is in Ejabberd user's roster.""" - return eventually(site.jsxc_has_contact, [browser]) - - -def gitweb_create_repo(browser, repo, access=None, ok_if_exists=False): - """Create repository.""" - if not gitweb_repo_exists(browser, repo, access): - gitweb_delete_repo(browser, repo, ignore_missing=True) - browser.find_link_by_href('/plinth/apps/gitweb/create/').first.click() - browser.find_by_id('id_gitweb-name').fill(repo) - if access == 'private': - browser.find_by_id('id_gitweb-is_private').check() - elif access == 'public': - browser.find_by_id('id_gitweb-is_private').uncheck() - submit(browser) - elif not ok_if_exists: - assert False, 'Repo already exists.' - - -def gitweb_delete_repo(browser, repo, ignore_missing=False): - """Delete repository.""" - interface.nav_to_module(browser, 'gitweb') - delete_link = browser.find_link_by_href( - '/plinth/apps/gitweb/{}/delete/'.format(repo)) - if delete_link or not ignore_missing: - delete_link.first.click() - submit(browser) - - -def gitweb_edit_repo_metadata(browser, repo, metadata): - """Set repository metadata.""" - interface.nav_to_module(browser, 'gitweb') - browser.find_link_by_href( - '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() - if 'name' in metadata: - browser.find_by_id('id_gitweb-name').fill(metadata['name']) - if 'description' in metadata: - browser.find_by_id('id_gitweb-description').fill( - metadata['description']) - if 'owner' in metadata: - browser.find_by_id('id_gitweb-owner').fill(metadata['owner']) - if 'access' in metadata: - if metadata['access'] == 'private': - browser.find_by_id('id_gitweb-is_private').check() - else: - browser.find_by_id('id_gitweb-is_private').uncheck() - submit(browser) - - -def gitweb_get_repo_metadata(browser, repo): - """Get repository metadata.""" - interface.nav_to_module(browser, 'gitweb') - browser.find_link_by_href( - '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() - metadata = {} - for item in ['name', 'description', 'owner']: - metadata[item] = browser.find_by_id('id_gitweb-' + item).value - if browser.find_by_id('id_gitweb-is_private').value: - metadata['access'] = 'private' - else: - metadata['access'] = 'public' - return metadata - - -def _gitweb_get_repo_url(repo, with_auth): - """"Get repository URL""" - scheme = 'http' - if default_url.startswith('https://'): - scheme = 'https' - url = default_url.split('://')[1] if '://' in default_url else default_url - password = 'gitweb_wrong_password' - if with_auth: - password = config['DEFAULT']['password'] - - return '{0}://{1}:{2}@{3}/gitweb/{4}'.format(scheme, - config['DEFAULT']['username'], - password, url, repo) - - -@contextlib.contextmanager -def _gitweb_temp_directory(): - """Create temporary directory""" - name = tempfile.mkdtemp(prefix='plinth_test_gitweb_') - yield name - shutil.rmtree(name) - - -def _gitweb_git_command_is_successful(command, cwd): - """Check if a command runs successfully or gives authentication error""" - process = subprocess.run(command, capture_output=True, cwd=cwd) - if process.returncode != 0: - if 'Authentication failed' in process.stderr.decode(): - return False - print(process.stdout.decode()) - # raise exception - process.check_returncode() - return True - - -def gitweb_repo_exists(browser, repo, access=None): - """Check whether the repository exists.""" - interface.nav_to_module(browser, 'gitweb') - links_found = browser.find_link_by_href('/gitweb/{}.git'.format(repo)) - access_matches = True - if links_found and access: - parent = links_found.first.find_by_xpath('..').first - private_icon = parent.find_by_css('.repo-private-icon') - if access == 'private': - access_matches = True if private_icon else False - if access == 'public': - access_matches = True if not private_icon else False - return bool(links_found) and access_matches - - -def gitweb_repo_is_readable(repo, with_auth=False, url_git_extension=False): - """Check if a git repo is readable with git client.""" - url = _gitweb_get_repo_url(repo, with_auth) - if url_git_extension: - url = url + '.git' - git_command = ['git', 'clone', '-c', 'http.sslverify=false', url] - with _gitweb_temp_directory() as cwd: - return _gitweb_git_command_is_successful(git_command, cwd) - - -def gitweb_repo_is_writable(repo, with_auth=False, url_git_extension=False): - """Check if a git repo is writable with git client.""" - url = _gitweb_get_repo_url(repo, with_auth) - if url_git_extension: - url = url + '.git' - - with _gitweb_temp_directory() as cwd: - subprocess.run(['mkdir', 'test-project'], check=True, cwd=cwd) - cwd = os.path.join(cwd, 'test-project') - prepare_git_repo_commands = [ - 'git init -q', 'git config http.sslVerify false', - 'git -c "user.name=Tester" -c "user.email=tester" ' - 'commit -q --allow-empty -m "test"' - ] - for command in prepare_git_repo_commands: - subprocess.run(command, shell=True, check=True, cwd=cwd) - git_push_command = ['git', 'push', '-qf', url, 'master'] - - return _gitweb_git_command_is_successful(git_push_command, cwd) - - -def gitweb_set_repo_access(browser, repo, access): - """Set repository as public or private.""" - interface.nav_to_module(browser, 'gitweb') - browser.find_link_by_href( - '/plinth/apps/gitweb/{}/edit/'.format(repo)).first.click() - if access == 'private': - browser.find_by_id('id_gitweb-is_private').check() - else: - browser.find_by_id('id_gitweb-is_private').uncheck() - submit(browser) - - -def gitweb_set_all_repos_private(browser): - """Set all repositories private""" - interface.nav_to_module(browser, 'gitweb') - public_repos = [] - for element in browser.find_by_css('#gitweb-repo-list .list-group-item'): - if not element.find_by_css('.repo-private-icon'): - repo = element.find_by_css('.repo-label').first.text - public_repos.append(repo) - for repo in public_repos: - gitweb_set_repo_access(browser, repo, 'private') - - -def gitweb_site_repo_exists(browser, repo): - """Check whether the repository exists on Gitweb site.""" - browser.visit('{}/gitweb'.format(default_url)) - return browser.find_by_css('a[href="/gitweb/{0}.git"]'.format(repo)) - - -def ikiwiki_create_wiki_if_needed(browser): - """Create wiki if it does not exist.""" - interface.nav_to_module(browser, 'ikiwiki') - wiki = browser.find_link_by_href('/ikiwiki/wiki') - if not wiki: - browser.find_link_by_href('/plinth/apps/ikiwiki/create/').first.click() - browser.find_by_id('id_ikiwiki-name').fill('wiki') - browser.find_by_id('id_ikiwiki-admin_name').fill( - config['DEFAULT']['username']) - browser.find_by_id('id_ikiwiki-admin_password').fill( - config['DEFAULT']['password']) - submit(browser) - - -def ikiwiki_delete_wiki(browser): - """Delete wiki.""" - interface.nav_to_module(browser, 'ikiwiki') - browser.find_link_by_href( - '/plinth/apps/ikiwiki/wiki/delete/').first.click() - submit(browser) - - -def ikiwiki_wiki_exists(browser): - """Check whether the wiki exists.""" - interface.nav_to_module(browser, 'ikiwiki') - wiki = browser.find_link_by_href('/ikiwiki/wiki') - return bool(wiki) - - -def time_zone_set(browser, time_zone): - """Set the system time zone.""" - interface.nav_to_module(browser, 'datetime') - browser.select('time_zone', time_zone) - interface.submit(browser, form_class='form-configuration') - - -def time_zone_get(browser): - """Set the system time zone.""" - interface.nav_to_module(browser, 'datetime') - return browser.find_by_name('time_zone').first.value - - -_TOR_FEATURE_TO_ELEMENT = { - 'relay': 'tor-relay_enabled', - 'bridge-relay': 'tor-bridge_relay_enabled', - 'hidden-services': 'tor-hs_enabled', - 'software': 'tor-apt_transport_tor_enabled' -} - - -def tor_feature_enable(browser, feature, should_enable): - """Enable/disable a Tor feature.""" - if not isinstance(should_enable, bool): - should_enable = should_enable in ('enable', 'enabled') - - element_name = _TOR_FEATURE_TO_ELEMENT[feature] - interface.nav_to_module(browser, 'tor') - checkbox_element = browser.find_by_name(element_name).first - if should_enable == checkbox_element.checked: - return - - if should_enable: - if feature == 'bridge-relay': - browser.find_by_name('tor-relay_enabled').first.check() - - checkbox_element.check() - else: - checkbox_element.uncheck() - - interface.submit(browser, form_class='form-configuration') - wait_for_config_update(browser, 'tor') - - -def tor_assert_feature_enabled(browser, feature, enabled): - """Assert whether Tor relay is enabled or disabled.""" - if not isinstance(enabled, bool): - enabled = enabled in ('enable', 'enabled') - - element_name = _TOR_FEATURE_TO_ELEMENT[feature] - interface.nav_to_module(browser, 'tor') - assert browser.find_by_name(element_name).first.checked == enabled - - -def tor_get_relay_ports(browser): - """Return the list of ports shown in the relay table.""" - interface.nav_to_module(browser, 'tor') - return [ - port_name.text - for port_name in browser.find_by_css('.tor-relay-port-name') - ] - - -def tor_assert_hidden_services(browser): - """Assert that hidden service information is shown.""" - interface.nav_to_module(browser, 'tor') - assert browser.find_by_css('.tor-hs .tor-hs-hostname') - - -def tahoe_get_introducer(browser, domain, introducer_type): - """Return an introducer element with a given type from tahoe-lafs.""" - interface.nav_to_module(browser, 'tahoe') - css_class = '.{}-introducers .introducer-furl'.format(introducer_type) - for furl in browser.find_by_css(css_class): - if domain in furl.text: - return furl.parent - - return None - - -def tahoe_add_introducer(browser, domain): - """Add a new introducer into tahoe-lafs.""" - interface.nav_to_module(browser, 'tahoe') - - furl = 'pb://ewe4zdz6kxn7xhuvc7izj2da2gpbgeir@tcp:{}:3456/' \ - 'fko4ivfwgqvybppwar3uehkx6spaaou7'.format(domain) - browser.fill('pet_name', 'testintroducer') - browser.fill('furl', furl) - submit(browser, form_class='form-add-introducer') - - -def tahoe_remove_introducer(browser, domain): - """Remove an introducer from tahoe-lafs.""" - introducer = tahoe_get_introducer(browser, domain, 'connected') - submit(browser, element=introducer.find_by_css('.form-remove')) - - -def radicale_get_access_rights(browser): - access_rights_types = ['owner_only', 'owner_write', 'authenticated'] - interface.nav_to_module(browser, 'radicale') - for access_rights_type in access_rights_types: - if browser.find_by_value(access_rights_type).checked: - return access_rights_type - - -def radicale_set_access_rights(browser, access_rights_type): - interface.nav_to_module(browser, 'radicale') - browser.choose('access_rights', access_rights_type) - interface.submit(browser, form_class='form-configuration') - - -def openvpn_setup(browser): - """Setup the OpenVPN application after installation.""" - interface.nav_to_module(browser, 'openvpn') - setup_form = browser.find_by_css('.form-setup') - if not setup_form: - return - - submit(browser, form_class='form-setup') - wait_for_config_update(browser, 'openvpn') - - -def openvpn_download_profile(browser): - """Download the current user's profile into a file and return path.""" - interface.nav_to_module(browser, 'openvpn') - url = browser.find_by_css('.form-profile')['action'] - return _download_file(browser, url) - - -def samba_set_share(browser, share_type, status='enabled'): - """Enable or disable samba share.""" - disk_name = 'disk' - share_type_name = '{0}_share'.format(share_type) - interface.nav_to_module(browser, 'samba') - for elem in browser.find_by_tag('td'): - if elem.text == disk_name: - share_form = elem.find_by_xpath('(..//*)[2]/form').first - share_btn = share_form.find_by_name(share_type_name).first - if status == 'enabled' and share_btn['value'] == 'enable': - share_btn.click() - elif status == 'disabled' and share_btn['value'] == 'disable': - share_btn.click() - break - - -def _samba_write_to_share(share_type, as_guest=False): - """Write to the samba share, return output messages as string.""" - disk_name = 'disk' - if share_type == 'open': - share_name = disk_name - else: - share_name = '{0}_{1}'.format(disk_name, share_type) - hostname = urllib.parse.urlparse(default_url).hostname - servicename = '\\\\{0}\\{1}'.format(hostname, share_name) - directory = '_plinth-test_{0}'.format(''.join( - random.SystemRandom().choices(string.ascii_letters, k=8))) - port = config['DEFAULT']['samba_port'] - - smb_command = ['smbclient', '-W', 'WORKGROUP', '-p', port] - if as_guest: - smb_command += ['-N'] - else: - smb_command += [ - '-U', '{0}%{1}'.format(config['DEFAULT']['username'], - config['DEFAULT']['password']) - ] - smb_command += [ - servicename, '-c', 'mkdir {0}; rmdir {0}'.format(directory) - ] - - return subprocess.check_output(smb_command).decode() - - -def samba_assert_share_is_writable(share_type, as_guest=False): - """Assert that samba share is writable.""" - output = _samba_write_to_share(share_type, as_guest=False) - - assert not output, output - - -def samba_assert_share_is_not_accessible(share_type, as_guest=False): - """Assert that samba share is not accessible.""" - try: - _samba_write_to_share(share_type, as_guest) - except subprocess.CalledProcessError as err: - err_output = err.output.decode() - assert 'NT_STATUS_ACCESS_DENIED' in err_output, err_output - else: - assert False, 'Can access the share.' - - -def samba_assert_share_is_not_available(share_type): - """Assert that samba share is not accessible.""" - try: - _samba_write_to_share(share_type) - except subprocess.CalledProcessError as err: - err_output = err.output.decode() - assert 'NT_STATUS_BAD_NETWORK_NAME' in err_output, err_output - else: - assert False, 'Can access the share.' - - -def searx_enable_public_access(browser): - """Enable Public Access in SearX""" - interface.nav_to_module(browser, 'searx') - browser.find_by_id('id_public_access').check() - interface.submit(browser, form_class='form-configuration') - - -def searx_disable_public_access(browser): - """Enable Public Access in SearX""" - interface.nav_to_module(browser, 'searx') - browser.find_by_id('id_public_access').uncheck() - interface.submit(browser, form_class='form-configuration') - - -def find_on_front_page(browser, app_name): - browser.visit(default_url) - shortcuts = browser.find_link_by_href(f'/{app_name}/') - return shortcuts diff --git a/plinth/tests/functional/support/interface.py b/plinth/tests/functional/support/interface.py deleted file mode 100644 index 5e9f43339..000000000 --- a/plinth/tests/functional/support/interface.py +++ /dev/null @@ -1,150 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import logging -import random -import tempfile - -import requests - -from . import config -from .service import wait_for_page_update - -sys_modules = [ - 'avahi', 'backups', 'bind', 'cockpit', 'config', 'datetime', 'diagnostics', - 'dynamicdns', 'firewall', 'letsencrypt', 'monkeysphere', 'names', - 'networks', 'pagekite', 'performance', 'power', 'security', 'snapshot', - 'ssh', 'storage', 'upgrades', 'users' -] - -default_url = config['DEFAULT']['url'] - - -def login(browser, url, username, password): - - # XXX: Find a way to remove the hardcoded jsxc URL - if '/plinth/' not in browser.url or '/jsxc/jsxc' in browser.url: - browser.visit(url) - - apps_link = browser.find_link_by_href('/plinth/apps/') - if len(apps_link): - return - - login_button = browser.find_link_by_href('/plinth/accounts/login/') - if login_button: - login_button.first.click() - if login_button: - browser.fill('username', username) - browser.fill('password', password) - submit(browser) - else: - browser.visit(default_url + '/plinth/firstboot/welcome') - submit(browser) # click the "Start Setup" button - create_admin_account(browser, username, password) - if '/network-topology-first-boot' in browser.url: - submit(browser, element=browser.find_by_name('skip')[0]) - - if '/internet-connection-type' in browser.url: - submit(browser, element=browser.find_by_name('skip')[0]) - - -def is_login_prompt(browser): - return all( - [browser.find_by_id('id_username'), - browser.find_by_id('id_password')]) - - -def nav_to_module(browser, module): - sys_or_apps = 'sys' if module in sys_modules else 'apps' - required_url = default_url + f'/plinth/{sys_or_apps}/{module}/' - if browser.url != required_url: - browser.visit(required_url) - - -def create_user(browser, name, password): - nav_to_module(browser, 'users') - with wait_for_page_update(browser): - browser.find_link_by_href('/plinth/sys/users/create/').first.click() - browser.find_by_id('id_username').fill(name) - browser.find_by_id('id_password1').fill(password) - browser.find_by_id('id_password2').fill(password) - submit(browser) - - -def rename_user(browser, old_name, new_name): - nav_to_module(browser, 'users') - with wait_for_page_update(browser): - browser.find_link_by_href('/plinth/sys/users/' + old_name + - '/edit/').first.click() - browser.find_by_id('id_username').fill(new_name) - submit(browser) - - -def delete_user(browser, name): - nav_to_module(browser, 'users') - delete_link = browser.find_link_by_href('/plinth/sys/users/' + name + - '/delete/') - if delete_link: - with wait_for_page_update(browser): - delete_link.first.click() - submit(browser) - - -def is_user(browser, name): - nav_to_module(browser, 'users') - edit_link = browser.find_link_by_href('/plinth/sys/users/' + name + - '/edit/') - return bool(edit_link) - - -def create_admin_account(browser, username, password): - browser.find_by_id('id_username').fill(username) - browser.find_by_id('id_password1').fill(password) - browser.find_by_id('id_password2').fill(password) - submit(browser) - - -def submit(browser, element=None, form_class=None, expected_url=None): - with wait_for_page_update(browser, expected_url=expected_url): - if element: - element.click() - elif form_class: - browser.find_by_css( - '.{} input[type=submit]'.format(form_class)).click() - else: - browser.find_by_css('input[type=submit]').click() - - -def create_sample_local_file(): - """Create a sample file for upload using browser.""" - contents = bytearray(random.getrandbits(8) for _ in range(64)) - with tempfile.NamedTemporaryFile(delete=False) as temp_file: - temp_file.write(contents) - - return temp_file.name, contents - - -def download_file(url): - """Download a file to disk given a URL.""" - with tempfile.NamedTemporaryFile(delete=False) as temp_file: - logging.captureWarnings(True) - request = requests.get(url, verify=False) - logging.captureWarnings(False) - temp_file.write(request.content) - - return temp_file.name - - -def compare_files(file1, file2): - """Assert that the contents of two files are the same.""" - file1_contents = open(file1, 'rb').read() - file2_contents = open(file2, 'rb').read() - - assert file1_contents == file2_contents - - -def go_to_status_logs(browser): - browser.visit(default_url + '/plinth/help/status-log/') - - -def are_status_logs_shown(browser): - return browser.is_text_present('Logs begin') diff --git a/plinth/tests/functional/support/service.py b/plinth/tests/functional/support/service.py deleted file mode 100644 index 02b5d83b8..000000000 --- a/plinth/tests/functional/support/service.py +++ /dev/null @@ -1,79 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import time -from contextlib import contextmanager - -from selenium.common.exceptions import StaleElementReferenceException -from selenium.webdriver.support.ui import WebDriverWait - -from . import interface - -# unlisted services just use the service_name as module name -service_module = { - 'ntp': 'datetime', -} - - -def get_service_module(service_name): - module = service_name - if service_name in service_module: - module = service_module[service_name] - return module - - -def is_running(browser, service_name): - interface.nav_to_module(browser, get_service_module(service_name)) - return len(browser.find_by_id('service-not-running')) == 0 - - -def is_not_running(browser, service_name): - interface.nav_to_module(browser, get_service_module(service_name)) - return len(browser.find_by_id('service-not-running')) != 0 - - -def eventually(function, args=[], timeout=30): - """Execute a function returning a boolean expression till it returns - True or a timeout is reached""" - end_time = time.time() + timeout - current_time = time.time() - while current_time < end_time: - if function(*args): - return True - - time.sleep(0.1) - current_time = time.time() - - return False - - -@contextmanager -def wait_for_page_update(browser, timeout=300, expected_url=None): - page_body = browser.find_by_tag('body').first - yield - WebDriverWait(browser, timeout).until(page_loaded(page_body, expected_url)) - - -class page_loaded(): - """ - Wait until a page (re)loaded. - - - element: Wait until this element gets stale - - expected_url (optional): Wait for the URL to become . - This can be necessary to wait for a redirect to finish. - """ - - def __init__(self, element, expected_url=None): - self.element = element - self.expected_url = expected_url - - def __call__(self, driver): - is_stale = False - try: - self.element.has_class('whatever_class') - except StaleElementReferenceException: - if self.expected_url is None: - is_stale = True - else: - if driver.url.endswith(self.expected_url): - is_stale = True - return is_stale diff --git a/plinth/tests/functional/support/site.py b/plinth/tests/functional/support/site.py deleted file mode 100644 index bd8ec80fc..000000000 --- a/plinth/tests/functional/support/site.py +++ /dev/null @@ -1,589 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import logging -import os -import pathlib -import time - -import requests -from selenium.webdriver.common.action_chains import ActionChains -from selenium.webdriver.common.keys import Keys - -from . import application, config, interface, system -from .service import eventually, wait_for_page_update - -# unlisted sites just use '/' + site_name as url -site_url = { - 'wiki': '/ikiwiki', - 'jsxc': '/plinth/apps/jsxc/jsxc/', - 'cockpit': '/_cockpit/', - 'syncthing': '/syncthing/', -} - - -def get_site_url(site_name): - if site_name.startswith('share'): - site_name = site_name.replace('_', '/') - url = '/' + site_name - if site_name in site_url: - url = site_url[site_name] - return url - - -def is_available(browser, site_name): - url_to_visit = config['DEFAULT']['url'] + get_site_url(site_name) - browser.visit(url_to_visit) - time.sleep(3) - browser.reload() - not_404 = '404' not in browser.title - # The site might have a default path after the sitename, - # e.g /mediawiki/Main_Page - no_redirect = browser.url.startswith(url_to_visit.strip('/')) - return not_404 and no_redirect - - -def access_url(browser, site_name): - browser.visit(config['DEFAULT']['url'] + get_site_url(site_name)) - - -def verify_coquelicot_upload_password(browser, password): - browser.visit(config['DEFAULT']['url'] + '/coquelicot') - # ensure the password form is scrolled into view - browser.execute_script('window.scrollTo(100, 0)') - browser.find_by_id('upload_password').fill(password) - actions = ActionChains(browser.driver) - actions.send_keys(Keys.RETURN) - actions.perform() - assert eventually(browser.is_element_present_by_css, - args=['div[style*="display: none;"]']) - - -def upload_file_to_coquelicot(browser, file_path, password): - """Upload a local file from disk to coquelicot.""" - verify_coquelicot_upload_password(browser, password) - browser.attach_file('file', file_path) - interface.submit(browser) - assert eventually(browser.is_element_present_by_css, - args=['#content .url']) - url_textarea = browser.find_by_css('#content .url textarea').first - return url_textarea.value - - -def verify_mediawiki_create_account_link(browser): - browser.visit(config['DEFAULT']['url'] + - '/mediawiki/index.php/Special:CreateAccount') - assert eventually(browser.is_element_present_by_id, - args=['wpCreateaccount']) - - -def verify_mediawiki_no_create_account_link(browser): - browser.visit(config['DEFAULT']['url'] + - '/mediawiki/index.php/Special:CreateAccount') - assert eventually(browser.is_element_not_present_by_id, - args=['wpCreateaccount']) - - -def verify_mediawiki_anonymous_reads_edits_link(browser): - browser.visit(config['DEFAULT']['url'] + '/mediawiki') - assert eventually(browser.is_element_present_by_id, args=['ca-nstab-main']) - - -def verify_mediawiki_no_anonymous_reads_edits_link(browser): - browser.visit(config['DEFAULT']['url'] + '/mediawiki') - assert eventually(browser.is_element_not_present_by_id, - args=['ca-nstab-main']) - assert eventually(browser.is_element_present_by_id, - args=['ca-nstab-special']) - - -def _login_to_mediawiki(browser, username, password): - browser.visit(config['DEFAULT']['url'] + - '/mediawiki/index.php?title=Special:Login') - browser.find_by_id('wpName1').fill(username) - browser.find_by_id('wpPassword1').fill(password) - with wait_for_page_update(browser): - browser.find_by_id('wpLoginAttempt').click() - - -def login_to_mediawiki_with_credentials(browser, username, password): - _login_to_mediawiki(browser, username, password) - # Had to put it in the same step because sessions don't - # persist between steps - assert eventually(browser.is_element_present_by_id, args=['t-upload']) - - -def upload_image_mediawiki(browser, username, password, image): - """Upload an image to MediaWiki. Idempotent.""" - browser.visit(config['DEFAULT']['url'] + '/mediawiki') - _login_to_mediawiki(browser, username, password) - - # Upload file - browser.visit(config['DEFAULT']['url'] + '/mediawiki/Special:Upload') - file_path = pathlib.Path(__file__).parent - file_path /= '../../static/themes/default/img/' + image - browser.attach_file('wpUploadFile', str(file_path.resolve())) - interface.submit(browser, element=browser.find_by_name('wpUpload')[0]) - - -def get_number_of_uploaded_images_in_mediawiki(browser): - browser.visit(config['DEFAULT']['url'] + '/mediawiki/Special:ListFiles') - return len(browser.find_by_css('.TablePager_col_img_timestamp')) - - -def get_uploaded_image_in_mediawiki(browser, image): - browser.visit(config['DEFAULT']['url'] + '/mediawiki/Special:ListFiles') - elements = browser.find_link_by_partial_href(image) - return elements[0].value - - -def mediawiki_delete_main_page(browser): - """Delete the mediawiki main page.""" - _login_to_mediawiki(browser, 'admin', 'whatever123') - browser.visit( - '{}/mediawiki/index.php?title=Main_Page&action=delete'.format( - interface.default_url)) - with wait_for_page_update(browser): - browser.find_by_id('wpConfirmB').first.click() - - -def mediawiki_has_main_page(browser): - """Check if mediawiki main page exists.""" - return eventually(_mediawiki_has_main_page, [browser]) - - -def _mediawiki_has_main_page(browser): - """Check if mediawiki main page exists.""" - browser.visit('{}/mediawiki/Main_Page'.format(interface.default_url)) - content = browser.find_by_id('mw-content-text').first - return 'This page has been deleted.' not in content.text - - -def jsxc_login(browser): - """Login to JSXC.""" - access_url(browser, 'jsxc') - browser.find_by_id('jsxc-username').fill(config['DEFAULT']['username']) - browser.find_by_id('jsxc-password').fill(config['DEFAULT']['password']) - browser.find_by_id('jsxc-submit').click() - relogin = browser.find_by_text('relogin') - if relogin: - relogin.first.click() - browser.find_by_id('jsxc_username').fill(config['DEFAULT']['username']) - browser.find_by_id('jsxc_password').fill(config['DEFAULT']['password']) - browser.find_by_text('Connect').first.click() - - -def jsxc_add_contact(browser): - """Add a contact to JSXC user's roster.""" - system.set_domain_name(browser, 'localhost') - application.install(browser, 'jsxc') - jsxc_login(browser) - new = browser.find_by_text('new contact') - if new: # roster is empty - new.first.click() - browser.find_by_id('jsxc_username').fill('alice@localhost') - browser.find_by_text('Add').first.click() - - -def jsxc_delete_contact(browser): - """Delete the contact from JSXC user's roster.""" - jsxc_login(browser) - browser.find_by_css('div.jsxc_more').first.click() - browser.find_by_text('delete contact').first.click() - browser.find_by_text('Remove').first.click() - - -def jsxc_has_contact(browser): - """Check whether the contact is in JSXC user's roster.""" - jsxc_login(browser) - contact = browser.find_by_text('alice@localhost') - return bool(contact) - - -def _mldonkey_submit_command(browser, command): - """Submit a command to mldonkey.""" - with browser.get_iframe('commands') as commands_frame: - commands_frame.find_by_css('.txt2').fill(command) - commands_frame.find_by_css('.but2').click() - - -def mldonkey_remove_all_ed2k_files(browser): - """Remove all ed2k files from mldonkey.""" - browser.visit(config['DEFAULT']['url'] + '/mldonkey/') - _mldonkey_submit_command(browser, 'cancel all') - _mldonkey_submit_command(browser, 'confirm yes') - - -def mldonkey_upload_sample_ed2k_file(browser): - """Upload a sample ed2k file into mldonkey.""" - browser.visit(config['DEFAULT']['url'] + '/mldonkey/') - dllink_command = 'dllink ed2k://|file|foo.bar|123|' \ - '0123456789ABCDEF0123456789ABCDEF|/' - _mldonkey_submit_command(browser, dllink_command) - - -def mldonkey_get_number_of_ed2k_files(browser): - """Return the number of ed2k files currently in mldonkey.""" - browser.visit(config['DEFAULT']['url'] + '/mldonkey/') - - with browser.get_iframe('commands') as commands_frame: - commands_frame.find_by_xpath( - '//tr//td[contains(text(), "Transfers")]').click() - - with browser.get_iframe('output') as output_frame: - return len(output_frame.find_by_css('.dl-1')) + len( - output_frame.find_by_css('.dl-2')) - - -def transmission_remove_all_torrents(browser): - """Remove all torrents from transmission.""" - browser.visit(config['DEFAULT']['url'] + '/transmission') - while True: - torrents = browser.find_by_css('#torrent_list .torrent') - if not torrents: - break - - torrents.first.click() - eventually(browser.is_element_not_present_by_css, - args=['#toolbar-remove.disabled']) - browser.click_link_by_id('toolbar-remove') - eventually(browser.is_element_not_present_by_css, - args=['#dialog-container[style="display: none;"]']) - browser.click_link_by_id('dialog_confirm_button') - eventually(browser.is_element_present_by_css, - args=['#toolbar-remove.disabled']) - - -def transmission_upload_sample_torrent(browser): - """Upload a sample torrent into transmission.""" - browser.visit(config['DEFAULT']['url'] + '/transmission') - file_path = os.path.join(os.path.dirname(__file__), '..', 'data', - 'sample.torrent') - browser.click_link_by_id('toolbar-open') - eventually(browser.is_element_not_present_by_css, - args=['#upload-container[style="display: none;"]']) - browser.attach_file('torrent_files[]', [file_path]) - browser.click_link_by_id('upload_confirm_button') - eventually(browser.is_element_present_by_css, - args=['#torrent_list .torrent']) - - -def transmission_get_number_of_torrents(browser): - """Return the number torrents currently in transmission.""" - browser.visit(config['DEFAULT']['url'] + '/transmission') - return len(browser.find_by_css('#torrent_list .torrent')) - - -def _deluge_get_active_window_title(browser): - """Return the title of the currently active window in Deluge.""" - return browser.evaluate_script( - 'Ext.WindowMgr.getActive() ? Ext.WindowMgr.getActive().title : null') - - -def _deluge_ensure_logged_in(browser): - """Ensure that password dialog is answered and we can interact.""" - url = config['DEFAULT']['url'] + '/deluge' - - def service_is_available(): - if browser.is_element_present_by_xpath( - '//h1[text()="Service Unavailable"]'): - access_url(browser, 'deluge') - return False - - return True - - if browser.url != url: - browser.visit(url) - # After a backup restore, service may not be available immediately - eventually(service_is_available) - - time.sleep(1) # Wait for Ext.js application in initialize - - if _deluge_get_active_window_title(browser) != 'Login': - return - - browser.find_by_id('_password').first.fill('deluge') - _deluge_click_active_window_button(browser, 'Login') - - assert eventually( - lambda: _deluge_get_active_window_title(browser) != 'Login') - eventually(browser.is_element_not_present_by_css, - args=['#add.x-item-disabled'], timeout=0.3) - - -def _deluge_open_connection_manager(browser): - """Open the connection manager dialog if not already open.""" - title = 'Connection Manager' - if _deluge_get_active_window_title(browser) == title: - return - - browser.find_by_css('button.x-deluge-connection-manager').first.click() - eventually(lambda: _deluge_get_active_window_title(browser) == title) - - -def _deluge_ensure_connected(browser): - """Type the connection password if required and start Deluge daemon.""" - _deluge_ensure_logged_in(browser) - - # Change Default Password window appears once. - if _deluge_get_active_window_title(browser) == 'Change Default Password': - _deluge_click_active_window_button(browser, 'No') - - assert eventually(browser.is_element_not_present_by_css, - args=['#add.x-item-disabled']) - - -def deluge_remove_all_torrents(browser): - """Remove all torrents from deluge.""" - _deluge_ensure_connected(browser) - - while browser.find_by_css('#torrentGrid .torrent-name'): - browser.find_by_css('#torrentGrid .torrent-name').first.click() - - # Click remove toolbar button - browser.find_by_id('remove').first.click() - - # Remove window shows up - assert eventually(lambda: _deluge_get_active_window_title(browser) == - 'Remove Torrent') - - _deluge_click_active_window_button(browser, 'Remove With Data') - - # Remove window disappears - assert eventually(lambda: not _deluge_get_active_window_title(browser)) - - -def _deluge_get_active_window_id(browser): - """Return the ID of the currently active window.""" - return browser.evaluate_script('Ext.WindowMgr.getActive().id') - - -def _deluge_click_active_window_button(browser, button_text): - """Click an action button in the active window.""" - browser.execute_script(''' - active_window = Ext.WindowMgr.getActive(); - active_window.buttons.forEach(function (button) {{ - if (button.text == "{button_text}") - button.btnEl.dom.click() - }})'''.format(button_text=button_text)) - - -def deluge_upload_sample_torrent(browser): - """Upload a sample torrent into deluge.""" - _deluge_ensure_connected(browser) - - number_of_torrents = _deluge_get_number_of_torrents(browser) - - # Click add toolbar button - browser.find_by_id('add').first.click() - - # Add window appears - eventually( - lambda: _deluge_get_active_window_title(browser) == 'Add Torrents') - - file_path = os.path.join(os.path.dirname(__file__), '..', 'data', - 'sample.torrent') - - if browser.find_by_id('fileUploadForm'): # deluge-web 2.x - browser.attach_file('file', file_path) - else: # deluge-web 1.x - browser.find_by_css('button.x-deluge-add-file').first.click() - - # Add from file window appears - eventually(lambda: _deluge_get_active_window_title(browser) == - 'Add from File') - - # Attach file - browser.attach_file('file', file_path) - - # Click Add - _deluge_click_active_window_button(browser, 'Add') - - eventually( - lambda: _deluge_get_active_window_title(browser) == 'Add Torrents') - - # Click Add - time.sleep(1) - _deluge_click_active_window_button(browser, 'Add') - - eventually( - lambda: _deluge_get_number_of_torrents(browser) > number_of_torrents) - - -def _deluge_get_number_of_torrents(browser): - """Return the number torrents currently in deluge.""" - return len(browser.find_by_css('#torrentGrid .torrent-name')) - - -def deluge_get_number_of_torrents(browser): - """Return the number torrents currently in deluge.""" - _deluge_ensure_connected(browser) - - return _deluge_get_number_of_torrents(browser) - - -def calendar_is_available(browser): - """Return whether calendar is available at well-known URL.""" - conf = config['DEFAULT'] - url = conf['url'] + '/.well-known/caldav' - logging.captureWarnings(True) - request = requests.get(url, auth=(conf['username'], conf['password']), - verify=False) - logging.captureWarnings(False) - return request.status_code != 404 - - -def addressbook_is_available(browser): - """Return whether addressbook is available at well-known URL.""" - conf = config['DEFAULT'] - url = conf['url'] + '/.well-known/carddav' - logging.captureWarnings(True) - request = requests.get(url, auth=(conf['username'], conf['password']), - verify=False) - logging.captureWarnings(False) - return request.status_code != 404 - - -def _syncthing_load_main_interface(browser): - """Close the dialog boxes that many popup after visiting the URL.""" - access_url(browser, 'syncthing') - - def service_is_available(): - if browser.is_element_present_by_xpath( - '//h1[text()="Service Unavailable"]'): - access_url(browser, 'syncthing') - return False - - return True - - # After a backup restore, service may not be available immediately - eventually(service_is_available) - - # Wait for javascript loading process to complete - browser.execute_script(''' - document.is_ui_online = false; - var old_console_log = console.log; - console.log = function(message) { - old_console_log.apply(null, arguments); - if (message == 'UIOnline') { - document.is_ui_online = true; - console.log = old_console_log; - } - }; - ''') - eventually(lambda: browser.evaluate_script('document.is_ui_online'), - timeout=5) - - # Dismiss the Usage Reporting consent dialog - usage_reporting = browser.find_by_id('ur').first - eventually(lambda: usage_reporting.visible, timeout=2) - if usage_reporting.visible: - yes_xpath = './/button[contains(@ng-click, "declineUR")]' - usage_reporting.find_by_xpath(yes_xpath).first.click() - eventually(lambda: not usage_reporting.visible) - - -def syncthing_folder_is_present(browser, folder_name): - """Return whether a folder is present in Syncthing.""" - _syncthing_load_main_interface(browser) - folder_names = browser.find_by_css('#folders .panel-title-text span') - folder_names = [folder_name.text for folder_name in folder_names] - return folder_name in folder_names - - -def syncthing_add_folder(browser, folder_name, folder_path): - """Add a new folder to Synthing.""" - _syncthing_load_main_interface(browser) - add_folder_xpath = '//button[contains(@ng-click, "addFolder")]' - browser.find_by_xpath(add_folder_xpath).click() - - folder_dialog = browser.find_by_id('editFolder').first - eventually(lambda: folder_dialog.visible) - browser.find_by_id('folderLabel').fill(folder_name) - browser.find_by_id('folderPath').fill(folder_path) - save_folder_xpath = './/button[contains(@ng-click, "saveFolder")]' - folder_dialog.find_by_xpath(save_folder_xpath).first.click() - eventually(lambda: not folder_dialog.visible) - - -def syncthing_remove_folder(browser, folder_name): - """Remove a folder from Synthing.""" - _syncthing_load_main_interface(browser) - - # Find folder - folder = None - for current_folder in browser.find_by_css('#folders > .panel'): - name = current_folder.find_by_css('.panel-title-text span').first.text - if name == folder_name: - folder = current_folder - break - - # Edit folder button - folder.find_by_css('button.panel-heading').first.click() - eventually(lambda: folder.find_by_css('div.collapse.in')) - edit_folder_xpath = './/button[contains(@ng-click, "editFolder")]' - edit_folder_button = folder.find_by_xpath(edit_folder_xpath).first - edit_folder_button.click() - - # Edit folder dialog - folder_dialog = browser.find_by_id('editFolder').first - eventually(lambda: folder_dialog.visible) - remove_button_xpath = './/button[contains(@data-target, "remove-folder")]' - folder_dialog.find_by_xpath(remove_button_xpath).first.click() - - # Remove confirmation dialog - remove_folder_dialog = browser.find_by_id('remove-folder-confirmation') - eventually(lambda: remove_folder_dialog.visible) - remove_button_xpath = './/button[contains(@ng-click, "deleteFolder")]' - remove_folder_dialog.find_by_xpath(remove_button_xpath).first.click() - - eventually(lambda: not folder_dialog.visible) - - -def _ttrss_load_main_interface(browser): - """Load the TT-RSS interface.""" - access_url(browser, 'tt-rss') - overlay = browser.find_by_id('overlay') - eventually(lambda: not overlay.visible) - - -def _ttrss_is_feed_shown(browser, invert=False): - return browser.is_text_present('Planet Debian') != invert - - -def ttrss_subscribe(browser): - """Subscribe to a feed in TT-RSS.""" - _ttrss_load_main_interface(browser) - browser.find_by_text('Actions...').click() - browser.find_by_text('Subscribe to feed...').click() - browser.find_by_id('feedDlg_feedUrl').fill( - 'https://planet.debian.org/atom.xml') - browser.find_by_text('Subscribe').click() - if browser.is_text_present('You are already subscribed to this feed.'): - browser.find_by_text('Cancel').click() - - expand = browser.find_by_css('span.dijitTreeExpandoClosed') - if expand: - expand.first.click() - - assert eventually(_ttrss_is_feed_shown, [browser]) - - -def ttrss_unsubscribe(browser): - """Unsubscribe from a feed in TT-RSS.""" - _ttrss_load_main_interface(browser) - expand = browser.find_by_css('span.dijitTreeExpandoClosed') - if expand: - expand.first.click() - - browser.find_by_text('Planet Debian').click() - browser.execute_script("quickMenuGo('qmcRemoveFeed')") - prompt = browser.get_alert() - prompt.accept() - - assert eventually(_ttrss_is_feed_shown, [browser, True]) - - -def ttrss_is_subscribed(browser): - """Return whether subscribed to a feed in TT-RSS.""" - _ttrss_load_main_interface(browser) - return browser.is_text_present('Planet Debian') diff --git a/plinth/tests/functional/support/system.py b/plinth/tests/functional/support/system.py deleted file mode 100644 index bd8e3df97..000000000 --- a/plinth/tests/functional/support/system.py +++ /dev/null @@ -1,417 +0,0 @@ -# SPDX-License-Identifier: AGPL-3.0-or-later - -import tempfile -from urllib.parse import urlparse - -import requests - -from . import application, config -from .interface import nav_to_module, submit -from .service import wait_for_page_update - -config_page_title_language_map = { - 'da': 'Generel Konfiguration', - 'de': 'Allgemeine Konfiguration', - 'es': 'Configuración general', - 'fr': 'Configuration générale', - 'nb': 'Generelt oppsett', - 'nl': 'Algemene Instellingen', - 'pl': 'Ustawienia główne', - 'pt': 'Configuração Geral', - 'ru': 'Общие настройки', - 'sv': 'Allmän Konfiguration', - 'te': 'సాధారణ ఆకృతీకరణ', - 'tr': 'Genel Yapılandırma', - 'zh-hans': '常规配置', -} - - -def get_hostname(browser): - nav_to_module(browser, 'config') - return browser.find_by_id('id_hostname').value - - -def set_hostname(browser, hostname): - nav_to_module(browser, 'config') - browser.find_by_id('id_hostname').fill(hostname) - submit(browser) - - -def get_domain_name(browser): - nav_to_module(browser, 'config') - return browser.find_by_id('id_domainname').value - - -def set_domain_name(browser, domain_name): - nav_to_module(browser, 'config') - browser.find_by_id('id_domainname').fill(domain_name) - submit(browser) - - -def set_home_page(browser, home_page): - if 'plinth' not in home_page and 'apache' not in home_page: - home_page = 'shortcut-' + home_page - - nav_to_module(browser, 'config') - drop_down = browser.find_by_id('id_homepage') - drop_down.select(home_page) - submit(browser) - - -def set_advanced_mode(browser, mode): - nav_to_module(browser, 'config') - advanced_mode = browser.find_by_id('id_advanced_mode') - if mode: - advanced_mode.check() - else: - advanced_mode.uncheck() - - submit(browser) - - -def set_language(browser, language_code): - username = config['DEFAULT']['username'] - browser.visit(config['DEFAULT']['url'] + - '/plinth/sys/users/{}/edit/'.format(username)) - browser.find_by_xpath('//select[@id="id_language"]//option[@value="' + - language_code + '"]').first.click() - submit(browser) - - -def check_language(browser, language_code): - nav_to_module(browser, 'config') - return browser.find_by_css('.app-titles').first.find_by_tag( - 'h2').first.value == config_page_title_language_map[language_code] - - -def delete_all_snapshots(browser): - if get_snapshot_count(browser): - browser.find_by_id('select-all').check() - submit(browser, browser.find_by_name('delete_selected')) - - confirm_button = browser.find_by_name('delete_confirm') - if confirm_button: # Only if redirected to confirm page - submit(browser, confirm_button) - - -def create_snapshot(browser): - browser.visit(config['DEFAULT']['url'] + '/plinth/sys/snapshot/manage/') - submit(browser) # Click on 'Create Snapshot' - - -def get_snapshot_count(browser): - browser.visit(config['DEFAULT']['url'] + '/plinth/sys/snapshot/manage/') - # Subtract 1 for table header - return len(browser.find_by_xpath('//tr')) - 1 - - -def snapshot_set_configuration(browser, free_space, timeline_enabled, - software_enabled, hourly, daily, weekly, - monthly, yearly): - """Set the configuration for snapshots.""" - nav_to_module(browser, 'snapshot') - browser.find_by_name('free_space').select(free_space / 100) - browser.find_by_name('enable_timeline_snapshots').select( - 'yes' if timeline_enabled else 'no') - browser.find_by_name('enable_software_snapshots').select( - 'yes' if software_enabled else 'no') - browser.find_by_name('hourly_limit').fill(hourly) - browser.find_by_name('daily_limit').fill(daily) - browser.find_by_name('weekly_limit').fill(weekly) - browser.find_by_name('monthly_limit').fill(monthly) - browser.find_by_name('yearly_limit').fill(yearly) - submit(browser) - - -def snapshot_get_configuration(browser): - """Return the current configuration for snapshots.""" - nav_to_module(browser, 'snapshot') - return (int(float(browser.find_by_name('free_space').value) * 100), - browser.find_by_name('enable_timeline_snapshots').value == 'yes', - browser.find_by_name('enable_software_snapshots').value == 'yes', - int(browser.find_by_name('hourly_limit').value), - int(browser.find_by_name('daily_limit').value), - int(browser.find_by_name('weekly_limit').value), - int(browser.find_by_name('monthly_limit').value), - int(browser.find_by_name('yearly_limit').value)) - - -def check_home_page_redirect(browser, app_name): - browser.visit(config['DEFAULT']['url']) - return browser.find_by_xpath( - "//a[contains(@href, '/plinth/') and @title='FreedomBox']") - - -def dynamicdns_configure(browser): - nav_to_module(browser, 'dynamicdns') - browser.find_link_by_href( - '/plinth/sys/dynamicdns/configure/').first.click() - browser.find_by_id('id_enabled').check() - browser.find_by_id('id_service_type').select('GnuDIP') - browser.find_by_id('id_dynamicdns_server').fill('example.com') - browser.find_by_id('id_dynamicdns_domain').fill('freedombox.example.com') - browser.find_by_id('id_dynamicdns_user').fill('tester') - browser.find_by_id('id_dynamicdns_secret').fill('testingtesting') - browser.find_by_id('id_dynamicdns_ipurl').fill( - 'http://myip.datasystems24.de') - submit(browser) - - -def dynamicdns_has_original_config(browser): - nav_to_module(browser, 'dynamicdns') - browser.find_link_by_href( - '/plinth/sys/dynamicdns/configure/').first.click() - enabled = browser.find_by_id('id_enabled').value - service_type = browser.find_by_id('id_service_type').value - server = browser.find_by_id('id_dynamicdns_server').value - domain = browser.find_by_id('id_dynamicdns_domain').value - user = browser.find_by_id('id_dynamicdns_user').value - ipurl = browser.find_by_id('id_dynamicdns_ipurl').value - if enabled and service_type == 'GnuDIP' and server == 'example.com' \ - and domain == 'freedombox.example.com' and user == 'tester' \ - and ipurl == 'http://myip.datasystems24.de': - return True - else: - return False - - -def dynamicdns_change_config(browser): - nav_to_module(browser, 'dynamicdns') - browser.find_link_by_href( - '/plinth/sys/dynamicdns/configure/').first.click() - browser.find_by_id('id_enabled').check() - browser.find_by_id('id_service_type').select('GnuDIP') - browser.find_by_id('id_dynamicdns_server').fill('2.example.com') - browser.find_by_id('id_dynamicdns_domain').fill('freedombox2.example.com') - browser.find_by_id('id_dynamicdns_user').fill('tester2') - browser.find_by_id('id_dynamicdns_secret').fill('testingtesting2') - browser.find_by_id('id_dynamicdns_ipurl').fill( - 'http://myip2.datasystems24.de') - submit(browser) - - -def _click_button_and_confirm(browser, href): - buttons = browser.find_link_by_href(href) - if buttons: - buttons.first.click() - with wait_for_page_update(browser, - expected_url='/plinth/sys/backups/'): - submit(browser) - - -def backup_delete_archive_by_name(browser, archive_name): - nav_to_module(browser, 'backups') - href = f'/plinth/sys/backups/root/delete/{archive_name}/' - _click_button_and_confirm(browser, href) - - -def backup_create(browser, app_name, archive_name=None): - application.install(browser, 'backups') - if archive_name: - backup_delete_archive_by_name(browser, archive_name) - - browser.find_link_by_href('/plinth/sys/backups/create/').first.click() - browser.find_by_id('select-all').uncheck() - if archive_name: - browser.find_by_id('id_backups-name').fill(archive_name) - - # ensure the checkbox is scrolled into view - browser.execute_script('window.scrollTo(0, 0)') - browser.find_by_value(app_name).first.check() - submit(browser) - - -def backup_restore(browser, app_name, archive_name=None): - nav_to_module(browser, 'backups') - href = f'/plinth/sys/backups/root/restore-archive/{archive_name}/' - _click_button_and_confirm(browser, href) - - -def backup_upload_and_restore(browser, app_name, downloaded_file_path): - nav_to_module(browser, 'backups') - browser.find_link_by_href('/plinth/sys/backups/upload/').first.click() - fileinput = browser.driver.find_element_by_id('id_backups-file') - fileinput.send_keys(downloaded_file_path) - # submit upload form - submit(browser) - # submit restore form - with wait_for_page_update(browser, expected_url='/plinth/sys/backups/'): - submit(browser) - - -def download_backup(browser, archive_name=None): - nav_to_module(browser, 'backups') - href = f'/plinth/sys/backups/root/download/{archive_name}/' - url = config['DEFAULT']['url'] + href - file_path = download_file_logged_in(browser, url, suffix='.tar.gz') - return file_path - - -def download_file_logged_in(browser, url, suffix=''): - """Download a file from Plinth, pretend being logged in via cookies""" - if not url.startswith("http"): - current_url = urlparse(browser.url) - url = "%s://%s%s" % (current_url.scheme, current_url.netloc, url) - cookies = browser.driver.get_cookies() - cookies = {cookie["name"]: cookie["value"] for cookie in cookies} - response = requests.get(url, verify=False, cookies=cookies) - with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as temp_file: - for chunk in response.iter_content(chunk_size=128): - temp_file.write(chunk) - return temp_file.name - - -def pagekite_configure(browser, host, port, kite_name, kite_secret): - """Configure pagekite basic parameters.""" - nav_to_module(browser, 'pagekite') - # time.sleep(0.250) # Wait for 200ms show animation to complete - browser.fill('pagekite-server_domain', host) - browser.fill('pagekite-server_port', str(port)) - browser.fill('pagekite-kite_name', kite_name) - browser.fill('pagekite-kite_secret', kite_secret) - submit(browser, form_class='form-configuration') - - -def pagekite_get_configuration(browser): - """Return pagekite basic parameters.""" - nav_to_module(browser, 'pagekite') - return (browser.find_by_name('pagekite-server_domain').value, - int(browser.find_by_name('pagekite-server_port').value), - browser.find_by_name('pagekite-kite_name').value, - browser.find_by_name('pagekite-kite_secret').value) - - -def bind_set_forwarders(browser, forwarders): - """Set the forwarders list (space separated) in bind configuration.""" - nav_to_module(browser, 'bind') - browser.fill('forwarders', forwarders) - submit(browser, form_class='form-configuration') - - -def bind_get_forwarders(browser): - """Return the forwarders list (space separated) in bind configuration.""" - nav_to_module(browser, 'bind') - return browser.find_by_name('forwarders').first.value - - -def bind_enable_dnssec(browser, enable): - """Enable/disable DNSSEC in bind configuration.""" - nav_to_module(browser, 'bind') - if enable: - browser.check('enable_dnssec') - else: - browser.uncheck('enable_dnssec') - - submit(browser, form_class='form-configuration') - - -def bind_get_dnssec(browser): - """Return whether DNSSEC is enabled/disabled in bind configuration.""" - nav_to_module(browser, 'bind') - return browser.find_by_name('enable_dnssec').first.checked - - -def security_enable_restricted_logins(browser, should_enable): - """Enable/disable restricted logins in security module.""" - nav_to_module(browser, 'security') - if should_enable: - browser.check('security-restricted_access') - else: - browser.uncheck('security-restricted_access') - - submit(browser) - - -def security_get_restricted_logins(browser): - """Return whether restricted console logins is enabled.""" - nav_to_module(browser, 'security') - return browser.find_by_name('security-restricted_access').first.checked - - -def upgrades_enable_automatic(browser, should_enable): - """Enable/disable automatic software upgrades.""" - nav_to_module(browser, 'upgrades') - checkbox_element = browser.find_by_name('auto_upgrades_enabled').first - if should_enable == checkbox_element.checked: - return - - if should_enable: - checkbox_element.check() - else: - checkbox_element.uncheck() - - submit(browser) - - -def upgrades_get_automatic(browser): - """Return whether automatic software upgrades is enabled.""" - nav_to_module(browser, 'upgrades') - return browser.find_by_name('auto_upgrades_enabled').first.checked - - -def _monkeysphere_find_domain(browser, key_type, domain_type, domain): - """Iterate every domain of a given type which given key type.""" - keys_of_type = browser.find_by_css( - '.monkeysphere-service-{}'.format(key_type)) - for key_of_type in keys_of_type: - search_domains = key_of_type.find_by_css( - '.monkeysphere-{}-domain'.format(domain_type)) - for search_domain in search_domains: - if search_domain.text == domain: - return key_of_type, search_domain - - raise IndexError('Domain not found') - - -def monkeysphere_import_key(browser, key_type, domain): - """Import a key of specified type for given domain into monkeysphere.""" - try: - monkeysphere_assert_imported_key(browser, key_type, domain) - except IndexError: - pass - else: - return - - key, _ = _monkeysphere_find_domain(browser, key_type, 'importable', domain) - with wait_for_page_update(browser): - key.find_by_css('.button-import').click() - - -def monkeysphere_assert_imported_key(browser, key_type, domain): - """Assert that a key of specified type for given domain was imported..""" - nav_to_module(browser, 'monkeysphere') - return _monkeysphere_find_domain(browser, key_type, 'imported', domain) - - -def monkeysphere_publish_key(browser, key_type, domain): - """Publish a key of specified type for given domain from monkeysphere.""" - nav_to_module(browser, 'monkeysphere') - key, _ = _monkeysphere_find_domain(browser, key_type, 'imported', domain) - with wait_for_page_update(browser): - key.find_by_css('.button-publish').click() - - application.wait_for_config_update(browser, 'monkeysphere') - - -def open_main_page(browser): - with wait_for_page_update(browser): - browser.find_link_by_href('/plinth/').first.click() - - -def networks_set_firewall_zone(browser, zone): - """"Set the network device firewall zone as internal or external.""" - nav_to_module(browser, 'networks') - device = browser.find_by_xpath( - '//span[contains(@class, "label-success") ' - 'and contains(@class, "connection-status-label")]/following::a').first - network_id = device['href'].split('/')[-3] - device.click() - edit_url = "/plinth/sys/networks/{}/edit/".format(network_id) - browser.find_link_by_href(edit_url).first.click() - browser.select('zone', zone) - browser.find_by_tag("form").first.find_by_tag('input')[-1].click() - - -def storage_is_root_disk_shown(browser): - table_cells = browser.find_by_tag('td') - return any(cell.text == '/' for cell in table_cells) From 84a7d7c928074b71cd0f916111d005044b664892 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 20 May 2020 11:13:49 -0700 Subject: [PATCH 14/41] coturn: Fix functional test for backup/restore Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/coturn/tests/coturn.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/modules/coturn/tests/coturn.feature b/plinth/modules/coturn/tests/coturn.feature index 687f50389..152ecc060 100644 --- a/plinth/modules/coturn/tests/coturn.feature +++ b/plinth/modules/coturn/tests/coturn.feature @@ -18,8 +18,8 @@ Scenario: Enable coturn application Scenario: Backup and restore coturn Given the coturn application is enabled When I create a backup of the coturn app data with name test_coturn - And I restore the coturn app data backup - Then the coturn service should be running with name test_coturn + And I restore the coturn app data backup with name test_coturn + Then the coturn service should be running Scenario: Disable coturn application Given the coturn application is enabled From aa414eb68b48d4e1217e2f0fac5caa3eddaec226 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 20 May 2020 11:15:11 -0700 Subject: [PATCH 15/41] ttrss: Fix functional tests Looks like the old 'Actions...' menu has been changed into a burger menu. Keep compatibility with earlier version too. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/ttrss/tests/test_functional.py | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/plinth/modules/ttrss/tests/test_functional.py b/plinth/modules/ttrss/tests/test_functional.py index ef44d5598..89009f9bc 100644 --- a/plinth/modules/ttrss/tests/test_functional.py +++ b/plinth/modules/ttrss/tests/test_functional.py @@ -27,7 +27,7 @@ def ttrss_assert_subscribed(session_browser): def _ttrss_load_main_interface(browser): """Load the TT-RSS interface.""" - functional.access_url(browser, 'ttrss') + functional.visit(browser, '/tt-rss/') overlay = browser.find_by_id('overlay') functional.eventually(lambda: not overlay.visible) @@ -36,11 +36,22 @@ def _is_feed_shown(browser, invert=False): return browser.is_text_present('Planet Debian') != invert +def _click_main_menu_item(browser, text): + """Select an item from the main actions menu.""" + burger_menu = browser.find_by_xpath('//*[contains(@title, "Actions...")]') + if burger_menu: + burger_menu.click() + else: + browser.find_by_text('Actions...').click() + + browser.find_by_text(text).click() + + def _subscribe(browser): """Subscribe to a feed in TT-RSS.""" _ttrss_load_main_interface(browser) - browser.find_by_text('Actions...').click() - browser.find_by_text('Subscribe to feed...').click() + + _click_main_menu_item(browser, 'Subscribe to feed...') browser.find_by_id('feedDlg_feedUrl').fill( 'https://planet.debian.org/atom.xml') browser.find_by_text('Subscribe').click() @@ -62,10 +73,14 @@ def _unsubscribe(browser): expand.first.click() browser.find_by_text('Planet Debian').click() - browser.execute_script("quickMenuGo('qmcRemoveFeed')") + _click_main_menu_item(browser, 'Unsubscribe') + prompt = browser.get_alert() prompt.accept() + # Reload as sometimes the feed does not disappear immediately + _ttrss_load_main_interface(browser) + assert functional.eventually(_is_feed_shown, [browser, True]) From 863789e47e80d445dbf00d39d9f46a44f033a357 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 20 May 2020 11:16:43 -0700 Subject: [PATCH 16/41] snapshot: Fix functional test to account for non-removable snapshots Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/modules/snapshot/tests/snapshot.feature | 2 +- plinth/modules/snapshot/tests/test_functional.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plinth/modules/snapshot/tests/snapshot.feature b/plinth/modules/snapshot/tests/snapshot.feature index 542d9d90e..ce49b2580 100644 --- a/plinth/modules/snapshot/tests/snapshot.feature +++ b/plinth/modules/snapshot/tests/snapshot.feature @@ -11,7 +11,7 @@ Background: Scenario: Create a snapshot Given the list of snapshots is empty When I manually create a snapshot - Then there should be 1 snapshot in the list + Then there should be 1 more snapshots in the list Scenario: Configure snapshots Given snapshots are configured with free space 30, timeline snapshots disabled, software snapshots disabled, hourly limit 10, daily limit 3, weekly limit 2, monthly limit 2, yearly limit 0 diff --git a/plinth/modules/snapshot/tests/test_functional.py b/plinth/modules/snapshot/tests/test_functional.py index 0eecf3c53..0a5fc1894 100644 --- a/plinth/modules/snapshot/tests/test_functional.py +++ b/plinth/modules/snapshot/tests/test_functional.py @@ -13,6 +13,7 @@ scenarios('snapshot.feature') @given('the list of snapshots is empty') def empty_snapshots_list(session_browser): _delete_all(session_browser) + return _get_count(session_browser) @when('I manually create a snapshot') @@ -20,10 +21,9 @@ def create_snapshot(session_browser): _create(session_browser) -@then(parsers.parse('there should be {count:d} snapshot in the list')) -def verify_snapshot_count(session_browser, count): - num_snapshots = _get_count(session_browser) - assert num_snapshots == count +@then(parsers.parse('there should be {count:d} more snapshots in the list')) +def verify_snapshot_count(session_browser, count, empty_snapshots_list): + assert _get_count(session_browser) == count + empty_snapshots_list @given( From 63ab11143a02374e5a7e80cd76f34e7b2e35fea9 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 20 May 2020 11:19:37 -0700 Subject: [PATCH 17/41] test: functional: Fix for Apache restart after domain change Signed-off-by: Sunil Mohan Adapa Reviewed-by: Joseph Nuthalapati --- plinth/tests/functional/__init__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plinth/tests/functional/__init__.py b/plinth/tests/functional/__init__.py index 2f757e2f5..9ea5bc4bb 100644 --- a/plinth/tests/functional/__init__.py +++ b/plinth/tests/functional/__init__.py @@ -337,6 +337,10 @@ def set_domain_name(browser, domain_name): nav_to_module(browser, 'config') browser.find_by_id('id_domainname').fill(domain_name) submit(browser) + # After a domain name change, Let's Encrypt will reload the web server and + # could cause a connection failure. + if browser.find_by_id('netErrorButtonContainer'): + browser.visit(browser.url) ######################## From a4dab3cc36dd112ede995866c3715715f1dffa28 Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Fri, 22 May 2020 23:16:33 +0530 Subject: [PATCH 18/41] tests: functional: Add pytest-xdist to install.sh pytest-xdist is a dependency for parallel execution of functional tests. --- plinth/tests/functional/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/tests/functional/install.sh b/plinth/tests/functional/install.sh index cc49c5b62..a2355a755 100755 --- a/plinth/tests/functional/install.sh +++ b/plinth/tests/functional/install.sh @@ -8,7 +8,7 @@ sudo apt-get install -yq --no-install-recommends \ python3-pip firefox smbclient\ xvfb pip3 install wheel -pip3 install splinter pytest-splinter pytest-bdd pytest-xvfb +pip3 install splinter pytest-splinter pytest-bdd pytest-xvfb pytest-xdist echo "Installing geckodriver" ( From 8cb5716f76472a817df214fccca86a44f6ef34db Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Wed, 20 May 2020 16:45:26 -0700 Subject: [PATCH 19/41] tor: Fix problems with running a relay This is a fix for regression introduced by ebe6a0ed026e27dc650b4c2fed8426357f959ddc. I have incorrectly assumed that providing only IPv6 ORPort is sufficient to listen on IPv4 and IPv6. As a result, Tor does not run when relay is enabled. Fix this by adding ORPorts for both IPv6 and IPv4. Tests performed: - Tor shows as running after enabling relay functionality. - Adding single or multiple ORPort values in the configuration file leads to actions/tor get-status reporting that relay is enabled. - Functional tests for Tor run properly. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- actions/tor | 10 ++++++---- plinth/modules/tor/__init__.py | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/actions/tor b/actions/tor index a8ae6c510..bfdcd1c16 100755 --- a/actions/tor +++ b/actions/tor @@ -65,7 +65,7 @@ def parse_arguments(): def subcommand_setup(arguments): """Setup Tor configuration after installing it.""" - if arguments.old_version and arguments.old_version <= 3: + if arguments.old_version and arguments.old_version <= 4: _upgrade_orport_value() return @@ -148,7 +148,8 @@ def _upgrade_orport_value(): aug = augeas_load() if _is_relay_enabled(aug): - aug.set(TOR_CONFIG + '/ORPort', '[::]:9001') + aug.set(TOR_CONFIG + '/ORPort[1]', '9001') + aug.set(TOR_CONFIG + '/ORPort[2]', '[::]:9001') aug.save() @@ -241,7 +242,7 @@ def _get_upstream_bridges(aug): def _is_relay_enabled(aug): """Return whether a relay is enabled.""" - orport = aug.get(TOR_CONFIG + '/ORPort') + orport = aug.get(TOR_CONFIG + '/ORPort[1]') return bool(orport) and orport != '0' @@ -390,7 +391,8 @@ def _enable_relay(relay=None, bridge=None, aug=None): use_upstream_bridges = _are_upstream_bridges_enabled(aug) if relay == 'enable' and not use_upstream_bridges: - aug.set(TOR_CONFIG + '/ORPort', '[::]:9001') + aug.set(TOR_CONFIG + '/ORPort[1]', '9001') + aug.set(TOR_CONFIG + '/ORPort[2]', '[::]:9001') elif relay == 'disable': aug.remove(TOR_CONFIG + '/ORPort') diff --git a/plinth/modules/tor/__init__.py b/plinth/modules/tor/__init__.py index 6c55029f2..f074526f1 100644 --- a/plinth/modules/tor/__init__.py +++ b/plinth/modules/tor/__init__.py @@ -14,13 +14,13 @@ from plinth.daemon import Daemon, diagnose_netcat, diagnose_port_listening from plinth.modules.apache.components import diagnose_url from plinth.modules.firewall.components import Firewall from plinth.modules.names.components import DomainType -from plinth.signals import domain_added, domain_removed from plinth.modules.users.components import UsersAndGroups +from plinth.signals import domain_added, domain_removed from . import utils from .manifest import backup, clients # noqa, pylint: disable=unused-import -version = 4 +version = 5 depends = ['names'] From 169ead7bcae74a9b8f59100afddf0ad66762288d Mon Sep 17 00:00:00 2001 From: fred1m Date: Fri, 22 May 2020 16:36:02 +0200 Subject: [PATCH 20/41] ikiwiki: Enable 'attachment' plugin by default Closes #1848. Reviewed-by: James Valleroy --- plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup | 2 +- plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup b/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup index 2a8ff8f2c..3db2ccc59 100644 --- a/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup +++ b/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-blog.setup @@ -25,7 +25,7 @@ IkiWiki::Setup::Automator->import( cgiurl => "/ikiwiki/$wikiname_short/ikiwiki.cgi", cgiauthurl => "/ikiwiki-auth/$wikiname_short/ikiwiki.cgi", cgi_wrapper => "/var/www/ikiwiki/$wikiname_short/ikiwiki.cgi", - add_plugins => [qw{goodstuff websetup comments calendar sidebar trail httpauth lockedit opendiscussion moderatedcomments userlist remove}], + add_plugins => [qw{goodstuff websetup comments calendar sidebar trail httpauth lockedit opendiscussion moderatedcomments userlist remove attachment}], rss => 1, atom => 1, syslog => 1, diff --git a/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup b/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup index 1abc066ec..d290c24de 100644 --- a/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup +++ b/plinth/modules/ikiwiki/data/etc/ikiwiki/plinth-wiki.setup @@ -25,7 +25,7 @@ IkiWiki::Setup::Automator->import( cgiurl => "/ikiwiki/$wikiname_short/ikiwiki.cgi", cgiauthurl => "/ikiwiki-auth/$wikiname_short/ikiwiki.cgi", cgi_wrapper => "/var/www/ikiwiki/$wikiname_short/ikiwiki.cgi", - add_plugins => [qw{goodstuff websetup httpauth}], + add_plugins => [qw{goodstuff websetup httpauth attachment}], rss => 1, atom => 1, syslog => 1, From 8ab665a7a2936670465e214d57798f480c4d01b8 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 23 May 2020 16:12:58 -0700 Subject: [PATCH 21/41] mldonkey: Add app to freedombox-share group - To be able to write to folders shared with other apps. - Increment app version so that already installed apps also get upgraded and mldonkey becomes part of freedombox-share group. - Ensure that app does not get enabled after upgrade. - Relax path restrictions for write access so that mldonkey can write to external disks and root disk shared folders. Closes: #1813. Tests performed: - Install app freshly mldonkey user is part of freedombox-share group. - Install app without changes. Switch to a branch with changes. Run ./setup.py install. The app is upgraded after run. mldonkey user is now part of freedombox-share group. To check run sudo actions/users get-group-users freedombox-share. - Modify options -> Shares and Add Share with a group shared folder with strategy incoming_files. Remove old share with strategy incoming_files. Downloading a new file means it will be stored in the shared folder. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Veiko Aasa --- plinth/modules/mldonkey/__init__.py | 12 +++++++++--- .../system/mldonkey-server.service.d/freedombox.conf | 3 +-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/plinth/modules/mldonkey/__init__.py b/plinth/modules/mldonkey/__init__.py index d6572ef2f..06221335e 100644 --- a/plinth/modules/mldonkey/__init__.py +++ b/plinth/modules/mldonkey/__init__.py @@ -11,12 +11,13 @@ from plinth import cfg, frontpage, menu from plinth.daemon import Daemon from plinth.modules.apache.components import Webserver from plinth.modules.firewall.components import Firewall +from plinth.modules.users import add_user_to_share_group from plinth.modules.users.components import UsersAndGroups from plinth.utils import format_lazy from .manifest import backup, clients # noqa, pylint: disable=unused-import -version = 1 +version = 2 managed_services = ['mldonkey-server'] @@ -35,6 +36,8 @@ _description = [ 'directory.'), box_name=cfg.box_name) ] +_SYSTEM_USER = 'mldonkey' + app = None @@ -81,7 +84,7 @@ class MLDonkeyApp(app_module.App): self.add(daemon) users_and_groups = UsersAndGroups('users-and-groups-mldonkey', - reserved_usernames=['mldonkey'], + reserved_usernames=[_SYSTEM_USER], groups=groups) self.add(users_and_groups) @@ -100,4 +103,7 @@ def setup(helper, old_version=None): """Install and configure the module.""" helper.call('pre', actions.superuser_run, 'mldonkey', ['pre-install']) helper.install(managed_packages) - helper.call('post', app.enable) + if not old_version: + helper.call('post', app.enable) + + add_user_to_share_group(_SYSTEM_USER, managed_services[0]) diff --git a/plinth/modules/mldonkey/data/lib/systemd/system/mldonkey-server.service.d/freedombox.conf b/plinth/modules/mldonkey/data/lib/systemd/system/mldonkey-server.service.d/freedombox.conf index d898ba8e0..ef27515fa 100644 --- a/plinth/modules/mldonkey/data/lib/systemd/system/mldonkey-server.service.d/freedombox.conf +++ b/plinth/modules/mldonkey/data/lib/systemd/system/mldonkey-server.service.d/freedombox.conf @@ -21,8 +21,7 @@ ProtectHome=yes ProtectKernelLogs=yes ProtectKernelModules=yes ProtectKernelTunables=yes -ProtectSystem=strict -ReadWritePaths=/var/lib/mldonkey +ProtectSystem=full RemainAfterExit=no RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6 RestrictRealtime=yes From bb3b32fd694b9559469daea9e8b02bb7cf34dfd6 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 25 May 2020 01:08:43 -0700 Subject: [PATCH 22/41] samba: Add clients information Closes: #1814. Tests performed: - Connect with all the mentioned clients to a Samba folder on a FreedomBox. - Visit all the links in the clients information table. Signed-off-by: Sunil Mohan Adapa Reviewed-by: Veiko Aasa --- plinth/modules/samba/manifest.py | 71 +++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/plinth/modules/samba/manifest.py b/plinth/modules/samba/manifest.py index 685be3df3..60169f435 100644 --- a/plinth/modules/samba/manifest.py +++ b/plinth/modules/samba/manifest.py @@ -3,12 +3,79 @@ Application manifest for Samba. """ -from plinth.clients import validate +from django.utils.translation import ugettext_lazy as _ + +from plinth.clients import store_url, validate from plinth.modules.backups.api import validate as validate_backup SHARES_CONF_BACKUP_FILE = '/var/lib/plinth/backups-data/samba-shares-dump.conf' -clients = validate([]) +clients = validate([{ + 'name': + _('Android Samba Client'), + 'platforms': [{ + 'type': + 'store', + 'os': + 'android', + 'store_name': + 'f-droid', + 'url': + store_url('f-droid', 'com.google.android.sambadocumentsprovider') + }] +}, { + 'name': + _('Ghost Commander - Samba plugin'), + 'platforms': [{ + 'type': 'store', + 'os': 'android', + 'store_name': 'f-droid', + 'url': store_url('f-droid', 'com.ghostsq.commander.samba') + }, { + 'type': 'store', + 'os': 'android', + 'store_name': 'google-play', + 'url': store_url('google-play', 'com.ghostsq.commander.smb') + }] +}, { + 'name': + _('VLC media player'), + 'platforms': [{ + 'type': 'store', + 'os': 'android', + 'store_name': 'f-droid', + 'url': store_url('f-droid', 'org.videolan.vlc') + }, { + 'type': 'store', + 'os': 'android', + 'store_name': 'google-play', + 'url': store_url('google-play', 'org.videolan.vlc') + }] +}, { + 'name': + _('GNOME Files'), + 'platforms': [{ + 'type': 'package', + 'format': 'deb', + 'name': 'nautilus', + }, { + 'type': 'download', + 'os': 'gnu-linux', + 'url': 'https://wiki.gnome.org/Apps/Files' + }] +}, { + 'name': + _('Dolphin'), + 'platforms': [{ + 'type': 'package', + 'format': 'deb', + 'name': 'dolphin', + }, { + 'type': 'download', + 'os': 'gnu-linux', + 'url': 'https://kde.org/applications/system/org.kde.dolphin' + }] +}]) backup = validate_backup({ 'data': { From f46b7ae2a6518a5b02ef4055acf7abc820f25455 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 25 May 2020 14:31:20 -0400 Subject: [PATCH 23/41] utils: Handle removal of axes.get_version() This was removed from django-axes 5.0.13 with introduction of setuptools-scm. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/utils.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plinth/utils.py b/plinth/utils.py index f4392ef31..80ca0e336 100644 --- a/plinth/utils.py +++ b/plinth/utils.py @@ -149,4 +149,10 @@ def is_axes_old(): """ import axes - return LooseVersion(axes.get_version()) < LooseVersion('5.0') + try: + version = axes.get_version() + except AttributeError: + # axes.get_version() was removed in 5.0.13 + return False + + return LooseVersion(version) < LooseVersion('5.0') From b9459655fbdbad092f884941d7e804485a2957a9 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 20 May 2020 06:51:41 -0400 Subject: [PATCH 24/41] debian: Mark doc packages as Multi-Arch: foreign Issue was reported by multiarch hinter on https://tracker.debian.org/pkg/plinth. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- debian/control | 2 ++ 1 file changed, 2 insertions(+) diff --git a/debian/control b/debian/control index ec3f1161c..8992c4d7a 100644 --- a/debian/control +++ b/debian/control @@ -184,6 +184,7 @@ Description: easy to manage, privacy oriented home server Package: freedombox-doc-en Architecture: all +Multi-Arch: foreign Section: doc Depends: ${misc:Depends} Description: easy to manage, privacy oriented home server - user manual (English) @@ -198,6 +199,7 @@ Description: easy to manage, privacy oriented home server - user manual (English Package: freedombox-doc-es Architecture: all +Multi-Arch: foreign Section: doc Depends: ${misc:Depends} Description: easy to manage, privacy oriented home server - user manual (Spanish) From b6478b688863fdd1139f048c2a88dc943bdf1ff3 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sat, 23 May 2020 14:00:16 -0700 Subject: [PATCH 25/41] cockpit: Promote for advanced storage/firewalld/networking ops - Talk about cockpit in networking, firewall and storage apps for advanced operations. Make it a separate section instead of just description update to provider higher emphasis. - Update cockpit description too. Closes: #1809. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/cockpit/__init__.py | 5 +++++ plinth/modules/firewall/templates/firewall.html | 7 +++++++ .../networks/templates/networks_configuration.html | 9 +++++++++ plinth/modules/storage/templates/storage.html | 8 ++++++++ 4 files changed, 29 insertions(+) diff --git a/plinth/modules/cockpit/__init__.py b/plinth/modules/cockpit/__init__.py index fe2d4da31..2d001fe4a 100644 --- a/plinth/modules/cockpit/__init__.py +++ b/plinth/modules/cockpit/__init__.py @@ -34,6 +34,11 @@ _description = [ 'are available for many advanced functions that are not usually ' 'required. A web based terminal for console operations is also ' 'available.'), box_name=_(cfg.box_name)), + format_lazy( + _('Cockpit can be used to perform advanced storage operations such as ' + 'disk partitioning and RAID management. It can also be used for ' + 'opening custom firewall ports and advanced networking such as ' + 'bonding, bridging and VLAN management.')), format_lazy( _('It can be accessed by any user on ' '{box_name} belonging to the admin group.'), diff --git a/plinth/modules/firewall/templates/firewall.html b/plinth/modules/firewall/templates/firewall.html index b1056e7f0..e35ac2509 100644 --- a/plinth/modules/firewall/templates/firewall.html +++ b/plinth/modules/firewall/templates/firewall.html @@ -93,6 +93,13 @@

+

{%trans "Advanced" %}

+

+ {% blocktrans trimmed %} + Advanced firwall operations such as opening custom ports are provided by + the Cockpit app. + {% endblocktrans %} +

{% endif %} {% endblock %} diff --git a/plinth/modules/networks/templates/networks_configuration.html b/plinth/modules/networks/templates/networks_configuration.html index 62cbc1420..a10eb4fe2 100644 --- a/plinth/modules/networks/templates/networks_configuration.html +++ b/plinth/modules/networks/templates/networks_configuration.html @@ -45,4 +45,13 @@ {% include "network_topology_main.html" %} {% include "internet_connectivity_main.html" %} + +

{%trans "Advanced" %}

+

+ {% blocktrans trimmed %} + Advanced networking operations such as bonding, bridging and VLAN + management are provided by the Cockpit + app. + {% endblocktrans %} +

{% endblock %} diff --git a/plinth/modules/storage/templates/storage.html b/plinth/modules/storage/templates/storage.html index af4291196..91d693b77 100644 --- a/plinth/modules/storage/templates/storage.html +++ b/plinth/modules/storage/templates/storage.html @@ -88,4 +88,12 @@

{% endif %} +

{%trans "Advanced" %}

+

+ {% blocktrans trimmed %} + Advanced storage operations such as disk partitioning and RAID management + are provided by the Cockpit app. + {% endblocktrans %} +

+ {% endblock %} From dc5f4a69b757ccc3befd0ee94b6599c0e6421537 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 27 May 2020 14:19:54 -0400 Subject: [PATCH 26/41] firewall: Minor spelling fix Signed-off-by: James Valleroy Reviewed-by: James Valleroy --- plinth/modules/firewall/templates/firewall.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plinth/modules/firewall/templates/firewall.html b/plinth/modules/firewall/templates/firewall.html index e35ac2509..80c29f0fd 100644 --- a/plinth/modules/firewall/templates/firewall.html +++ b/plinth/modules/firewall/templates/firewall.html @@ -96,8 +96,8 @@

{%trans "Advanced" %}

{% blocktrans trimmed %} - Advanced firwall operations such as opening custom ports are provided by - the Cockpit app. + Advanced firewall operations such as opening custom ports are provided + by the Cockpit app. {% endblocktrans %}

{% endif %} From ee108353594250b03c8ebb9e75104ce4b5a858be Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Fri, 29 May 2020 11:28:10 -0400 Subject: [PATCH 27/41] radicale: Fix link in description to clients Closes: #1863. Tested: - Click on link and it loads valid page. Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- plinth/modules/radicale/__init__.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plinth/modules/radicale/__init__.py b/plinth/modules/radicale/__init__.py index 9dd6152e6..37de29ab7 100644 --- a/plinth/modules/radicale/__init__.py +++ b/plinth/modules/radicale/__init__.py @@ -32,9 +32,10 @@ _description = [ format_lazy( _('Radicale is a CalDAV and CardDAV server. It allows synchronization ' 'and sharing of scheduling and contact data. To use Radicale, a ' - 'supported client ' - 'application is needed. Radicale can be accessed by any user ' - 'with a {box_name} login.'), box_name=_(cfg.box_name)), + 'supported client application is needed. Radicale can ' + 'be accessed by any user with a {box_name} login.'), + box_name=_(cfg.box_name)), _('Radicale provides a basic web interface, which only supports creating ' 'new calendars and addressbooks. It does not support adding events or ' 'contacts, which must be done using a separate client.'), From 64498b7b17a113d1e6f39d2d18b5c312aeb615e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 28 May 2020 18:33:47 +0000 Subject: [PATCH 28/41] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 85.5% (1086 of 1270 strings) --- plinth/locale/nb/LC_MESSAGES/django.po | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index b12872704..456664bc0 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -16,8 +16,8 @@ msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-18 18:36-0400\n" -"PO-Revision-Date: 2020-05-06 06:11+0000\n" -"Last-Translator: Petter Reinholdtsen \n" +"PO-Revision-Date: 2020-05-29 18:41+0000\n" +"Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb\n" @@ -2787,27 +2787,16 @@ msgstr "" "er påskrudd." #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:30 -#, fuzzy, python-format -#| msgid "" -#| "\n" -#| " The configured domain name is using a self-signed certificate.\n" -#| " Federation with other Matrix Synapse instances requires a valid " -#| "TLS\n" -#| " certificate. Please go to Let's\n" -#| " Encrypt to obtain one.\n" -#| " " +#, python-format msgid "" "The configured domain name is using a self-signed certificate. Federation " "with other Matrix Synapse instances requires a valid TLS certificate. Please " "go to Let's Encrypt to obtain one." msgstr "" -"\n" -" Oppsatt domene bruker et selv-signert sertifikat.\n" -" Samhørighet med andre Matrix Synapse-instanser krever et gyldig " -"TLS-\n" -" sertifikat. Gå til Let's\n" -" Encrypt for å skaffe deg det.\n" -" " +"Oppsatt domene bruker et selv-signert sertifikat.\n" +"Samhørighet med andre Matrix Synapse-instanser krever et gyldig TLS-\n" +"sertifikat. Gå til Let's Encrypt for å " +"skaffe deg det." #: plinth/modules/matrixsynapse/views.py:86 msgid "Public registration enabled" From a91611694c1dbc9208f14dff2b796fcc6654df57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 28 May 2020 18:34:32 +0000 Subject: [PATCH 29/41] Translated using Weblate (Czech) Currently translated at 79.9% (1015 of 1270 strings) --- plinth/locale/cs/LC_MESSAGES/django.po | 27 ++++++++------------------ 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index a3139c281..75b10fb76 100644 --- a/plinth/locale/cs/LC_MESSAGES/django.po +++ b/plinth/locale/cs/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-18 18:36-0400\n" -"PO-Revision-Date: 2020-04-01 00:36+0000\n" -"Last-Translator: Pavel Borecki \n" +"PO-Revision-Date: 2020-05-29 18:41+0000\n" +"Last-Translator: Allan Nordhøy \n" "Language-Team: Czech \n" "Language: cs\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.0-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -2749,27 +2749,16 @@ msgstr "" "libovolného klienta." #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:30 -#, fuzzy, python-format -#| msgid "" -#| "\n" -#| " The configured domain name is using a self-signed certificate.\n" -#| " Federation with other Matrix Synapse instances requires a valid " -#| "TLS\n" -#| " certificate. Please go to Let's\n" -#| " Encrypt to obtain one.\n" -#| " " +#, python-format msgid "" "The configured domain name is using a self-signed certificate. Federation " "with other Matrix Synapse instances requires a valid TLS certificate. Please " "go to Let's Encrypt to obtain one." msgstr "" -"\n" -" Nastavený doménový název používá sám sebou podepsaný certifikát.\n" -" Federování s ostatními instancemi Matrix Synapse vyžaduje platný " -"TLS\n" -" certifikát. Jděte na Let's\n" -" Encrypt a získejte takový.\n" -" " +"Nastavený doménový název používá sám sebou podepsaný certifikát.\n" +"Federování s ostatními instancemi Matrix Synapse vyžaduje platný TLS " +"certifikát. Jděte na Let's Encrypt a " +"získejte takový." #: plinth/modules/matrixsynapse/views.py:86 msgid "Public registration enabled" From 3ebdb00010d34594001f3665fa501cb5d3e1f51b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 28 May 2020 18:35:16 +0000 Subject: [PATCH 30/41] Translated using Weblate (Hungarian) Currently translated at 80.0% (1016 of 1270 strings) --- plinth/locale/hu/LC_MESSAGES/django.po | 28 ++++++++------------------ 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index 3369e09de..4e2cd0023 100644 --- a/plinth/locale/hu/LC_MESSAGES/django.po +++ b/plinth/locale/hu/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-18 18:36-0400\n" -"PO-Revision-Date: 2020-02-17 20:32+0000\n" -"Last-Translator: Doma Gergő \n" +"PO-Revision-Date: 2020-05-29 18:41+0000\n" +"Last-Translator: Allan Nordhøy \n" "Language-Team: Hungarian \n" "Language: hu\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.11\n" +"X-Generator: Weblate 4.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -2740,28 +2740,16 @@ msgstr "" "felhasználót regisztrálni." #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:30 -#, fuzzy, python-format -#| msgid "" -#| "\n" -#| " The configured domain name is using a self-signed certificate.\n" -#| " Federation with other Matrix Synapse instances requires a valid " -#| "TLS\n" -#| " certificate. Please go to Let's\n" -#| " Encrypt to obtain one.\n" -#| " " +#, python-format msgid "" "The configured domain name is using a self-signed certificate. Federation " "with other Matrix Synapse instances requires a valid TLS certificate. Please " "go to Let's Encrypt to obtain one." msgstr "" -"\n" -" A beállított doménnév ön-aláírt tanúsítványt használ.\n" -" A többi Matrix Synapse példányokkal való szövetséghez egy érvényes " -"TLS\n" -" tanúsítványra lesz szükséged. Kérlek, látogasd meg a Let's\n" -" Encrypt weboldalát ahhoz, hogy beszerezz egyet.\n" -" " +"A beállított doménnév ön-aláírt tanúsítványt használ. A többi Matrix Synapse " +"példányokkal való szövetséghez egy érvényes TLS tanúsítványra lesz " +"szükséged. Kérlek, látogasd meg a Let's " +"Encrypt weboldalát ahhoz, hogy beszerezz egyet." #: plinth/modules/matrixsynapse/views.py:86 msgid "Public registration enabled" From b524cbe399ea082adb852285f3749ffc828bb9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allan=20Nordh=C3=B8y?= Date: Thu, 28 May 2020 18:34:53 +0000 Subject: [PATCH 31/41] Translated using Weblate (Greek) Currently translated at 87.6% (1113 of 1270 strings) --- plinth/locale/el/LC_MESSAGES/django.po | 28 ++++++++------------------ 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index bac1b6ab8..a73612de8 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -8,8 +8,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-05-18 18:36-0400\n" -"PO-Revision-Date: 2020-01-25 17:21+0000\n" -"Last-Translator: Nektarios Katakis \n" +"PO-Revision-Date: 2020-05-29 18:41+0000\n" +"Last-Translator: Allan Nordhøy \n" "Language-Team: Greek \n" "Language: el\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 3.11-dev\n" +"X-Generator: Weblate 4.1-dev\n" #: doc/dev/_templates/layout.html:11 msgid "Page source" @@ -2812,28 +2812,16 @@ msgstr "" "εάν είναι ενεργοποιημένη η δημόσια εγγραφή." #: plinth/modules/matrixsynapse/templates/matrix-synapse.html:30 -#, fuzzy, python-format -#| msgid "" -#| "\n" -#| " The configured domain name is using a self-signed certificate.\n" -#| " Federation with other Matrix Synapse instances requires a valid " -#| "TLS\n" -#| " certificate. Please go to Let's\n" -#| " Encrypt to obtain one.\n" -#| " " +#, python-format msgid "" "The configured domain name is using a self-signed certificate. Federation " "with other Matrix Synapse instances requires a valid TLS certificate. Please " "go to Let's Encrypt to obtain one." msgstr "" -"\n" -" Το διαμορφωμένο όνομα τομέα χρησιμοποιεί πιστοποιητικό που έχει " -"υπογραφεί αυτόματα.\n" -"        Η ομοσπονδία με άλλους διακομιστές Synapse Matrix απαιτεί έγκυρο " -"TLS\n" -"        πιστοποιητικό. Μεταβείτε στη διεύθυνση Lets Encrypt για να αποκτήσετε ένα.\n" -" " +"Το διαμορφωμένο όνομα τομέα χρησιμοποιεί πιστοποιητικό που έχει υπογραφεί " +"αυτόματα. Η ομοσπονδία με άλλους διακομιστές Synapse Matrix απαιτεί έγκυρο " +"TLS πιστοποιητικό. Μεταβείτε στη διεύθυνση " +"Lets Encrypt για να αποκτήσετε ένα." #: plinth/modules/matrixsynapse/views.py:86 msgid "Public registration enabled" From 1aaf5efb526b2b51b59a04a5f64d27ecdac6ba9b Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Fri, 29 May 2020 10:53:07 -0400 Subject: [PATCH 32/41] users: Avoid error when user's groups cannot be parsed Add log warnings to help debug if there is a related issue. May help #1834. Tested: - Run action command with valid and invalid username. Warning is printed for invalid username. - Modify the output to remove '='. Warning is printed instead of exception. - Ensure that warnings messages are output to stderr and not stdout. - On frontpage.py change the call to get user groups and ensure that that output warning messages are not parsed groups. Signed-off-by: James Valleroy [sunil: Drop module logger as root logger is at use] [sunil: Use %s formatting for logging API] Signed-off-by: Sunil Mohan Adapa Reviewed-by: Sunil Mohan Adapa --- actions/users | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/actions/users b/actions/users index acfc4df99..bbc26b136 100755 --- a/actions/users +++ b/actions/users @@ -5,6 +5,7 @@ Configuration helper for the LDAP user directory """ import argparse +import logging import os import re import shutil @@ -12,6 +13,7 @@ import subprocess import sys import augeas + from plinth import action_utils ACCESS_CONF = '/etc/security/access.conf' @@ -200,8 +202,8 @@ def configure_ldapscripts(): # modify a copy of the config file shutil.copy('/etc/ldapscripts/ldapscripts.conf', LDAPSCRIPTS_CONF) - aug = augeas.Augeas( - flags=augeas.Augeas.NO_LOAD + augeas.Augeas.NO_MODL_AUTOLOAD) + aug = augeas.Augeas(flags=augeas.Augeas.NO_LOAD + + augeas.Augeas.NO_MODL_AUTOLOAD) aug.set('/augeas/load/Shellvars/lens', 'Shellvars.lns') aug.set('/augeas/load/Shellvars/incl[last() + 1]', LDAPSCRIPTS_CONF) aug.load() @@ -325,13 +327,20 @@ def get_user_groups(username): output = process.stdout.decode().strip() if output: groups_part = output.split(' ')[2] - groups = groups_part.split('=')[1] + try: + groups = groups_part.split('=')[1] + except IndexError: + logging.warning('Could not read groups for user %s: \n%s', + username, output) + return [] + group_names = [ user.strip('()') for user in re.findall(r'\(.*?\)', groups) ] group_names.remove('users') return group_names + logging.warning('User %s not found in LDAP', username) return [] From 746f7b07fc41ef60fa0c1c126f6baaec2ca59138 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 27 May 2020 17:30:22 -0400 Subject: [PATCH 33/41] templates: Fix setup state check Closes: #1728. Signed-off-by: James Valleroy --- plinth/templates/setup.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/templates/setup.html b/plinth/templates/setup.html index 6497f98cd..9ddbf5aa6 100644 --- a/plinth/templates/setup.html +++ b/plinth/templates/setup.html @@ -70,7 +70,7 @@ {% endif %} {% if setup_state == 'needs-setup' %} value="{% trans "Install" %}" - {% elif setup_state == 'needs-upgrade' %} + {% elif setup_state == 'needs-update' %} value="{% trans "Update" %}" {% endif %} /> From e7be53723f48a1e4fa702a8ebfd80ad2595784e2 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 25 May 2020 20:41:10 -0700 Subject: [PATCH 34/41] firewall: Mention that internal services are available over VPN When showing the internal zone warning. Closes: #1312. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/templates/internal-zone.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/templates/internal-zone.html b/plinth/templates/internal-zone.html index f4f2f3b94..eb9546c0e 100644 --- a/plinth/templates/internal-zone.html +++ b/plinth/templates/internal-zone.html @@ -9,7 +9,7 @@ {% if not component.is_external %}
{% blocktrans trimmed with service_name=component.name %} - {{ service_name }} is available only on internal networks. + {{ service_name }} is available only on internal networks or when the client is connected to {{ box_name }} through VPN. {% endblocktrans %}

{% with interfaces=component.get_internal_interfaces %} From d379c981bb57a97602a9a46920b11b3f363b70b4 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Mon, 25 May 2020 20:55:02 -0700 Subject: [PATCH 35/41] firewall: Don't show tun interface in internal zone warning - We are mention in the internal zone warning that services are available when connected over VPN. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/firewall/components.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/plinth/modules/firewall/components.py b/plinth/modules/firewall/components.py index 29b450bf8..4519b77ac 100644 --- a/plinth/modules/firewall/components.py +++ b/plinth/modules/firewall/components.py @@ -4,6 +4,7 @@ App component for other apps to use firewall functionality. """ import logging +import re from django.utils.translation import ugettext_lazy as _ @@ -100,8 +101,16 @@ class Firewall(app.FollowerComponent): @staticmethod def get_internal_interfaces(): - """Returns a list of interfaces in a firewall zone.""" - return firewall.get_interfaces('internal') + """Returns a list of interfaces in a firewall zone. + + Filter out tun interfaces as they are always assumed to be internal + interfaces. + + """ + return [ + interface for interface in firewall.get_interfaces('internal') + if not re.fullmatch(r'tun\d+', interface) + ] def diagnose(self): """Check if the firewall ports are open and only as expected. From b5bbb16b033cc3f7114a21ae3df801555dc97586 Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 26 May 2020 15:35:29 -0700 Subject: [PATCH 36/41] minidlna: Add link to manual page Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/minidlna/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plinth/modules/minidlna/__init__.py b/plinth/modules/minidlna/__init__.py index e888d0176..f93073cf0 100644 --- a/plinth/modules/minidlna/__init__.py +++ b/plinth/modules/minidlna/__init__.py @@ -46,7 +46,8 @@ class MiniDLNAApp(app_module.App): info = app_module.Info(app_id=self.app_id, version=version, name='minidlna', icon_filename='minidlna', short_description=_('Simple Media Server'), - description=_description, clients=clients) + description=_description, + manual_page='MiniDLNA', clients=clients) self.add(info) menu_item = menu.Menu( From 0273d534ccbbb6c49235401c46b2a4aaf585ef7f Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Tue, 26 May 2020 15:37:51 -0700 Subject: [PATCH 37/41] minidlna: Fix i18n for name of the app - Also properly stylize the app name as done on project website. Signed-off-by: Sunil Mohan Adapa Reviewed-by: James Valleroy --- plinth/modules/minidlna/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plinth/modules/minidlna/__init__.py b/plinth/modules/minidlna/__init__.py index f93073cf0..755bd28cf 100644 --- a/plinth/modules/minidlna/__init__.py +++ b/plinth/modules/minidlna/__init__.py @@ -44,7 +44,7 @@ class MiniDLNAApp(app_module.App): groups = {'minidlna': _('Media streaming server')} info = app_module.Info(app_id=self.app_id, version=version, - name='minidlna', icon_filename='minidlna', + name=_('MiniDLNA'), icon_filename='minidlna', short_description=_('Simple Media Server'), description=_description, manual_page='MiniDLNA', clients=clients) From 48f66a0d7a71ed034ee57473295960ae11984b2f Mon Sep 17 00:00:00 2001 From: Sunil Mohan Adapa Date: Sun, 31 May 2020 21:52:42 -0700 Subject: [PATCH 38/41] pagekite: Fix expired certificates causing connection failures This is to make Pagekite use certficates shipped by Debian. Otherwise by default, it uses internally shipped certificates that may be outdated. See: https://pagekite.wordpress.com/2020/05/30/tls-certificate-validation-issues/ Tests performed: - Without the patch, configure pagekite with a proper account. Notice that pagekite fails to connect to the server due to SSL failures. - Stop FreedomBox, apply the patch, run ./setup.py and run FreedomBox. File /etc/pagekite.d/90_freedombox_certs.rc is present. Pagekite is restarted by restarts. It start connecting to the server successfully. Signed-off-by: Sunil Mohan Adapa [jvalleroy: Fix typo in comment] Signed-off-by: James Valleroy Reviewed-by: James Valleroy --- plinth/modules/pagekite/__init__.py | 9 +++++++-- .../data/etc/pagekite.d/90_freedombox_certs.rc | 11 +++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 plinth/modules/pagekite/data/etc/pagekite.d/90_freedombox_certs.rc diff --git a/plinth/modules/pagekite/__init__.py b/plinth/modules/pagekite/__init__.py index 0a33cd5b0..429b0469d 100644 --- a/plinth/modules/pagekite/__init__.py +++ b/plinth/modules/pagekite/__init__.py @@ -5,6 +5,7 @@ FreedomBox app to configure PageKite. from django.utils.translation import ugettext_lazy as _ +from plinth import actions from plinth import app as app_module from plinth import cfg, menu from plinth.daemon import Daemon @@ -14,7 +15,7 @@ from plinth.utils import format_lazy from . import utils from .manifest import backup # noqa, pylint: disable=unused-import -version = 1 +version = 2 depends = ['names'] @@ -106,4 +107,8 @@ def init(): def setup(helper, old_version=None): """Install and configure the module.""" helper.install(managed_packages) - helper.call('post', app.enable) + if not old_version: + helper.call('post', app.enable) + + if old_version == 1: + actions.superuser_run('service', ['try-restart', managed_services[0]]) diff --git a/plinth/modules/pagekite/data/etc/pagekite.d/90_freedombox_certs.rc b/plinth/modules/pagekite/data/etc/pagekite.d/90_freedombox_certs.rc new file mode 100644 index 000000000..00d7bb4ee --- /dev/null +++ b/plinth/modules/pagekite/data/etc/pagekite.d/90_freedombox_certs.rc @@ -0,0 +1,11 @@ +# +# This file is shipped by FreedomBox. DO NOT EDIT. +# +# This is to make Pagekite use certficates shipped by Debian. Otherwise by +# default, it uses internally shipped certificates that may be outdated. See: +# https://pagekite.wordpress.com/2020/05/30/tls-certificate-validation-issues/ +# +# If you wish to override this setting, create another file starting with a +# number higher than 90. +# +ca_certs = /etc/ssl/certs/ca-certificates.crt From 074042c84fa1b9183a61449915a580fd97c8b051 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 1 Jun 2020 17:45:09 -0400 Subject: [PATCH 39/41] locale: Update translation strings Signed-off-by: James Valleroy --- plinth/locale/bg/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/bn/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/cs/LC_MESSAGES/django.po | 293 +++++++++++-------- plinth/locale/da/LC_MESSAGES/django.po | 276 +++++++++++------- plinth/locale/de/LC_MESSAGES/django.po | 293 +++++++++++-------- plinth/locale/django.pot | 271 +++++++++++------- plinth/locale/el/LC_MESSAGES/django.po | 290 ++++++++++++------- plinth/locale/es/LC_MESSAGES/django.po | 293 +++++++++++-------- plinth/locale/fa/LC_MESSAGES/django.po | 272 +++++++++++------- plinth/locale/fake/LC_MESSAGES/django.po | 276 +++++++++++------- plinth/locale/fr/LC_MESSAGES/django.po | 297 ++++++++++++-------- plinth/locale/gl/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/gu/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/hi/LC_MESSAGES/django.po | 293 +++++++++++-------- plinth/locale/hu/LC_MESSAGES/django.po | 293 +++++++++++-------- plinth/locale/id/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/it/LC_MESSAGES/django.po | 288 +++++++++++-------- plinth/locale/ja/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/kn/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/lt/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/nb/LC_MESSAGES/django.po | 293 +++++++++++-------- plinth/locale/nl/LC_MESSAGES/django.po | 293 +++++++++++-------- plinth/locale/pl/LC_MESSAGES/django.po | 275 +++++++++++------- plinth/locale/pt/LC_MESSAGES/django.po | 276 +++++++++++------- plinth/locale/ru/LC_MESSAGES/django.po | 293 +++++++++++-------- plinth/locale/sl/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/sr/LC_MESSAGES/django.po | 273 +++++++++++------- plinth/locale/sv/LC_MESSAGES/django.po | 290 ++++++++++++------- plinth/locale/ta/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/te/LC_MESSAGES/django.po | 282 ++++++++++++------- plinth/locale/tr/LC_MESSAGES/django.po | 285 ++++++++++++------- plinth/locale/uk/LC_MESSAGES/django.po | 271 +++++++++++------- plinth/locale/zh_Hans/LC_MESSAGES/django.po | 278 +++++++++++------- 33 files changed, 5694 insertions(+), 3560 deletions(-) diff --git a/plinth/locale/bg/LC_MESSAGES/django.po b/plinth/locale/bg/LC_MESSAGES/django.po index 751392cf1..9da23cc3b 100644 --- a/plinth/locale/bg/LC_MESSAGES/django.po +++ b/plinth/locale/bg/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2019-10-12 14:52+0000\n" "Last-Translator: Nevena Mircheva \n" "Language-Team: Bulgarian user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -353,13 +365,6 @@ msgstr "" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "" @@ -401,7 +406,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -492,87 +497,87 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -645,8 +650,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -661,24 +666,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1293,8 +1306,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1413,17 +1426,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1479,6 +1492,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2568,6 +2593,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2608,36 +2637,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3581,6 +3610,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3708,30 +3743,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3739,15 +3770,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3777,20 +3808,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3799,33 +3825,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3834,15 +3860,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4106,24 +4132,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4266,6 +4293,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5126,6 +5173,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5417,6 +5470,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6330,7 +6387,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/bn/LC_MESSAGES/django.po b/plinth/locale/bn/LC_MESSAGES/django.po index f0527da62..ce6356e4d 100644 --- a/plinth/locale/bn/LC_MESSAGES/django.po +++ b/plinth/locale/bn/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -141,115 +141,127 @@ msgid "{app} (No data to backup)" msgstr "" #: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/templates/backups_delete.html:18 +#: plinth/modules/ikiwiki/forms.py:15 +#: plinth/modules/networks/templates/connection_show.html:63 +#: plinth/modules/sharing/templates/sharing.html:37 +msgid "Name" +msgstr "" + +#: plinth/modules/backups/forms.py:53 +msgid "(Optional) Set a name for this backup archive" +msgstr "" + +#: plinth/modules/backups/forms.py:56 msgid "Included apps" msgstr "" -#: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/forms.py:56 msgid "Apps to include in the backup" msgstr "" -#: plinth/modules/backups/forms.py:66 +#: plinth/modules/backups/forms.py:70 msgid "Select the apps you want to restore" msgstr "" -#: plinth/modules/backups/forms.py:79 +#: plinth/modules/backups/forms.py:83 msgid "Upload File" msgstr "" -#: plinth/modules/backups/forms.py:81 +#: plinth/modules/backups/forms.py:85 msgid "Backup files have to be in .tar.gz format" msgstr "" -#: plinth/modules/backups/forms.py:82 +#: plinth/modules/backups/forms.py:86 msgid "Select the backup file you want to upload" msgstr "" -#: plinth/modules/backups/forms.py:88 +#: plinth/modules/backups/forms.py:92 msgid "Repository path format incorrect." msgstr "" -#: plinth/modules/backups/forms.py:95 +#: plinth/modules/backups/forms.py:99 #, python-brace-format msgid "Invalid username: {username}" msgstr "" -#: plinth/modules/backups/forms.py:105 +#: plinth/modules/backups/forms.py:109 #, python-brace-format msgid "Invalid hostname: {hostname}" msgstr "" -#: plinth/modules/backups/forms.py:109 +#: plinth/modules/backups/forms.py:113 #, python-brace-format msgid "Invalid directory path: {dir_path}" msgstr "" -#: plinth/modules/backups/forms.py:115 +#: plinth/modules/backups/forms.py:119 msgid "Encryption" msgstr "" -#: plinth/modules/backups/forms.py:116 +#: plinth/modules/backups/forms.py:120 msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" -#: plinth/modules/backups/forms.py:120 plinth/modules/networks/forms.py:262 +#: plinth/modules/backups/forms.py:124 plinth/modules/networks/forms.py:262 msgid "Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:121 +#: plinth/modules/backups/forms.py:125 msgid "Passphrase; Only needed when using encryption." msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Confirm Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Repeat the passphrase." msgstr "" -#: plinth/modules/backups/forms.py:135 +#: plinth/modules/backups/forms.py:139 msgid "The entered encryption passphrases do not match" msgstr "" -#: plinth/modules/backups/forms.py:139 +#: plinth/modules/backups/forms.py:143 msgid "Passphrase is needed for encryption." msgstr "" -#: plinth/modules/backups/forms.py:174 +#: plinth/modules/backups/forms.py:178 msgid "Select Disk or Partition" msgstr "" -#: plinth/modules/backups/forms.py:175 +#: plinth/modules/backups/forms.py:179 msgid "Backups will be stored in the directory FreedomBoxBackups" msgstr "" -#: plinth/modules/backups/forms.py:184 +#: plinth/modules/backups/forms.py:188 msgid "SSH Repository Path" msgstr "" -#: plinth/modules/backups/forms.py:185 +#: plinth/modules/backups/forms.py:189 msgid "" "Path of a new or existing repository. Example: user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -346,13 +358,6 @@ msgstr "" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "" @@ -394,7 +399,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -485,87 +490,87 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -638,8 +643,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -654,24 +659,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1286,8 +1299,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1406,17 +1419,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1472,6 +1485,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2561,6 +2586,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2601,36 +2630,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3574,6 +3603,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3701,30 +3736,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3732,15 +3763,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3770,20 +3801,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3792,33 +3818,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3827,15 +3853,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4099,24 +4125,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4259,6 +4286,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5117,6 +5164,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5408,6 +5461,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6317,7 +6374,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/cs/LC_MESSAGES/django.po b/plinth/locale/cs/LC_MESSAGES/django.po index 75b10fb76..a40fa5a6a 100644 --- a/plinth/locale/cs/LC_MESSAGES/django.po +++ b/plinth/locale/cs/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-29 18:41+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Czech user@host:~/path/to/repo/" @@ -247,11 +261,11 @@ msgstr "" "Popis umístění nového nebo existujícího repozitáře. Příklad: user@host:~/" "path/to/repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Heslo SSH serveru" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -259,11 +273,11 @@ msgstr "" "Heslo SSH serveru.
Na klíčích založené SSH ověřování totožnosti není " "ještě možné." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Repozitář se zálohou už na protějšku existuje." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Vyberte ověřený SSH veřejný klíč" @@ -367,13 +381,6 @@ msgstr "Vytvořit repozitář" msgid "Delete this archive permanently?" msgstr "Nevratně smazat tento zachycený archiv?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Název" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Čas" @@ -416,7 +423,7 @@ msgstr "Stáhnout" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Obnovit" @@ -528,87 +535,87 @@ msgstr "Ověřit stroj" msgid "Archive created." msgstr "Archiv vytvořen." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Smazat archiv" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archiv smazán." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Nahrát zálohu a obnovit z ní" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Soubory obnovené ze zálohy." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Nebyl nalezen žádný soubor se zálohou." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Obnovit z nahraného souboru" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "Nejsou k dispozici žádná další úložiště pro přidání repozitáře." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Vytvořit repozitář pro zálohy" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Vytvořit repozitář pro zálohy na protějšku" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Přidán nový vzdálený SSH repozitář." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Ověřit SSH klíč stroje" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH stroj už je ověřen." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH stroj ověřen." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "Veřejný klíč SSH stroje se nepodařilo ověřit." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Ověření vůči vzdálenému serveru se nezdařilo." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Chyba při navazování spojení se serverem: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Repozitář odstraněn." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Odebrat repozitář" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Repozitář odebrán. Zálohy jako takové smazány nebyly." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Odpojení se nezdařilo!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Připojení (mount) se nezdařilo" @@ -695,8 +702,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Nastavení aktualizováno" @@ -715,6 +722,14 @@ msgstr "" "terminál pro operace na příkazovém řádku." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -729,18 +744,18 @@ msgstr "" "\"{users_url}\">uživatele s účtem na {box_name}, náležejícím do skupiny " "admin." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Správa serveru" @@ -1469,8 +1484,8 @@ msgstr "O systému" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1612,21 +1627,21 @@ msgstr "" msgid "Firewall" msgstr "Brána firewall" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "%(service_name)s is available only on internal networks." msgid "Port {name} ({details}) available for internal networks" msgstr "" "Služba %(service_name)s je k dispozici pouze na vnitřních sítích." -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "%(service_name)s is available only on internal networks." msgid "Port {name} ({details}) available for external networks" msgstr "" "Služba %(service_name)s je k dispozici pouze na vnitřních sítích." -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1690,6 +1705,18 @@ msgstr "" "také povolena na bráně firewall a když nějako službu vypnete, je také " "zakázána na bráně firewall." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, fuzzy, python-brace-format #| msgid "" @@ -2988,6 +3015,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -3028,7 +3059,7 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -3038,7 +3069,7 @@ msgstr "" "velkých souborů. Může se účastnit vícero peer-to-peer sítí, včetně eDonkey, " "Kademlia, Overnet, BitTorrent a DirectConnect." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3049,23 +3080,23 @@ msgstr "" "ovládat prostřednictvím libovolné mobilní či desktopové nadstavby nebo přes " "rozhraní telnet. Viz příručka." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" "Na {box_name}, stažené soubory se nacházejí ve složce /var/lib/mldonkey/ ." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Stahovat soubory pomocí eDonkey aplikací" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Pee-to-peer sdílení souborů" @@ -4093,6 +4124,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4229,31 +4266,27 @@ msgstr "" "zvýšení zabezpečení a anonymity je také možné přistupovat k ostatku " "Internetu prostřednictvím {box_name}." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Virtuální soukromá síť" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "Stáhnout si profil" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Zapnout OpenVPN server" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4264,15 +4297,15 @@ msgstr "" "opravdu dlouhý čas. V závislosti na rychlosti vašeho %(box_name)s to může " "trvat i hodiny. Pokud je nastavování přerušeno, je možné ho spustit znovu." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Zahájit nastavování" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "Nastavování OpenVPN je spuštěné" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4318,20 +4351,15 @@ msgstr "" msgid "Download my profile" msgstr "Stáhnout si svůj profil" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Nastavování dokončeno." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Nastavování se nezdařilo." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Nastavení se nezměnila" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4343,19 +4371,19 @@ msgstr "" "němu nejste připojení napřímo. Potřebujete ho pouze když jsou služby služby " "vašeho {box_name} nedostupné z Internetu. To zahrnuje následující situace:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} se nachází za omezující bránou firewall." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} je připojený k (bezdrátovému) směrovači, který není ve vaší " "správě." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4363,7 +4391,7 @@ msgstr "" "Váš poskytovatel připojení vám neposkytuje vnější (veřejnou) IP adresu a " "namísto toho poskytuje připojení prostřednictvím NAT překladu." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4371,11 +4399,11 @@ msgstr "" "Váš poskytovatel připojení vám neposkytuje pevnou IP adresu a ta se proto " "mění pokaždé, když se připojíte k Internetu." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Váš poskytovatel připojení k Internetu omezuje příchozí spojení." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4395,15 +4423,15 @@ msgstr "" "\">pagekite.net. V budoucnu si pro toto může být možné s kamarádem " "smluvit využití jeho {box_name}." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Viditelnost na veřejnosti" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "PageKite doména" @@ -4712,12 +4740,18 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale je CalDAV a CardDAV server. Umožňuje synchronizaci a sdílení " "plánovacích kalendářů a adresáře kontaktů. Pro používání Radicale, je třeba " @@ -4725,7 +4759,7 @@ msgstr "" "a>. K Radicale je možné přistupovat pomocí libovolného uživatelského účtu na " "{box_name}." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4735,12 +4769,12 @@ msgstr "" "nových kalendářů a adresářů kontaktů. Nepodporuje přidávání událostí či " "kontaktů, to je třeba dělat v tomu určeném klientovi." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Kalendář a adresář kontaktů" @@ -4923,6 +4957,30 @@ msgstr "" msgid "Network File Storage" msgstr "Distribuované souborové úložiště" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "IRC Client" +msgid "Android Samba Client" +msgstr "IRC klient" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "Kalendář GNOME" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5916,6 +5974,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Zvětšit kořenový oddíl" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6273,6 +6337,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "Tor SOCKS port je k dispozici na vašem %(box_name)s na TCP portu 9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Nastavení se nezměnila" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7333,8 +7401,11 @@ msgid "Mailing list" msgstr "Poštovní konference" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" "Služba %(service_name)s je k dispozici pouze na vnitřních sítích." @@ -7420,6 +7491,9 @@ msgstr "%(percentage)s%% dokončeno" msgid "Gujarati" msgstr "gudžarátština" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Zapnout OpenVPN server" + #~ msgid "active" #~ msgstr "aktivní" @@ -7998,9 +8072,6 @@ msgstr "gudžarátština" #~ msgid "Archive name" #~ msgstr "Název archivu" -#~ msgid "Name for new backup archive." -#~ msgstr "Název pro nový zálohový archiv." - #~ msgid "Invalid archive name" #~ msgstr "Neplatný název archivu" diff --git a/plinth/locale/da/LC_MESSAGES/django.po b/plinth/locale/da/LC_MESSAGES/django.po index 22d8c707b..d2a961399 100644 --- a/plinth/locale/da/LC_MESSAGES/django.po +++ b/plinth/locale/da/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2016-07-03 21:44+0000\n" "Last-Translator: Mikkel Kirkgaard Nielsen \n" "Language-Team: Danish user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 #, fuzzy #| msgid "Save Password" msgid "SSH server password" msgstr "Gem Kodeord" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -399,13 +411,6 @@ msgstr "Opret Bruger" msgid "Delete this archive permanently?" msgstr "Slet bruger permanent?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Navn" - #: plinth/modules/backups/templates/backups_delete.html:19 #, fuzzy #| msgid "Time Zone" @@ -458,7 +463,7 @@ msgstr "downloader" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 #, fuzzy #| msgid "reStore" msgid "Restore" @@ -559,99 +564,99 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 #, fuzzy #| msgid "Delete" msgid "Delete Archive" msgstr "Slet" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 #, fuzzy #| msgid "{name} deleted." msgid "Archive deleted." msgstr "{name} slettet." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create User" msgid "Create backup repository" msgstr "Opret Bruger" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 #, fuzzy #| msgid "Create User" msgid "Added new remote SSH repository." msgstr "Opret Bruger" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing application: {error}" msgid "Error establishing connection to server: {}" msgstr "Kunne ikke installere applikation: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 #, fuzzy #| msgid "packages not found" msgid "Repository removed." msgstr "pakker ikke fundet" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -736,8 +741,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Konfiguration opdateret" @@ -752,6 +757,14 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Tiny Tiny RSS will be available from /" @@ -763,18 +776,18 @@ msgstr "" "Når aktiveret, vil Tiny Tiny RSS være tilgængelige på stien /tt-rss på webserveren." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 #, fuzzy #| msgid "Server domain" msgid "Server Administration" @@ -1498,8 +1511,8 @@ msgstr "Om" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1639,19 +1652,19 @@ msgstr "" msgid "Firewall" msgstr "Firewall" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for internal networks" msgstr "Tjenestesøgningstjenesten er ikke aktiv" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for external networks" msgstr "Tjenestesøgningstjenesten er ikke aktiv" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1716,6 +1729,18 @@ msgstr "" "også blive åbnet i firewallen, og når du deaktiverer en tjeneste blokeres " "den igen." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -3016,6 +3041,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 #, fuzzy #| msgid "Mumble Voice Chat Server" @@ -3058,38 +3087,38 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 #, fuzzy #| msgid "Monkeysphere" msgid "MLDonkey" msgstr "Monkeysphere" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 #, fuzzy #| msgid "Enable Shaarli" msgid "Peer-to-peer File Sharing" @@ -4141,6 +4170,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s Setup" @@ -4278,34 +4313,30 @@ msgstr "" "af {box_name}. Du kan også tilgå resten af internettet igennem {box_name} " "for øget sikkerhed og anonymitet." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 #, fuzzy #| msgid "OpenVPN" msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 #, fuzzy #| msgid "Virtual Private Network (OpenVPN)" msgid "Virtual Private Network" msgstr "Virtuelt Privat Netværk (OpenVPN)" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Aktiver OpenVPN-server" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4316,15 +4347,15 @@ msgstr "" "meget lang tid. Afhængig af hvor hurtig din %(box_name)s er, kan det tage " "flere timer. Hvis processen afbrydes kan den blot genstartes." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Start opsætning" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "OpenVPN-opsætning kører" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4372,20 +4403,15 @@ msgstr "" msgid "Download my profile" msgstr "Hent min profil" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Opsætning færdig." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Opsætning fejlede." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Indstilling uændret" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4398,19 +4424,19 @@ msgstr "" "hvis {box_name} tjenester ikke kan nås fra resten af internettet. Dette " "inkluderer de følgende situationer:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} er bag en restriktiv firewall." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} er forbundet til en (trådløs) router som du ikke selv " "kontrollerer." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4418,7 +4444,7 @@ msgstr "" "Din internetudbyder tildeler dig ikke en ekstern IP-adresse, men giver dig " "forbindelse gennem NAT." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 #, fuzzy #| msgid "" #| "Your ISP does not provide you a static IP address and your IP address " @@ -4430,11 +4456,11 @@ msgstr "" "Din internetudbyder tildeler dig ikke en fast IP-adresse, og din IP-adresse " "ændres hver gang du fobinder til nettet." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Din internetudbyder begrænser indgående forbindelser." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4454,19 +4480,19 @@ msgstr "" "net. I fremtiden vil det måske blive muligt at bruge din vens {box_name} " "til dette." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 #, fuzzy #| msgid "Pagekite" msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 #, fuzzy #| msgid "Public Visibility (PageKite)" msgid "Public Visibility" msgstr "Offentlig Tilgængelighed (PageKite)" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -4789,9 +4815,10 @@ msgstr "" #| "any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale er en CalDAV og CardDAV-server. Den gør det muligt at synkronisere " "og dele planlægnings og kontakt-data. For at kunne anvende Radicale har man " @@ -4799,19 +4826,19 @@ msgstr "" "carddav-clients\">understøttet klient-applikation. Radicale kan tilgås " "af enhver bruger der har et log ind til {box_name}." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 #, fuzzy #| msgid "Calendar and Addressbook (Radicale)" msgid "Calendar and Addressbook" @@ -4987,6 +5014,28 @@ msgstr "" msgid "Network File Storage" msgstr "Netværkstidsserver" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Quassel IRC Client" +msgid "Android Samba Client" +msgstr "Quassel IRC-klient" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5976,6 +6025,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Udvid Rod-partition" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6308,6 +6363,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "En Tor SOCKS-port er tilgængelig på din %(box_name)s TCP-port 9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Indstilling uændret" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7370,7 +7429,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, fuzzy, python-format #| msgid "Service discovery server is not running" -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "Tjenestesøgningstjenesten er ikke aktiv" #: plinth/templates/internal-zone.html:17 @@ -7448,6 +7509,9 @@ msgstr "%(percentage)s%% færdig" msgid "Gujarati" msgstr "" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Aktiver OpenVPN-server" + #, fuzzy #~| msgid "Inactive" #~ msgid "active" diff --git a/plinth/locale/de/LC_MESSAGES/django.po b/plinth/locale/de/LC_MESSAGES/django.po index 760826730..6800604a5 100644 --- a/plinth/locale/de/LC_MESSAGES/django.po +++ b/plinth/locale/de/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-11 10:41+0000\n" "Last-Translator: Michael Breidenbach \n" "Language-Team: German user@host:~/path/to/repo/" @@ -250,11 +264,11 @@ msgstr "" "Pfad eines neuen oder existierenden Archivs. Beispiel: " "benutzer@hostrechner:~/pfad/zum/archiv/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH-Server-Passwort" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -262,11 +276,11 @@ msgstr "" "Passwort des SSH-Hostrechners.
SSH-Schlüssel-basierte Authentifizierung " "ist noch nicht möglich." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Remote-Backup-Archiv existiert bereits." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Wähle verifizierten öffentlichen SSH-Schlüssel" @@ -370,13 +384,6 @@ msgstr "Archiv anlegen" msgid "Delete this archive permanently?" msgstr "Archiv endgültig löschen?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Name" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Zeit" @@ -420,7 +427,7 @@ msgstr "Herunterladen" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Wiederherstellen" @@ -532,90 +539,90 @@ msgstr "Host verifizieren" msgid "Archive created." msgstr "Archiv angelegt." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Archiv löschen" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archiv gelöscht." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Hochladen und Wiederherstellen einer Sicherung" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Dateien aus Backup wiederhergestellt." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Keine Sicherungsdatei gefunden." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Wiederherstellen aus hochgeladener Datei" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" "Es sind keine zusätzlichen Festplatten verfügbar, um ein Repository " "hinzuzufügen." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Backup-Repository erstellen" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Remote-Backup-Archiv anlegen" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Neue Remote-SSH-Archiv hinzugefügt." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Verifiziere SSH-Schlüssel des Hosts" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH-Host bereits verifiziert." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH-Host verifiziert." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" "Der öffentliche SSH-Schlüssel des Hosts konnte nicht verifiziert werden." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Authentifizierung am Server fehlgeschlagen." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Fehler beim Verbinden mit Server: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Archiv gelöscht." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Archiv entfernen" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Repository entfernt. Backups wurden nicht gelöscht." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Aushängen fehlgeschlagen!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Einhängen fehlgeschlagen" @@ -696,8 +703,8 @@ msgstr "IP-Adresse und Domänen aktualisieren" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Konfiguration aktualisiert" @@ -717,6 +724,14 @@ msgstr "" "einzugeben." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -725,7 +740,7 @@ msgstr "" "Auf sie kann von jedem Benutzer auf der " "{box_name} zugegriffen werden, der zur Administratorgruppe gehören." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -734,12 +749,12 @@ msgstr "" "funktioniert nicht, wenn auf eine IP-Adresse als Teil der URL zugegriffen " "wird." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Serververwaltung" @@ -1464,8 +1479,8 @@ msgstr "Über" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1611,17 +1626,17 @@ msgstr "" msgid "Firewall" msgstr "Firewall" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port -Name {name}({details}) für interne Netzwerke verfügbar" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port -Name {name} ({details}) für externe Netzwerke verfügbar" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port -Name {name} ({details}) für externe Netzwerke nicht verfügbar" @@ -1684,6 +1699,18 @@ msgstr "" "aktivieren, wird dieser in der Firewall ebenfalls aktiviert und wenn Sie " "einen Dienst deaktivieren, wird dieser ebenso in der Firewall deaktiviert." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2996,6 +3023,10 @@ msgstr "" msgid "Media streaming server" msgstr "Medien-Streaming-Server" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "Einfacher Medienserver" @@ -3042,7 +3073,7 @@ msgstr "Das angegebene Verzeichnis ist nicht vorhanden." msgid "Updated media directory" msgstr "Aktualisiertes Medienverzeichnis" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -3052,7 +3083,7 @@ msgstr "" "auszutauschen. Es kann in mehreren Peer-to-Peer-Netzwerken teilnehmen, unter " "anderem eDonkey, Kademlia, Overnet, BitTorrent und DirectConnect." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3063,7 +3094,7 @@ msgstr "" "der separaten mobilen oder Desktop-Oberflächen oder über Telnet steuern. " "Siehe Benutzerhandbuch." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." @@ -3071,16 +3102,16 @@ msgstr "" "Auf {box_name} können heruntergeladene Dateien im Verzeichnis /var/lib/" "mldonkey/ gefunden werden." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Dateien mit eDonkey herunterladen" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Peer-to-Peer-Datenaustausch" @@ -4184,6 +4215,12 @@ msgstr "" "Ihre Internetverbindung ist direkt mit Ihren %(box_name)s verbunden und es " "gibt keine anderen Geräte im Netzwerk." +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -4339,31 +4376,27 @@ msgstr "" "{box_name} erlangen. Sie können auch auf das Internet via {box_name} für " "zusätzliche Sicherheit und Anonymität zugreifen." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Virtuelles Privates Netzwerk" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "Profil herunterladen" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "OpenVPN-Server einschalten" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "Tunnelblick" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4375,15 +4408,15 @@ msgstr "" "dauern. Wenn das Einrichten unterbrochen wird, können Sie es erneut zu " "starten." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Einrichten beginnen" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "Einrichtung von OpenVPN läuft" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4423,20 +4456,15 @@ msgstr "" msgid "Download my profile" msgstr "Mein Profil herunterladen" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Einrichtung beendet." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Einrichtung fehlgeschlagen." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Einstellung unverändert" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4449,19 +4477,19 @@ msgstr "" "die Dienste Ihrer {box_name} vom Internet nicht erreichbar sind. Dies " "umfasst folgende Situationen:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} ist hinter einer eingeschränkten Firewall." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} ist mit einem (wireless)-Router verbunden, den Sie nicht " "kontrollieren." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4469,7 +4497,7 @@ msgstr "" "Ihr ISP bietet Ihnen keine externe IP-Adresse, sondern statt dessen eine " "Internetverbindung über NAT." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4477,11 +4505,11 @@ msgstr "" "Ihr ISP bietet keine statische IP-Adresse und Ihre IP-Adresse ändert sich " "immer, wenn Sie sich mit dem Internet verbinden." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Ihr ISP schränkt eingehende Verbindungen ein." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4495,15 +4523,15 @@ msgstr "" "\"https://pagekite.net\">pagekite.net. In der Zukunft könnte es möglich " "sein, hierfür die {box_name} eines Freundes zu nutzen." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Öffentliche Sichtbarkeit" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "PageKite Domäne" @@ -4809,12 +4837,18 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale ist ein CalDav- und CarDAV-Server. Er ermöglicht das " "Synchronisieren und Teilen von Zeitplänen und Kontaktdaten. Um Radicale zu " @@ -4822,7 +4856,7 @@ msgstr "" "Client Software notwendig. Radicale kann von jedem Benutzer mit einem " "{box_name}-Konto verwendet werden." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4833,12 +4867,12 @@ msgstr "" "und zu bearbeiten, benötigst du ein entsprechendes Programm (z. B. " "Thunderbird Lightning, KOrganizer …)." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Kalender und Adressbuch" @@ -5026,6 +5060,30 @@ msgstr "Samba" msgid "Network File Storage" msgstr "Netzwerk Zeit-Server" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Add Client" +msgid "Android Samba Client" +msgstr "Client hinzufügen" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "GNOME Calendar" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5994,6 +6052,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Erweitern der Root-Partition" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6346,6 +6410,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "Tor SOCKS-Port ist auf Ihrer %(box_name)s auf TCP port 9050 verfügbar." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Einstellung unverändert" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7359,8 +7427,11 @@ msgid "Mailing list" msgstr "Mailingliste" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" "Dienst %(service_name)s ist nur im internen Netzwerk erreichbar." @@ -7442,6 +7513,9 @@ msgstr "%(percentage)s %% abgeschlossen" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Enable OpenVPN server" +#~ msgstr "OpenVPN-Server einschalten" + #~ msgid "active" #~ msgstr "aktiv" @@ -8032,9 +8106,6 @@ msgstr "Gujarati" #~ msgid "Archive name" #~ msgstr "Archivname" -#~ msgid "Name for new backup archive." -#~ msgstr "Name für das neue Backup-Archiv." - #~ msgid "Invalid archive name" #~ msgstr "Ungültiger Archiv-Name" diff --git a/plinth/locale/django.pot b/plinth/locale/django.pot index 9f02dec18..c1a30128c 100644 --- a/plinth/locale/django.pot +++ b/plinth/locale/django.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -140,115 +140,127 @@ msgid "{app} (No data to backup)" msgstr "" #: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/templates/backups_delete.html:18 +#: plinth/modules/ikiwiki/forms.py:15 +#: plinth/modules/networks/templates/connection_show.html:63 +#: plinth/modules/sharing/templates/sharing.html:37 +msgid "Name" +msgstr "" + +#: plinth/modules/backups/forms.py:53 +msgid "(Optional) Set a name for this backup archive" +msgstr "" + +#: plinth/modules/backups/forms.py:56 msgid "Included apps" msgstr "" -#: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/forms.py:56 msgid "Apps to include in the backup" msgstr "" -#: plinth/modules/backups/forms.py:66 +#: plinth/modules/backups/forms.py:70 msgid "Select the apps you want to restore" msgstr "" -#: plinth/modules/backups/forms.py:79 +#: plinth/modules/backups/forms.py:83 msgid "Upload File" msgstr "" -#: plinth/modules/backups/forms.py:81 +#: plinth/modules/backups/forms.py:85 msgid "Backup files have to be in .tar.gz format" msgstr "" -#: plinth/modules/backups/forms.py:82 +#: plinth/modules/backups/forms.py:86 msgid "Select the backup file you want to upload" msgstr "" -#: plinth/modules/backups/forms.py:88 +#: plinth/modules/backups/forms.py:92 msgid "Repository path format incorrect." msgstr "" -#: plinth/modules/backups/forms.py:95 +#: plinth/modules/backups/forms.py:99 #, python-brace-format msgid "Invalid username: {username}" msgstr "" -#: plinth/modules/backups/forms.py:105 +#: plinth/modules/backups/forms.py:109 #, python-brace-format msgid "Invalid hostname: {hostname}" msgstr "" -#: plinth/modules/backups/forms.py:109 +#: plinth/modules/backups/forms.py:113 #, python-brace-format msgid "Invalid directory path: {dir_path}" msgstr "" -#: plinth/modules/backups/forms.py:115 +#: plinth/modules/backups/forms.py:119 msgid "Encryption" msgstr "" -#: plinth/modules/backups/forms.py:116 +#: plinth/modules/backups/forms.py:120 msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" -#: plinth/modules/backups/forms.py:120 plinth/modules/networks/forms.py:262 +#: plinth/modules/backups/forms.py:124 plinth/modules/networks/forms.py:262 msgid "Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:121 +#: plinth/modules/backups/forms.py:125 msgid "Passphrase; Only needed when using encryption." msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Confirm Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Repeat the passphrase." msgstr "" -#: plinth/modules/backups/forms.py:135 +#: plinth/modules/backups/forms.py:139 msgid "The entered encryption passphrases do not match" msgstr "" -#: plinth/modules/backups/forms.py:139 +#: plinth/modules/backups/forms.py:143 msgid "Passphrase is needed for encryption." msgstr "" -#: plinth/modules/backups/forms.py:174 +#: plinth/modules/backups/forms.py:178 msgid "Select Disk or Partition" msgstr "" -#: plinth/modules/backups/forms.py:175 +#: plinth/modules/backups/forms.py:179 msgid "Backups will be stored in the directory FreedomBoxBackups" msgstr "" -#: plinth/modules/backups/forms.py:184 +#: plinth/modules/backups/forms.py:188 msgid "SSH Repository Path" msgstr "" -#: plinth/modules/backups/forms.py:185 +#: plinth/modules/backups/forms.py:189 msgid "" "Path of a new or existing repository. Example: user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -345,13 +357,6 @@ msgstr "" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "" @@ -393,7 +398,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -484,87 +489,87 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -637,8 +642,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -653,24 +658,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1285,8 +1298,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1405,17 +1418,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1471,6 +1484,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2560,6 +2585,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2600,36 +2629,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3573,6 +3602,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3700,30 +3735,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3731,15 +3762,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3769,20 +3800,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3791,33 +3817,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3826,15 +3852,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4098,24 +4124,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4258,6 +4285,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5116,6 +5163,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5407,6 +5460,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6316,7 +6373,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/el/LC_MESSAGES/django.po b/plinth/locale/el/LC_MESSAGES/django.po index a73612de8..23302136a 100644 --- a/plinth/locale/el/LC_MESSAGES/django.po +++ b/plinth/locale/el/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-29 18:41+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Greek user@host:~/path/to/repo/" @@ -255,11 +269,11 @@ msgstr "" "Το μονοπάτι από ένα νέο ή ένα υπάρχον αποθετήριο. Παράδειγμα: " "χρήστης@υπολογιστής:~/μονοπάτι/για/το/αποθετήριο/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Κωδικός πρόσβασης διακομιστή SSH" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -267,11 +281,11 @@ msgstr "" "Κωδικός πρόσβασης του διακομιστή SSH.
Ο έλεγχος ταυτότητας με κλειδί " "SSH δεν είναι ακόμα δυνατός." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Το απομακρυσμένο αποθετήριο αντιγράφων ασφαλείας υπάρχει ήδη." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Επιλογή εξακριβωμένου δημόσιου κλειδιού SSH" @@ -376,13 +390,6 @@ msgstr "Δημιουργία Αποθετηρίου" msgid "Delete this archive permanently?" msgstr "Διαγράψτε αυτό το αρχείο μόνιμα;" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Όνομα" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Ώρα" @@ -432,7 +439,7 @@ msgstr "Λήψη" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Επαναφορά" @@ -558,88 +565,88 @@ msgstr "Επαλήθευση υπολογιστή" msgid "Archive created." msgstr "Το αρχείο δημιουργήθηκε." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Διαγραφή αρχείου" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Το αρχείο διαγράφηκε." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Ανεβάστε και επαναφέρετε ένα αντίγραφο ασφαλείας" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Επαναφορά αρχείων από τα αντίγραφα ασφαλείας." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Δεν βρέθηκε αντίγραφο ασφαλείας." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Επαναφορά από το αρχείο που ανεβάσατε" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" "Δεν υπάρχουν επιπλέον δίσκοι διαθέσιμοι για να προσθέσετε ένα αποθετήριο." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Δημιουργία αποθετηρίου αντιγράφων ασφαλείας" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Δημιουργία απομακρυσμένου αποθετηρίου αντιγράφων ασφαλείας" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Προστέθηκε νέο απομακρυσμένο αποθετήριο SSH." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Επιβεβαίωση κεντρικού κλειδιού SSH" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "Ο υπολογιστής SSH έχει ήδη επαληθευτεί." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "Ο υπολογιστής SSH επιβεβαιώθηκε." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "Το δημόσιο κλειδί του υπολογιστή SSH δεν μπόρεσε να επαληθευτεί." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Ο έλεγχος ταυτότητας στον απομακρυσμένο διακομιστή απέτυχε." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Σφάλμα κατά τη δημιουργία σύνδεσης στο διακομιστή: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Το αποθετήριο αφαιρέθηκε." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Κατάργηση αποθετηρίου" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Αποθετήριο που καταργήθηκε. Τα αντίγραφα ασφαλείας δεν διαγράφηκαν." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Η αφαίρεση δίσκου απέτυχε!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Η προσθήκη δίσκου απέτυχε" @@ -730,8 +737,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Η ρύθμιση παραμέτρων Ενημερώθηκε" @@ -751,6 +758,14 @@ msgstr "" "παρέχει λειτουργίες κονσόλας σε ένα τερματικό στο πρόγραμμα περιήγησης ιστού." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -759,7 +774,7 @@ msgstr "" "To πρόγραμμα είναι προσβάσιμο στο URL από " "οποιοσδήποτε χρήστης στο {box_name} που ανήκει στην ομάδα διαχειριστών." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -768,12 +783,12 @@ msgstr "" "λειτουργήσει όταν αποκτάτε πρόσβαση χρησιμοποιώντας μια διεύθυνση IP ως " "μέρος της διεύθυνσης URL." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Διαχείριση διακομιστή" @@ -1502,8 +1517,8 @@ msgstr "Σχετικά με" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1650,17 +1665,17 @@ msgstr "" msgid "Firewall" msgstr "Firewall (τείχος προστασίας)" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Θύρα {name} ({details}) διαθέσιμη για εσωτερικά δίκτυα" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Η θύρα {name} ({details}) είναι διαθέσιμη για εξωτερικά δίκτυα" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Η θύρα {name} ({details}) δεν είναι διαθέσιμη για εξωτερικά δίκτυα" @@ -1725,6 +1740,18 @@ msgstr "" "υπηρεσία, επιτρέπεται επίσης στο τείχος προστασίας και όταν απενεργοποιείτε " "μια υπηρεσία είναι επίσης απενεργοποιημένη στο τείχος προστασίας." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -3067,6 +3094,10 @@ msgstr "" msgid "Media streaming server" msgstr "Διακομιστής ροής πολυμέσων" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "Απλός διακομιστής πολυμέσων" @@ -3112,7 +3143,7 @@ msgstr "Ο καθορισμένος κατάλογος δεν υπάρχει." msgid "Updated media directory" msgstr "O κατάλογος πολυμέσων ενημερώθηκε" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -3123,7 +3154,7 @@ msgstr "" "πολλαπλά ομότιμα (peer-to-peer) δίκτυα όπως το eDonkey, Kademlia, Overnet, " "BitTorrent και DirectConnect." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3134,7 +3165,7 @@ msgstr "" "να το ελέγξουν μέσω οποιουδήποτε ξεχωριστού κινητού ή επιτραπέζιου " "υπολογιστή ή μιας διασύνδεσης Telnet. Δείτε το εγχειρίδιο." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." @@ -3142,16 +3173,16 @@ msgstr "" "Στο {box_name}, τα ληφθέντα αρχεία μπορούν να βρεθούν στον κατάλογο/var/lib/" "mldonkey/." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Λήψη αρχείων με χρήση των εφαρμογών eDonkey" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Διαμοιρασμός αρχείων σε ομότιμο δίκτυο (peer-to-peer)" @@ -4187,6 +4218,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4324,32 +4361,28 @@ msgstr "" "επίσης να αποκτήσετε πρόσβαση στο υπόλοιπο Internet μέσω του {box_name} για " "πρόσθετη ασφάλεια και ανωνυμία." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Εικονικό ιδιωτικό δίκτυο" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr " Λήψη προφίλ " -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Ενεργοποίηση διακομιστή OpenVPN" - #: plinth/modules/openvpn/manifest.py:48 #, fuzzy #| msgid "TunnelBlick" msgid "Tunnelblick" msgstr "TunnelBlick" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4361,15 +4394,15 @@ msgstr "" "να χρειαστούν και ώρες. Εάν η ρύθμιση διακοπεί, μπορείτε να την ξεκινήσετε " "ξανά." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Έναρξη εγκατάστασης" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "Η εγκατάσταση του OpenVPN εκτελείται" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4411,20 +4444,15 @@ msgstr "" msgid "Download my profile" msgstr "Λήψη του προφίλ μου" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Η εγκατάσταση ολοκληρώθηκε." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Η εγκατάσταση απέτυχε." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Οι ρυθμίσεις δεν άλλαξαν" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4437,19 +4465,19 @@ msgstr "" "υπηρεσίες δεν είναι προσβάσιμες από το υπόλοιπο Internet. Αυτό περιλαμβάνει " "τις ακόλουθες καταστάσεις:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "το {box_name} βρίσκεται πίσω από ένα περιορισμένο τείχος προστασίας." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "το {box_name} είναι συνδεδεμένο σε έναν (ασύρματο) δρομολογητή, τον οποίο " "δεν ελέγχετε." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4457,7 +4485,7 @@ msgstr "" "Ο παροχέας ιντερνετ δεν σας παρέχει εξωτερική διεύθυνση IP και αντίθετα " "παρέχει σύνδεση στο Internet μέσω δικτύου NAT." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4465,11 +4493,11 @@ msgstr "" "Ο παροχέας ιντερνετ δεν σας παρέχει μια στατική διεύθυνση IP και η διεύθυνση " "IP αλλάζει κάθε φορά που συνδέεστε στο Internet." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Ο παροχέας ιντερνετ περιορίζει τις εισερχόμενες συνδέσεις." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4483,15 +4511,15 @@ msgstr "" "παράδειγμα pagekite.net . Στο μέλλον " "μπορεί να είναι δυνατή η χρήση του {box_name} ενός φίλου σας για αυτό." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Δημόσια ορατότητα" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "Όνομα διαδικτύου Pagekite" @@ -4805,12 +4833,18 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Το Radicale είναι διακομιστής CalDAV και CardDAV. Αυτό επιτρέπει το " "συγχρονισμό και την κοινή χρήση μερολογίου και των επαφών. Για να " @@ -4818,7 +4852,7 @@ msgstr "" "clients/\">πελάτη . Το Radicale μπορεί να προσεγγιστεί από οποιονδήποτε " "χρήστη με {box_name} πιστοποιητικά." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4829,12 +4863,12 @@ msgstr "" "γεγονότων ή επαφών, το οποίο πρέπει να γίνει χρησιμοποιώντας ένα ξεχωριστό " "πελάτη." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Ημερολόγιο και βιβλίο διευθύνσεων" @@ -5030,6 +5064,30 @@ msgstr "Samba" msgid "Network File Storage" msgstr "Διανεμημένος χώρος αποθήκευσης αρχείων" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "IRC Client" +msgid "Android Samba Client" +msgstr "Πελάτης IRC" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "GNOME Calendar" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -6023,6 +6081,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Επεκτείνετε το διαμέρισμα root" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6382,6 +6446,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "Μια θύρα Tor SOCKS είναι διαθέσιμη στη θύρα 9050 του %(box_name)s σας." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Οι ρυθμίσεις δεν άλλαξαν" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7443,8 +7511,11 @@ msgid "Mailing list" msgstr "Λίστα ηλεκτρονικού ταχυδρομείου" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" "Η υπηρεσία %(service_name)s είναι διαθέσιμη μόνο σε εσωτερικά " "δίκτυα." @@ -7532,6 +7603,9 @@ msgstr "ολοκληρώθηκε το %(percentage)s%%" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Ενεργοποίηση διακομιστή OpenVPN" + #~ msgid "active" #~ msgstr "Ενεργό" diff --git a/plinth/locale/es/LC_MESSAGES/django.po b/plinth/locale/es/LC_MESSAGES/django.po index e091ef10b..3560111ab 100644 --- a/plinth/locale/es/LC_MESSAGES/django.po +++ b/plinth/locale/es/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-21 13:41+0000\n" "Last-Translator: Luis A. Arizmendi \n" "Language-Team: Spanish user@host:~/path/to/repo/" @@ -252,11 +266,11 @@ msgstr "" "Ruta al repositorio nuevo o existente. Ejemplo: usuario@host:~/ruta/al/" "repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Contraseña del servidor SSH" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -264,11 +278,11 @@ msgstr "" "Contraseña del servidor SSH.
La autenticación basada en clave SSH aún " "no es posible." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "El repositorio de copias de seguridad remoto ya existe." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Seleccione una clave pública SSH verificada" @@ -372,13 +386,6 @@ msgstr "Crear repositorio" msgid "Delete this archive permanently?" msgstr "¿Eliminar este archivo definitivamente?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Nombre" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Hora" @@ -420,7 +427,7 @@ msgstr "Descargar" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Restaurar" @@ -531,87 +538,87 @@ msgstr "Verificar anfitrión" msgid "Archive created." msgstr "Archivo creado." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Borrar archivo" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archivo borrado." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Subir y restaurar una copia de seguridad" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Archivos restaurados desde la copia de seguridad." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "No se encontraron copias de seguridad." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Restaurar desde la copia de seguridad subida" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "No hay más discos disponibles para añadir un repositorio." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Crear repositorio de copias de seguridad" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Crear repositorio de copias de seguridad remotas" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Añadido nuevo repositorio SSH remoto." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Verificar la clave de anfitrión SSH" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "Clave SSH de anfitrión verificada." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "Anfitrión SSH verificado." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "No se pudo verificar la clave pública SSH del anfitrión." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Ha fallado la autenticación en el servidor remoto." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Error al conectar con el servidor: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Repositorio eliminado." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Eliminar repositorio" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Repositorio dado de baja. Las copias de seguridad no se han borrado." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "¡No se pudo desmontar!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Montaje fallido" @@ -692,8 +699,8 @@ msgstr "Actualizar direcciones IP y dominios" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Configuración actualizada" @@ -712,6 +719,14 @@ msgstr "" "ofrece una terminal de consola basada en web." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -720,7 +735,7 @@ msgstr "" "Puede acceder cualquier usuario/a en {box_name} " "que pertenezca al grupo «admin»." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -728,12 +743,12 @@ msgstr "" "Cockpit requiere acceso a través de un nombre de dominio. Si se usa una " "dirección IP como parte de la URL no funcionará." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Administración del servidor" @@ -1450,8 +1465,8 @@ msgstr "Acerca de" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1593,17 +1608,17 @@ msgstr "" msgid "Firewall" msgstr "Cortafuegos" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Puerto {name}{details} disponible para redes internas" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Puerto {name}{details} disponible para redes externas" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Puerto {name}{details} no disponible para redes externas" @@ -1666,6 +1681,18 @@ msgstr "" "se autoriza en el firewall, y cuando lo desactiva también se desactiva en el " "firewall." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2962,6 +2989,10 @@ msgstr "" msgid "Media streaming server" msgstr "Servidor de emisión multimedia" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "Servidor multimedia básico" @@ -3006,7 +3037,7 @@ msgstr "La carpeta especificada no existe." msgid "Updated media directory" msgstr "Carpeta multimedia actualizada" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -3016,7 +3047,7 @@ msgstr "" "para intercambiar archivos grandes. Puede participar en múltiples redes de " "pares, incluyendo eDonkey, Kademlia, Overnet, BitTorrent y DirectConnect." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3027,7 +3058,7 @@ msgstr "" "también a través de cualquiera de las interfaces externas para móvil o " "escritorio, o de una interfaz «telnet». Vea el manual." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." @@ -3035,16 +3066,16 @@ msgstr "" "Los archivos descargados en {box_name} se encuentran en el directorio «/var/" "lib/mldonkey/»." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Descargar archivos usando aplicaciones para eDonkey" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Compartir archivos entre pares" @@ -4123,6 +4154,12 @@ msgstr "" "Su %(box_name)s se conecta directamente a Internet y no hay otros " "dispositivos en su red local." +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -4275,31 +4312,27 @@ msgstr "" "forma privada. También puede acceder a Internet a través de su {box_name} " "para añadir protección y anonimato." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Red privada virtual" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "Descargar perfil" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Activar servidor OpenVPN" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "Tunnelblick" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4311,15 +4344,15 @@ msgstr "" "llevar incluso horas terminarla. Si la configuración se interrumpe debería " "empezarla de nuevo." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Iniciar configuración" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "Se está ejecutando la configuración de OpenVPN" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4359,20 +4392,15 @@ msgstr "" msgid "Download my profile" msgstr "Descargar mi perfil" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Configuración completada." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Ha fallado la configuración." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Configuración sin cambio" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4385,18 +4413,18 @@ msgstr "" "servicios de su {box_name} no son accesibles desde Internet. Esto incluye " "las siguientes situaciones:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} está detrás de un firewall restringido." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} está conectado a un router (inalámbrico) que usted no controla." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4404,7 +4432,7 @@ msgstr "" "Su proveedor de servicio no le da una dirección IP externa y, por el " "contrario, le facilita conexión a Internet a través de un NAT." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4412,11 +4440,11 @@ msgstr "" "Su proveedor de servicios no le da una dirección IP estática por lo que su " "IP cambia cada vez que se conecta a Internet." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Su proveedor de servicios limita las conexiones entrantes." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4429,15 +4457,15 @@ msgstr "" "de servicios pagekite, por ejemplo pagekite." "net. En el futuro será posible usar su amigable {box_name} para esto." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Visibilidad pública" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "Dominio PageKite" @@ -4737,12 +4765,18 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale es un servidor CalDAV y CardDAV que le permite sincronizar y " "compartir su calendario y los datos de sus contactos. Para usar Radicale " @@ -4750,7 +4784,7 @@ msgstr "" "soportada. Cualquier persona autenticada en {box_name} puede acceder a " "Radicale." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4760,12 +4794,12 @@ msgstr "" "de nuevos calendarios y agendas. No soporta añadir eventos o contactos, que " "debe hacerse usando un cliente separado." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Calendario y Contactos" @@ -4948,6 +4982,30 @@ msgstr "Samba" msgid "Network File Storage" msgstr "Sistema de archivos en red" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Add Client" +msgid "Android Samba Client" +msgstr "Añadir cliente" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "Calendario GNOME" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5909,6 +5967,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Ampliar partición raíz" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6259,6 +6323,10 @@ msgstr "" "Un puerto SOCKS de Tor está disponible en su %(box_name)s en el puerto TCP " "9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Configuración sin cambio" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7262,8 +7330,11 @@ msgid "Mailing list" msgstr "Lista de correo" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "%(service_name)s solo está disponible en redes internas." #: plinth/templates/internal-zone.html:17 @@ -7344,6 +7415,9 @@ msgstr "%(percentage)s%% completado" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Activar servidor OpenVPN" + #~ msgid "active" #~ msgstr "Activa" @@ -7932,9 +8006,6 @@ msgstr "Gujarati" #~ msgid "Archive name" #~ msgstr "Nombre de archivo" -#~ msgid "Name for new backup archive." -#~ msgstr "Nombre para el nuevo archivo de copia de seguridad." - #~ msgid "Invalid archive name" #~ msgstr "Nombre de archivo no válido" diff --git a/plinth/locale/fa/LC_MESSAGES/django.po b/plinth/locale/fa/LC_MESSAGES/django.po index 7f71bb83f..d0133c59d 100644 --- a/plinth/locale/fa/LC_MESSAGES/django.po +++ b/plinth/locale/fa/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2016-08-12 15:51+0000\n" "Last-Translator: Masoud Abkenar \n" "Language-Team: Persian user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 #, fuzzy #| msgid "Please provide a password" msgid "SSH server password" msgstr "لطفاً یک رمز وارد کنید" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -388,13 +400,6 @@ msgstr "ساختن اتصال" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "نام" - #: plinth/modules/backups/templates/backups_delete.html:19 #, fuzzy #| msgid "Time Zone" @@ -446,7 +451,7 @@ msgstr "کتاب راهنمای {box_name}" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -541,95 +546,95 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 #, fuzzy #| msgid "Delete" msgid "Delete Archive" msgstr "پاک‌کردن" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 #, fuzzy #| msgid "{name} deleted." msgid "Archive deleted." msgstr "{name} پاک شد." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create Connection" msgid "Create backup repository" msgstr "ساختن اتصال" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing application: {error}" msgid "Error establishing connection to server: {}" msgstr "خطا هنگام نصب برنامه: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -714,8 +719,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "پیکربندی به‌روز شد" @@ -730,24 +735,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 #, fuzzy #| msgid "Administrator Account" msgid "Server Administration" @@ -1464,8 +1477,8 @@ msgstr "درباره" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1594,17 +1607,17 @@ msgstr "" msgid "Firewall" msgstr "فایروال" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1668,6 +1681,18 @@ msgstr "" "کارکرد فایروال خودکار است. وقتی که یک سرویس را فعال کنید آن سرویس در فایروال " "هم مجاز می‌شود و وقتی آن را غیرفعال کنید در فایروال هم مسدود می‌شود." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2915,6 +2940,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2955,37 +2984,37 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 #, fuzzy msgid "MLDonkey" msgstr "مانکی‌اسفیر" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -4017,6 +4046,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s Setup" @@ -4145,32 +4180,28 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 #, fuzzy #| msgid "Open" msgid "OpenVPN" msgstr "باز" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4178,15 +4209,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4216,20 +4247,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4238,33 +4264,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4273,15 +4299,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "Available Domains" msgid "PageKite Domain" @@ -4547,24 +4573,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4712,6 +4739,27 @@ msgstr "" msgid "Network File Storage" msgstr "واسط" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +msgid "Android Samba Client" +msgstr "برنامهٔ DNS متغیر (Dynamic DNS Client)" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5669,6 +5717,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "بزرگ‌کردن پارتیشن ریشه" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5969,6 +6023,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6942,7 +7000,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/fake/LC_MESSAGES/django.po b/plinth/locale/fake/LC_MESSAGES/django.po index 1d499dbe1..224403327 100644 --- a/plinth/locale/fake/LC_MESSAGES/django.po +++ b/plinth/locale/fake/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth 0.6\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2016-01-31 22:24+0530\n" "Last-Translator: Sunil Mohan Adapa \n" "Language-Team: Plinth Developers user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 #, fuzzy #| msgid "Save Password" msgid "SSH server password" msgstr "SAVE PASSWORD" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -406,13 +418,6 @@ msgstr "CREATE USER" msgid "Delete this archive permanently?" msgstr "DELETE USER PERMANENTLY?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "NAME" - #: plinth/modules/backups/templates/backups_delete.html:19 #, fuzzy #| msgid "Time Zone" @@ -465,7 +470,7 @@ msgstr "{box_name} MANUAL" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 #, fuzzy #| msgid "reStore" msgid "Restore" @@ -566,99 +571,99 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 #, fuzzy #| msgid "Delete" msgid "Delete Archive" msgstr "DELETE" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 #, fuzzy #| msgid "{name} deleted." msgid "Archive deleted." msgstr "{name} DELETED." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create User" msgid "Create backup repository" msgstr "CREATE USER" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 #, fuzzy #| msgid "Create User" msgid "Added new remote SSH repository." msgstr "CREATE USER" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing packages: {string} {details}" msgid "Error establishing connection to server: {}" msgstr "ERROR INSTALLING PACKAGES: {string} {details}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 #, fuzzy #| msgid "packages not found" msgid "Repository removed." msgstr "PACKAGES NOT FOUND" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -743,8 +748,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "CONFIGURATION UPDATED" @@ -759,6 +764,14 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, the blogs and wikis will be available from /IKIWIKI." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 #, fuzzy #| msgid "Server domain" msgid "Server Administration" @@ -1559,8 +1572,8 @@ msgstr "ABOUT" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1706,19 +1719,19 @@ msgstr "" msgid "Firewall" msgstr "FIREWALL" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for internal networks" msgstr "SERVICE DISCOVERY SERVER IS NOT RUNNING" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for external networks" msgstr "SERVICE DISCOVERY SERVER IS NOT RUNNING" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1783,6 +1796,18 @@ msgstr "" "ALSO PERMITTED IN THE FIREWALL AND WHEN YOU DISABLE A SERVICE IT IS ALSO " "DISABLED IN THE FIREWALL." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -3064,6 +3089,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 #, fuzzy #| msgid "Mumble Voice Chat Server" @@ -3106,38 +3135,38 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 #, fuzzy #| msgid "Monkeysphere" msgid "MLDonkey" msgstr "MONKEYSPHERE" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 #, fuzzy #| msgid "Enable Shaarli" msgid "Peer-to-peer File Sharing" @@ -4212,6 +4241,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s Setup" @@ -4357,34 +4392,30 @@ msgstr "" "YOU CAN ALSO ACCESS THE REST OF THE INTERNET VIA %(box_name)s FOR ADDED " "SECURITY AND ANONYMITY." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 #, fuzzy #| msgid "OpenVPN" msgid "OpenVPN" msgstr "OPENVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 #, fuzzy #| msgid "Virtual Private Network (OpenVPN)" msgid "Virtual Private Network" msgstr "VIRTUAL PRIVATE NETWORK (OPENVPN)" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "ENABLE OPENVPN SERVER" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4395,15 +4426,15 @@ msgstr "" "TIME. DEPENDING ON HOW FAST YOUR %(box_name)s IS, IT MAY EVEN TAKE HOURS. " "IF THE SETUP IS INTERRUPTED, YOU MAY START IT AGAIN." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "START SETUP" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "OPENVPN SETUP IS RUNNING" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4449,20 +4480,15 @@ msgstr "PROFILE IS SPECIFIC TO EACH USER OF %(box_name)s. KEEP IT A SECRET." msgid "Download my profile" msgstr "DOWNLOAD MY PROFILE" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "SETUP COMPLETED." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "SETUP FAILED." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "SETTING UNCHANGED" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, fuzzy, python-brace-format #| msgid "" #| "PageKite is a system for exposing %(box_name)s services when you don't " @@ -4480,13 +4506,13 @@ msgstr "" "SERVICES ARE UNREACHABLE FROM THE REST OF THE INTERNET. THIS INCLUDES THE " "FOLLOWING SITUATIONS:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, fuzzy, python-brace-format #| msgid "%(box_name)s is behind a restricted firewall." msgid "{box_name} is behind a restricted firewall." msgstr "%(box_name)s IS BEHIND A RESTRICTED FIREWALL." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, fuzzy, python-brace-format #| msgid "" #| "%(box_name)s is connected to a (wireless) router which you don't control." @@ -4494,7 +4520,7 @@ msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "%(box_name)s IS CONNECTED TO A (WIRELESS) ROUTER WHICH YOU DON'T CONTROL." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4502,7 +4528,7 @@ msgstr "" "YOUR ISP DOES NOT PROVIDE YOU AN EXTERNAL IP ADDRESS AND INSTEAD PROVIDES " "INTERNET CONNECTION THROUGH NAT." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 #, fuzzy #| msgid "" #| "Your ISP does not provide you a static IP address and your IP address " @@ -4514,11 +4540,11 @@ msgstr "" "YOUR ISP DOES NOT PROVIDE YOU A STATIC IP ADDRESS AND YOUR IP ADDRESS " "CHANGES EVERTIME YOU CONNECT TO INTERNET." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "YOUR ISP LIMITS INCOMING CONNECTIONS." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4537,19 +4563,19 @@ msgstr "" "PROVIDER, FOR EXAMPLE PAGEKITE.NET. IN " "FUTURE IT MIGHT BE POSSIBLE TO USE YOUR BUDDY'S %(box_name)s FOR THIS." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 #, fuzzy #| msgid "Pagekite" msgid "PageKite" msgstr "PAGEKITE" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 #, fuzzy #| msgid "Public Visibility (PageKite)" msgid "Public Visibility" msgstr "PUBLIC VISIBILITY (PAGEKITE)" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -4882,24 +4908,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -5080,6 +5107,28 @@ msgstr "" msgid "Network File Storage" msgstr "NETWORK TIME SERVER" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Quassel IRC Client" +msgid "Android Samba Client" +msgstr "QUASSEL IRC CLIENT" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -6061,6 +6110,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6402,6 +6457,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "A TOR SOCKS PORT IS AVAILABLE ON YOUR %(box_name)s ON TCP PORT 9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "SETTING UNCHANGED" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7462,7 +7521,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, fuzzy, python-format #| msgid "Service discovery server is not running" -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "SERVICE DISCOVERY SERVER IS NOT RUNNING" #: plinth/templates/internal-zone.html:17 @@ -7542,6 +7603,9 @@ msgstr "%(percentage)s%% COMPLETE" msgid "Gujarati" msgstr "" +#~ msgid "Enable OpenVPN server" +#~ msgstr "ENABLE OPENVPN SERVER" + #, fuzzy #~| msgid "Inactive" #~ msgid "active" diff --git a/plinth/locale/fr/LC_MESSAGES/django.po b/plinth/locale/fr/LC_MESSAGES/django.po index f045d0d1a..ac21ffee5 100644 --- a/plinth/locale/fr/LC_MESSAGES/django.po +++ b/plinth/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-21 13:41+0000\n" "Last-Translator: Etienne \n" "Language-Team: French user@host:~/path/to/repo/" @@ -251,11 +265,11 @@ msgstr "" "Chemin d'un dépôt, nouveau ou existant. Exemple : utilisateur@machine:~/" "chemin/vers/le/dépôt/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Mot de passe du serveur SSH" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -263,11 +277,11 @@ msgstr "" "Mot de passe du serveur SSH.
L’authentification par clé SSH n'est pas " "encore supportée." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Ce dépôt de sauvegarde distant existe déjà." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Sélectionnez une clé publique SSH vérifiée" @@ -372,13 +386,6 @@ msgstr "Créer un dépôt" msgid "Delete this archive permanently?" msgstr "Supprimer définitivement cette archive ?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Nom" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Heure" @@ -422,7 +429,7 @@ msgstr "Télécharger" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Restaurer" @@ -533,87 +540,87 @@ msgstr "Vérifier le serveur" msgid "Archive created." msgstr "Archive créée." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Supprimer l'archive" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archive supprimée." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Téléverser et restaurer une sauvegarde" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Les fichiers ont été restaurés de la sauvegarde." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Aucun fichier de sauvegarde n’a été trouvé." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Restaurer du fichier téléversé" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "Aucun disque supplémentaire n’est disponible pour ajouter un dépôt." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Créer un dépôt de sauvegarde" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Créer un dépôt de sauvegarde distant" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Ajouter un nouveau dépôt SSH distant." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Vérifier la clé d’authenticité du serveur SSH" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "Serveur SSH déjà vérifié." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "Serveur SSH vérifié." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "La clé publique d’authenticité du serveur SSH n’a pu être vérifiée." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "L'authentification sur le serveur distant a échoué." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Erreur lors de la connexion au serveur : {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Dépôt supprimé." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Supprimer ce dépôt" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Dépôt supprimé. Les sauvegardes n'ont pas été supprimées." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Le démontage a échoué !" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Le montage a échoué" @@ -694,8 +701,8 @@ msgstr "Rafraîchir l’adresse IP et les domaines" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Configuration mise à jour" @@ -715,6 +722,14 @@ msgstr "" "des opérations depuis une console." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -723,7 +738,7 @@ msgstr "" "Il peut être consulté par tout utilisateur " "faisant partie du groupe admin sur la {box_name}." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -731,12 +746,12 @@ msgstr "" "Cockpit nécessite que vous y accédiez depuis un nom de domaine. Il ne " "fonctionnera pas si vous y accédez en utilisant une adresse IP dans son URL." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Administration du serveur" @@ -1475,8 +1490,8 @@ msgstr "À propos" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1622,17 +1637,17 @@ msgstr "" msgid "Firewall" msgstr "Pare-feu" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) disponible pour les réseaux internes" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) disponible pour les réseaux externes" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} ({details}) non disponible pour les réseaux externes" @@ -1696,6 +1711,18 @@ msgstr "" "service, il est automatiquement permis par le pare-feu, si vous le " "désactivez, il est automatiquement désactivé dans le pare-feu." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2219,8 +2246,8 @@ msgstr "" "Voici les %(num_lines)s dernières lignes du journal d’état de cette " "interface web. Si vous voulez nous faire parvenir un rapport d’erreur, " "veuillez utiliser l’outil de suivi de tickets et attacher ce journal d’" -"état au rapport d’erreur." +"freedombox/issues\">outil de suivi de tickets et attacher ce journal " +"d’état au rapport d’erreur." #: plinth/modules/help/templates/statuslog.html:24 msgid "" @@ -3018,6 +3045,10 @@ msgstr "" msgid "Media streaming server" msgstr "Serveur de streaming de médias" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "Serveur de médias simple" @@ -3064,7 +3095,7 @@ msgstr "Le répertoire indiqué n’existe pas." msgid "Updated media directory" msgstr "Répertoire multimédia mis à jour" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -3074,7 +3105,7 @@ msgstr "" "pour s'échanger de gros fichiers. Elle peut participer à de nombreux réseaux " "de pair à pair dont eDonkey, Kademlia, Overnet, BitTorrent et DirectConnect." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3085,7 +3116,7 @@ msgstr "" "également l’utiliser depuis n'importe quel client sur téléphone ou " "ordinateur, ou depuis une interface telnet. Consultez le manuel." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." @@ -3093,16 +3124,16 @@ msgstr "" "Sur la {box_name}, les fichiers sont téléchargés dans le répertoire /var/lib/" "mldonkey/." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Fichiers téléchargés avec les applications eDonkey" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Partage de fichiers de pair à pair" @@ -4204,6 +4235,12 @@ msgstr "" "Votre %(box_name)s est directement connectée à Internet et il n’y a pas " "d'autre appareil sur le réseau." +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -4361,16 +4398,16 @@ msgstr "" "d’accéder au reste d’Internet au travers de la {box_name} pour une sécurité " "et un anonymat accrus." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Réseau privé virtuel" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" @@ -4378,15 +4415,11 @@ msgstr "" " Télécharger le profil" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Activer le serveur OpenVPN" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "Tunnelblick" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4398,15 +4431,15 @@ msgstr "" "peut prendre jusqu’à plusieurs heures. Si l'installation est interrompue, " "vous devrez la relancer intégralement." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Démarrer l’installation" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "L’installation d’OpenVPN est en cours" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4447,20 +4480,15 @@ msgstr "" msgid "Download my profile" msgstr "Télécharger mon profil" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Installation terminée." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Échec de l’installation." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Paramètre inchangé" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4474,18 +4502,18 @@ msgstr "" "reste de l'Internet. Cela se produit en général dans les situations " "suivantes :" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "La {box_name} est derrière un pare-feu restrictif." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "La {box_name} est connectée à un réseau (sans fil) que vous ne contrôlez pas." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4493,7 +4521,7 @@ msgstr "" "Votre FAI ne vous fournit pas d’adresse IP externe, mais une connexion " "Internet via une translation d’adresse réseau (NAT)." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4501,11 +4529,11 @@ msgstr "" "Votre FAI ne vous fournit pas une adresse IP statique, elle change à chaque " "fois que vous vous connectez à Internet." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Votre FAI limite les connexions entrantes." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4521,15 +4549,15 @@ msgstr "" "a>. Il se pourrait que dans le futur, l’utilisation de la {box_name} d’un " "ami pour cela soit également proposée." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Visibilité publique" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "Domaine PageKite" @@ -4834,12 +4862,18 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale est un serveur pour les protocoles d’édition de calendrier en ligne " "CalDAV et de carnet d'adresses CardDAV. Il permet de synchroniser et de " @@ -4848,7 +4882,7 @@ msgstr "" "nécessaire. N’importe quel utilisateur disposant d’un compte sur la " "{box_name} peut accéder à Radicale." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4859,12 +4893,12 @@ msgstr "" "l’ajout d'événements ou de contacts, qui doivent être réalisés avec un " "client dédié." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Agenda et carnet d’adresses" @@ -5053,6 +5087,30 @@ msgstr "Samba" msgid "Network File Storage" msgstr "Stockage de fichiers réseau" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Add Client" +msgid "Android Samba Client" +msgstr "Ajouter un client" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "Agenda GNOME" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -6029,6 +6087,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Étendre la partition racine" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6382,6 +6446,10 @@ msgstr "" "Un port SOCKS pour Tor est accessible sur votre %(box_name)s sur le port TCP " "9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Paramètre inchangé" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7400,8 +7468,11 @@ msgid "Mailing list" msgstr "Liste de discussion du projet" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" "%(service_name)s n'est disponible que sur les réseaux internes." @@ -7486,6 +7557,9 @@ msgstr "%(percentage)s%% effectué" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Activer le serveur OpenVPN" + #~ msgid "active" #~ msgstr "actif" @@ -8097,9 +8171,6 @@ msgstr "Gujarati" #~ msgid "Archive name" #~ msgstr "Nom de l'archive" -#~ msgid "Name for new backup archive." -#~ msgstr "Nom de la nouvelle archive de sauvegarde." - #~ msgid "Invalid archive name" #~ msgstr "Nom d'archive invalide" diff --git a/plinth/locale/gl/LC_MESSAGES/django.po b/plinth/locale/gl/LC_MESSAGES/django.po index 080caa731..79244ba7c 100644 --- a/plinth/locale/gl/LC_MESSAGES/django.po +++ b/plinth/locale/gl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2019-07-11 08:01+0000\n" "Last-Translator: Miguel A. Bouzada \n" "Language-Team: Galician user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -349,13 +361,6 @@ msgstr "" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "" @@ -397,7 +402,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -488,87 +493,87 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -641,8 +646,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -657,24 +662,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1289,8 +1302,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1409,17 +1422,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1475,6 +1488,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2564,6 +2589,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2604,36 +2633,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3577,6 +3606,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3704,30 +3739,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3735,15 +3766,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3773,20 +3804,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3795,33 +3821,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3830,15 +3856,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4102,24 +4128,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4262,6 +4289,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5122,6 +5169,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5413,6 +5466,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6326,7 +6383,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/gu/LC_MESSAGES/django.po b/plinth/locale/gu/LC_MESSAGES/django.po index 578661129..728075682 100644 --- a/plinth/locale/gu/LC_MESSAGES/django.po +++ b/plinth/locale/gu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2018-02-05 18:37+0000\n" "Last-Translator: drashti kaushik \n" "Language-Team: Gujarati user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 #, fuzzy #| msgid "Please provide a password" msgid "SSH server password" msgstr "કૃપા કરીને પાસવર્ડ આપો" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -366,13 +378,6 @@ msgstr "દસ્તાવેજીકરણ" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 #, fuzzy #| msgid "Time Zone" @@ -422,7 +427,7 @@ msgstr "માર્ગદર્શિકા ડાઉનલોડ" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -515,89 +520,89 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing application: {error}" msgid "Error establishing connection to server: {}" msgstr "એપ્લીકેશન પ્રસ્થાપિત કરતાં ભૂલ થઇ છે: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -677,8 +682,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "રૂપરેખાંકન સુધારાયુ" @@ -696,6 +701,14 @@ msgstr "" "આવશ્યક નથી. કન્સોલ કામગીરી માટે વેબ આધારિત ટર્મિનલ પણ ઉપલબ્ધ છે." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -706,18 +719,18 @@ msgstr "" "સાથે{box_name} લૉગિન દ્વારા ઍક્સેસ કરી શકાય છે. સંવેદનશીલ માહિતી અને વ્યવસ્થાપનની " "ક્ષમતાઓ એડમિન ગ્રૂપના વપરાશકર્તાઓ માટે મર્યાદિત છે." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "કોકપિટ" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "સર્વર સંચાલન" @@ -1408,8 +1421,8 @@ msgstr "વિશે" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1558,17 +1571,17 @@ msgstr "" msgid "Firewall" msgstr "ફાયરવોલ" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1630,6 +1643,18 @@ msgstr "" "ફાયરવૉલનું સંચાલન આપોઆપ છે. જ્યારે તમે સેવાને સક્ષમ કરો છો ત્યારે તેને ફાયરવૉલમાં પણ " "પરવાનગી છે અને જ્યારે તમે કોઈ સેવા અક્ષમ કરો છો ત્યારે તે ફાયરવૉલમાં પણ અક્ષમ થાય છે." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2757,6 +2782,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2797,38 +2826,38 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 #, fuzzy #| msgid "Download files using BitTorrent applications" msgid "Download files using eDonkey applications" msgstr "BitTorrent કાર્યક્રમોનો ઉપયોગ કરીને ફાઇલો ડાઉનલોડ કરો" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3782,6 +3811,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3909,30 +3944,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3940,15 +3971,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3978,20 +4009,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "સેટિંગ યથાવત" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4000,33 +4026,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4035,15 +4061,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4309,24 +4335,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4469,6 +4496,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5340,6 +5387,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5633,6 +5686,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "સેટિંગ યથાવત" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6584,7 +6641,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/hi/LC_MESSAGES/django.po b/plinth/locale/hi/LC_MESSAGES/django.po index c2790cdab..c446d2cd5 100644 --- a/plinth/locale/hi/LC_MESSAGES/django.po +++ b/plinth/locale/hi/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-04-03 20:11+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Hindi user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 #, fuzzy #| msgid "Save Password" msgid "SSH server password" msgstr "पासवर्ड सहेजें" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -389,13 +403,6 @@ msgstr "यूसर बनाये" msgid "Delete this archive permanently?" msgstr "इस पुरालेख हमेशा के लिया हटाईये?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "नाम" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "समय" @@ -443,7 +450,7 @@ msgstr "डाउनलोडिंग" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 #, fuzzy #| msgid "reStore" msgid "Restore" @@ -544,97 +551,97 @@ msgstr "" msgid "Archive created." msgstr "पुरालेख बनाया गया." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "पुरालेख हटाईये" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "पुरालेख हटा गया है." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 #, fuzzy #| msgid "Name for new backup archive." msgid "Upload and restore a backup" msgstr "नया बैकअप पुरालेख के लिये नाम." -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 #, fuzzy #| msgid "Name for new backup archive." msgid "No backup file found." msgstr "नया बैकअप पुरालेख के लिये नाम." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create Snapshot" msgid "Create backup repository" msgstr "स्नैपशॉट बनाइये" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 #, fuzzy #| msgid "Add new introducer" msgid "Added new remote SSH repository." msgstr "नया इंट्रोड्यूसर जोड़ें" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing application: {error}" msgid "Error establishing connection to server: {}" msgstr "एप्लिकेशन नहीं इंस्टॉल जा सकता: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 #, fuzzy #| msgid "The operation failed." msgid "Mounting failed" @@ -722,8 +729,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "कॉन्फ़िगरेशन अपडेट करें" @@ -741,6 +748,14 @@ msgstr "" "ज़रूरत नहीं है. कंट्रोल संचालन के लिये वेब आधारित कंसोल भी माैजूद है." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -756,18 +771,18 @@ msgstr "" "माैजूद होते है. यह कोई से एक {box_name} के सात पहुंच " "सकते हैं. निजी जानकारी आैर सिस्टम बदलने का योग्यता सिर्फ व्यवस्थापक लोग के पास है." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "कॉकपिट" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "सर्वर एडमिनिस्ट्रेशन" @@ -1485,8 +1500,8 @@ msgstr "के बारे में" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1630,19 +1645,19 @@ msgstr "" msgid "Firewall" msgstr "फ़ायरवॉल" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "%(service_name)s is available only on internal networks." msgid "Port {name} ({details}) available for internal networks" msgstr "%(service_name)s सिर्फ आंतरिक नेटवर्क्स पर उपलब्ध है." -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "%(service_name)s is available only on internal networks." msgid "Port {name} ({details}) available for external networks" msgstr "%(service_name)s सिर्फ आंतरिक नेटवर्क्स पर उपलब्ध है." -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1704,6 +1719,18 @@ msgstr "" "फ़ायरवॉल की ऑपरेशन स्वचालित है. जब आप एक सेवा सक्षम करते है, फ़ायरवॉल में भी अनुमति है और " "जब एक सेवा अक्षम करते है, फ़ायरवॉल में भी अक्षम करेगा." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, fuzzy, python-brace-format #| msgid "" @@ -2964,6 +2991,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -3004,40 +3035,40 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 #, fuzzy #| msgid "Download files using BitTorrent applications" msgid "Download files using eDonkey applications" msgstr "बिटटोरेंट एप्लिकेशन उपयोग कर फ़ाइल डाउनलोड करें" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 #, fuzzy #| msgid "Monkeysphere" msgid "MLDonkey" msgstr "मंकीसफीर" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 #, fuzzy #| msgid "File Sharing" msgid "Peer-to-peer File Sharing" @@ -4053,6 +4084,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4186,31 +4223,27 @@ msgstr "" "आंतरिक सर्विसस उपयोग करने के लिये. आप बाकी सब इंटरनेट {box_name} के जरिए उपयोग कर " "सकते हैं अगर अापको और सुरक्षा और गुमनामी चाहिये." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "ओपन वीपीएन" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "वर्चुअल प्राइवेट नेटवर्क" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "डाउनलोड प्रोफाइल" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "ओपनवीपीएन सर्वर सक्षम करें" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4221,15 +4254,15 @@ msgstr "" "इस पर निर्भर करता है कि आपका%(box_name)s कितना तेज़ है, ये घंटों भी लग सकते. अगर सेटअप " "बाधित हो गया, फिर से शरु कर सकता है." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "सटअप शुरु करें" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "ओपनवीपीएन सेटअप चल रहा है" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4274,20 +4307,15 @@ msgstr "प्रोफ़ाइल हर %(box_name)s यूसर के ल msgid "Download my profile" msgstr "मेरी प्रोफ़ाइल डाउनलोड करें" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "सेटअप पूरा हो गया." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "सेटअप विफल." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "सेटिंग स्थिर है" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4299,17 +4327,17 @@ msgstr "" "सीधा कनेक्शन नहीं है. इसके जरूरत है सिर्फ आपके {box_name} के सर्विसस बाकी इंटरनेट से पहुँच " "योग्य नहीं. इसमें इन स्थितियों को शामिल किया गया है:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} एक प्रतिबंधित फ़ायरवॉल के पीछे है." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "{box_name} एक (वायरलेस) रूटर से कनेक्टेड है जिसे आप नियंत्रित नहीं करते हैं." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4317,7 +4345,7 @@ msgstr "" "आपका ISP आपको एक बाहरी IP एड्रेस नहीं दता लेकिन NAT के माध्यम से इंटरनेट कनेक्शन प्रदान " "करता है." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4325,11 +4353,11 @@ msgstr "" "आपके ISP आपको एक स्थिर IP एड्रेस प्रदान नहीं करता है और आपके IP एड्रेस बदलाएग जब आप " "इंटरनेट से कनेक्ट होते हैं." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "आपके ISP आने वाले कनेक्शंसस को सीमित करता है." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4348,15 +4376,15 @@ msgstr "" "pagekite.net. भविष्य में अापका दोस्त का " "{box_name} इसके लिये उपयोग कर सकते हैं." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "पेजकइट" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "सार्वजनिक विसिबिलिटी" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -4662,31 +4690,37 @@ msgid "Quasseldroid" msgstr "क्वासेलड्रोइड" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "राडिकैल एक CalDAV और CardDAV सर्वर है. यह तुल्यकालन और शेड्यूलिंग और संपर्क डेटा साझा " "करना की अनुमति देता है. राडिकैल उपयोग करने के लिये, एक समर्थित क्लाइंट एप्लिकेशन कि जरुरत है. राडिकैल किसी {box_name} " "यूसर पहुंचा जा सकता है एक लॉगिन के साथ." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "राडिकैल" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "कैलेंडर और पता पुस्तिका" @@ -4872,6 +4906,30 @@ msgstr "" msgid "Network File Storage" msgstr "फ़ाइल स्टोरेज वितरित" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "IRC Client" +msgid "Android Samba Client" +msgstr "आईआरसी क्लाइंट" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "गनोम कैलेंडर" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5850,6 +5908,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "रूट पारटिशन विस्तार करें" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6200,6 +6264,10 @@ msgstr "सॉक्स" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "एक टोर सॉक्स पोर्ट आपका %(box_name)s र उपलब्ध है, TCP पोर्ट ९०५० पर." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "सेटिंग स्थिर है" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7254,8 +7322,11 @@ msgid "Mailing list" msgstr "मेलिंग सूची" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "%(service_name)s सिर्फ आंतरिक नेटवर्क्स पर उपलब्ध है." #: plinth/templates/internal-zone.html:17 @@ -7332,6 +7403,9 @@ msgstr "%(percentage)s%% पूर्ण" msgid "Gujarati" msgstr "" +#~ msgid "Enable OpenVPN server" +#~ msgstr "ओपनवीपीएन सर्वर सक्षम करें" + #~ msgid "active" #~ msgstr "एक्टिव" @@ -7948,9 +8022,6 @@ msgstr "" #~ msgid "Archive name" #~ msgstr "पुरालेख नाम" -#~ msgid "Name for new backup archive." -#~ msgstr "नया बैकअप पुरालेख के लिये नाम." - #~ msgid "Invalid archive name" #~ msgstr "पुरालेख नाम अमान्य है" diff --git a/plinth/locale/hu/LC_MESSAGES/django.po b/plinth/locale/hu/LC_MESSAGES/django.po index 4e2cd0023..697b103d7 100644 --- a/plinth/locale/hu/LC_MESSAGES/django.po +++ b/plinth/locale/hu/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-29 18:41+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Hungarian user@host:~/path/to/repo/" @@ -248,11 +262,11 @@ msgstr "" "Új vagy már létező tároló elérési útja. Például: felhasznalo@hoszt:~/" "eleresi/ut/az/adattarhoz/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH kiszolgáló jelszava" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -260,11 +274,11 @@ msgstr "" "Jelszó az SSH kiszolgálóhoz.
SSH kulcs alapú azonosítás még nem " "lehetséges." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Távoli biztonsági másolat tároló már létezik." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Válaszd ki az ellenőrzött SSH nyilvános kulcsot" @@ -369,13 +383,6 @@ msgstr "Tároló létrehozása" msgid "Delete this archive permanently?" msgstr "Véglegesen törlöd ezt az archívumot?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Név" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Idő" @@ -425,7 +432,7 @@ msgstr "letöltés" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Visszaállít" @@ -535,87 +542,87 @@ msgstr "Állomás ellenőrzése" msgid "Archive created." msgstr "Archívum létrehozva." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Archívum törlése" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archívum törölve." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Biztonsági másolat feltöltése és visszaállítása" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Fájlok visszaállítva a biztonsági mentésből." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Biztonsági másolat fájl nem található." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Visszaállítás a feltöltött fájlból" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "Nincs további lemez amit a tárolóhoz lehetne adni." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Biztonsági másolat tároló létrehozása" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Távoli biztonsági másolat tároló létrehozása" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Új távoli SSH tároló hozzáadva." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "SSH állomáskulcs ellenőrzése" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH állomás már le lett ellenőrizve." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH állomás leellenőrizve." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "SSH állomás nyilvános kulcsa nem ellenőrizhető le." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Sikertelen a hitelesítés a távoli kiszolgálóra." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Hiba lépett fel a kiszolgálóhoz való kapcsolódás során: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Tároló eltávolítva." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Tároló eltávolítása" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Tároló eltávolítva. A biztonsági mentések nem lettek törölve." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Lecsatolás sikertelen!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Felcsatolás sikertelen" @@ -704,8 +711,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "A beállítások frissültek" @@ -724,6 +731,14 @@ msgstr "" "terminál szintén elérhető a konzolos műveletekhez." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -732,7 +747,7 @@ msgstr "" "Használhatja majd a {box_name} eszköz bármely adminisztrátori csoportba " "tartozó felhasználója." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -740,12 +755,12 @@ msgstr "" "A Cockpit megköveteli, hogy a domain néven keresztül érd el. Nem fog működni " "ha az URL részeként az IP címmel érik el." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Kiszolgáló adminisztráció" @@ -1467,8 +1482,8 @@ msgstr "Leírás" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1612,17 +1627,17 @@ msgstr "" msgid "Firewall" msgstr "Tűzfal" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "{name} port ({details}) elérhető a belső hálózaton" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "{name} port ({details}) elérhető a külső hálózaton" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "{name} port ({details}) nem érhető el külső hálózaton" @@ -1686,6 +1701,18 @@ msgstr "" "tűzfalban is engedélyezve lesz, és ha letiltod a szolgáltatást az a " "tűzfalban szintén le lesz tiltva." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2983,6 +3010,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -3023,7 +3054,7 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -3033,7 +3064,7 @@ msgstr "" "cseréjéhez használnak. Részt tud venni többféle P2P hálózatban is, beleértve " "az eDonkey-t, Kademlia-t, Overnet-et, BitTorrent-et és a DirectConnect-et." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3044,7 +3075,7 @@ msgstr "" "bármely, külön mobil vagy asztali kezelőfelületen vagy telnet interfészen " "keresztül. További részletek a kézikönyvben." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." @@ -3052,16 +3083,16 @@ msgstr "" "{box_name} eszközön a letöltött fájlok a /var/lib/mldonkey/ könyvtárban " "találhatóak meg." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Fájlok letöltése eDonkey alkalmazások használatával" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "P2P Fájlmegosztás" @@ -4098,6 +4129,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4235,31 +4272,27 @@ msgstr "" "eszközödön keresztül az Internetet is további biztonság és anonimitás " "érdekében." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Virtuális magánhálózat" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "Profil letöltése" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "OpenVPN kiszolgáló engedélyezése" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4271,15 +4304,15 @@ msgstr "" "órákig is eltarthat. Ha a beállítás megszakad, akkor később újra lehet " "kezdeni." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Beállítás elindítása" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "OpenVPN beállítás fut" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4326,20 +4359,15 @@ msgstr "" msgid "Download my profile" msgstr "Saját profilom letöltése" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Beállítás sikerült." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Beállítás sikertelen." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "A beállítás változatlan" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4353,19 +4381,19 @@ msgstr "" "szolgáltatásai nem érhetőek el az internet felől. Ez magában foglalja az " "alábbi eseteket:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} eszközöd egy korlátozott tűzfal mögött van." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} eszközöd egy olyan (vezetéknélküli) router-hez kapcsolódik, " "amelyet te nem állíthatsz be." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4373,7 +4401,7 @@ msgstr "" "Az internetszolgáltatód nem biztosít neked külső IP címet, ehelyett hálózati " "címfordításon (NAT) keresztül tudod elérni az Internetet." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4381,11 +4409,11 @@ msgstr "" "Az internetszolgáltatód nem biztosít neked statikus IP címet és az IP címed " "mindig megváltozik, amikor az Internetre csatlakozol." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Az internetszolgáltatód korlátozza a bejövő kapcsolatokat." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4405,15 +4433,15 @@ msgstr "" "net. A jövőben talán a barátod {box_name} eszközét is lehetőséged lesz " "használni erre a célra." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Nyilvános láthatóság" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "PageKite domain" @@ -4725,12 +4753,18 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "A Radicale egy CalDAV és CardDAV kiszolgáló. Ezzel lehetővé válik az " "időbeosztás és a kapcsolati adatok szinkronizációja és megosztása. A " @@ -4738,7 +4772,7 @@ msgstr "" "clients/\">támogatott kliens alkalmazásra is. A Radicale elérhető " "bármely felhasználó számára „{box_name}” felhasználónév használatával." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4749,12 +4783,12 @@ msgstr "" "eseményeket vagy kapcsolatokat, ezeket egy külön kliens használatával " "teheted meg." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Naptár és címjegyzék" @@ -4935,6 +4969,30 @@ msgstr "" msgid "Network File Storage" msgstr "Elosztott fájltároló" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "IRC Client" +msgid "Android Samba Client" +msgstr "IRC kliens" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "GNOME naptár" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5955,6 +6013,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Root partíció kibővítése" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6321,6 +6385,10 @@ msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" "Egy Tor SOCKS port elérhető a te %(box_name)s eszközöd 9050-es TCP portján." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "A beállítás változatlan" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7381,8 +7449,11 @@ msgid "Mailing list" msgstr "Levelezőlista" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" "%(service_name)s néven futó szolgáltatás csak belső hálózaton " "elérhető." @@ -7467,6 +7538,9 @@ msgstr "befejezettségi szint: %(percentage)s%%" msgid "Gujarati" msgstr "Gudzsaráti" +#~ msgid "Enable OpenVPN server" +#~ msgstr "OpenVPN kiszolgáló engedélyezése" + #~ msgid "active" #~ msgstr "aktív" @@ -8037,9 +8111,6 @@ msgstr "Gudzsaráti" #~ msgid "Archive name" #~ msgstr "Archívum neve" -#~ msgid "Name for new backup archive." -#~ msgstr "Az új biztonsági másolat neve." - #~ msgid "Invalid archive name" #~ msgstr "Érvénytelen archívum név" diff --git a/plinth/locale/id/LC_MESSAGES/django.po b/plinth/locale/id/LC_MESSAGES/django.po index 198ed3841..7374ea131 100644 --- a/plinth/locale/id/LC_MESSAGES/django.po +++ b/plinth/locale/id/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: Indonesian (FreedomBox)\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2018-11-02 00:44+0000\n" "Last-Translator: ButterflyOfFire \n" "Language-Team: Indonesian user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 #, fuzzy #| msgid "Show password" msgid "SSH server password" msgstr "Tampilkan kata sandi" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -369,13 +381,6 @@ msgstr "Aksi" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Nama" - #: plinth/modules/backups/templates/backups_delete.html:19 #, fuzzy #| msgid "Time Zone" @@ -426,7 +431,7 @@ msgstr "Panduan {box_name}" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 #, fuzzy #| msgid "Restart Now" msgid "Restore" @@ -527,95 +532,95 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 #, fuzzy #| msgid "Delete" msgid "Delete Archive" msgstr "Hapus" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 #, fuzzy #| msgid "{name} deleted." msgid "Archive deleted." msgstr "{name} dihapus." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Administrator Account" msgid "Create backup repository" msgstr "Akun Administrator" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing application: {error}" msgid "Error establishing connection to server: {}" msgstr "Kesalahan pemasangan aplikasi: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -699,8 +704,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -715,24 +720,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 #, fuzzy #| msgid "Administrator Account" msgid "Server Administration" @@ -1363,8 +1376,8 @@ msgstr "Tentang" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1489,17 +1502,17 @@ msgstr "" msgid "Firewall" msgstr "Firewall" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1557,6 +1570,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2717,6 +2742,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2757,38 +2786,38 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 #, fuzzy #| msgid "Monkeysphere" msgid "MLDonkey" msgstr "Monkeysphere" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3755,6 +3784,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s Setup" @@ -3884,32 +3919,28 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 #, fuzzy #| msgid "Open" msgid "OpenVPN" msgstr "Open" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3917,15 +3948,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Jalankan pengaturan" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3955,20 +3986,15 @@ msgstr "" msgid "Download my profile" msgstr "Unduh profil saya" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Pengaturan selesai." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Pengaturan gagal." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3977,33 +4003,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4012,17 +4038,17 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 #, fuzzy #| msgid "Pagekite" msgid "PageKite" msgstr "Pagekite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "Pagekite" msgid "PageKite Domain" @@ -4294,24 +4320,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4455,6 +4482,26 @@ msgstr "" msgid "Network File Storage" msgstr "Interface" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5396,6 +5443,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5697,6 +5750,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6665,7 +6722,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/it/LC_MESSAGES/django.po b/plinth/locale/it/LC_MESSAGES/django.po index 2ff150641..e7da39948 100644 --- a/plinth/locale/it/LC_MESSAGES/django.po +++ b/plinth/locale/it/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-04-11 13:36+0000\n" "Last-Translator: Jeannette L \n" "Language-Team: Italian user@host:~/path/to/repo/" @@ -255,11 +269,11 @@ msgstr "" "Percorso di un deposito nuovo o esistente. Esempio: user@host:~/path/to/" "repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Password server SSH" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -267,12 +281,12 @@ msgstr "" "La password del Server SSH.
L'autenticazione basata su chiave SSH non è " "ancora possibile." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 #, fuzzy msgid "Remote backup repository already exists." msgstr "Il repository di backup remoto esiste già." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 #, fuzzy msgid "Select verified SSH public key" msgstr "Selezionare la chiave pubblica SSH verificata" @@ -396,13 +410,6 @@ msgstr "Creare Repository" msgid "Delete this archive permanently?" msgstr "Rimuovere l'archivio in modo definitivo?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Nome" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Ora" @@ -452,7 +459,7 @@ msgstr "Scaricare in formato PDF" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 #, fuzzy msgid "Restore" msgstr "Restaurare" @@ -567,87 +574,87 @@ msgstr "Verificare l'host" msgid "Archive created." msgstr "Archivio creato." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Cancella archivio" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archivio cancellato." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Caricare e ripristinare un backup" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "File ripristinati da backup." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Nessun file di backup trovato." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Ripristina dal file caricato" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "Non sono disponibili dischi aggiuntivi per aggiungere un repository." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Creare un repository di backup" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Creare un repository di backup remoto" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Aggiunto nuovo repository SSH remoto." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Verificare la chiave host SSH" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "Host SSH già verificato." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "Host SSH verificato." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "Non è stato possibile verificare la chiave pubblica dell'host SSH." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Autenticazione al server remoto fallita." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Errore di connessione al server: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Deposito rimosso." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Rimuovere il repository" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Deposito rimosso. I backup non sono stati cancellati." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Smontaggio fallito!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Montaggio fallito" @@ -739,8 +746,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Configurazione caricata" @@ -760,6 +767,14 @@ msgstr "" "console." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -768,7 +783,7 @@ msgstr "" "È accessibile da qualsiasi utente su {box_name} " "appartenente al gruppo admin." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -776,12 +791,12 @@ msgstr "" "Cockpit richiede l'accesso attraverso un nome di dominio. Non funzionerà " "quando si accede utilizzando un indirizzo IP come parte dell'URL." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Amministrazione Server" @@ -1520,8 +1535,8 @@ msgstr "About" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1668,17 +1683,17 @@ msgstr "" msgid "Firewall" msgstr "Firewall" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Porta {name} ({details}) disponibile per le reti interne" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Porta {name} ({details}) disponibile per reti esterne" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Porta {name} ({details}) non disponibile per reti esterne" @@ -1742,6 +1757,18 @@ msgstr "" "abilitato anche sul firewall, e quando lo disabiliti, viene disabilitato " "anche nel firewall." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -3073,6 +3100,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -3113,36 +3144,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Scarica file usando applicazioni eDonkey" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 #, fuzzy msgid "Peer-to-peer File Sharing" msgstr "Condivisione File" @@ -4165,6 +4196,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4301,31 +4338,27 @@ msgstr "" "accedere al resto della rete Internet via {box_name} per una maggiore " "sicurezza e anonimità." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Rete virtuale privata" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" " Scarica Profilo " -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Abilita server OpenVPN" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4337,15 +4370,15 @@ msgstr "" "impiegare anche delle ore. Se il setup viene interroto, è possibile " "riavviarlo." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Avvia setup" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "Setup OpenVPN in corso" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4391,20 +4424,15 @@ msgstr "" msgid "Download my profile" msgstr "Scarica il mio profilo" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Setup completato." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Setup fallito." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Impostazioni invariate" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4417,18 +4445,18 @@ msgstr "" "il tuo {box_name} non è raggiungibile dall'esterno. Questo include le " "situazioni seguenti:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} è valle di un firewall ristretto." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} è connesso ad un router (wireless) di cui non hai il controllo." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4436,7 +4464,7 @@ msgstr "" "Il tuo ISP non ti assegna un IP pubblico ma ti fornisce una connessione " "tramite NAT." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4444,11 +4472,11 @@ msgstr "" "Il tuo ISP non ti fornisce un IP statico e il tuo IP cambia ogni volta che " "ti connetti a Internet." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Il tuo ISP limita le connessioni in entrata." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4467,15 +4495,15 @@ msgstr "" "pagekite, per esempio pagekite.net. In " "futuro potrebbe essere usare il {box_name} del tuo amico." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Visibilità Pubblica" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -4791,31 +4819,37 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale è un server CalDAV e CardDAV. Consente la sincronizzazione e " "condivisione del calendario e i contatti. Per usare Radicale è richiesta un'applicazione client supportata. È possibile accedere a Radicale da ogni utente con un profilo {box_name}." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Calendario e Rubrica" @@ -4969,6 +5003,28 @@ msgstr "" msgid "Network File Storage" msgstr "Interfaccia" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "IRC Client" +msgid "Android Samba Client" +msgstr "Client IRC" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5869,6 +5925,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6164,6 +6226,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Impostazioni invariate" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7136,7 +7202,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 @@ -7212,6 +7280,9 @@ msgstr "%(percentage)s%% completata" msgid "Gujarati" msgstr "" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Abilita server OpenVPN" + #~ msgid "Enable application" #~ msgstr "Abilita applicazione" @@ -7609,9 +7680,6 @@ msgstr "" #~ msgid "DAVDroid" #~ msgstr "DAVDroid" -#~ msgid "Name for new backup archive." -#~ msgstr "Nome del nuovo archivio di backup." - #, fuzzy #~| msgid "Invalid server name" #~ msgid "Invalid archive name" diff --git a/plinth/locale/ja/LC_MESSAGES/django.po b/plinth/locale/ja/LC_MESSAGES/django.po index 9f0ea4c59..6df7fd33e 100644 --- a/plinth/locale/ja/LC_MESSAGES/django.po +++ b/plinth/locale/ja/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -141,115 +141,127 @@ msgid "{app} (No data to backup)" msgstr "" #: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/templates/backups_delete.html:18 +#: plinth/modules/ikiwiki/forms.py:15 +#: plinth/modules/networks/templates/connection_show.html:63 +#: plinth/modules/sharing/templates/sharing.html:37 +msgid "Name" +msgstr "" + +#: plinth/modules/backups/forms.py:53 +msgid "(Optional) Set a name for this backup archive" +msgstr "" + +#: plinth/modules/backups/forms.py:56 msgid "Included apps" msgstr "" -#: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/forms.py:56 msgid "Apps to include in the backup" msgstr "" -#: plinth/modules/backups/forms.py:66 +#: plinth/modules/backups/forms.py:70 msgid "Select the apps you want to restore" msgstr "" -#: plinth/modules/backups/forms.py:79 +#: plinth/modules/backups/forms.py:83 msgid "Upload File" msgstr "" -#: plinth/modules/backups/forms.py:81 +#: plinth/modules/backups/forms.py:85 msgid "Backup files have to be in .tar.gz format" msgstr "" -#: plinth/modules/backups/forms.py:82 +#: plinth/modules/backups/forms.py:86 msgid "Select the backup file you want to upload" msgstr "" -#: plinth/modules/backups/forms.py:88 +#: plinth/modules/backups/forms.py:92 msgid "Repository path format incorrect." msgstr "" -#: plinth/modules/backups/forms.py:95 +#: plinth/modules/backups/forms.py:99 #, python-brace-format msgid "Invalid username: {username}" msgstr "" -#: plinth/modules/backups/forms.py:105 +#: plinth/modules/backups/forms.py:109 #, python-brace-format msgid "Invalid hostname: {hostname}" msgstr "" -#: plinth/modules/backups/forms.py:109 +#: plinth/modules/backups/forms.py:113 #, python-brace-format msgid "Invalid directory path: {dir_path}" msgstr "" -#: plinth/modules/backups/forms.py:115 +#: plinth/modules/backups/forms.py:119 msgid "Encryption" msgstr "" -#: plinth/modules/backups/forms.py:116 +#: plinth/modules/backups/forms.py:120 msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" -#: plinth/modules/backups/forms.py:120 plinth/modules/networks/forms.py:262 +#: plinth/modules/backups/forms.py:124 plinth/modules/networks/forms.py:262 msgid "Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:121 +#: plinth/modules/backups/forms.py:125 msgid "Passphrase; Only needed when using encryption." msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Confirm Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Repeat the passphrase." msgstr "" -#: plinth/modules/backups/forms.py:135 +#: plinth/modules/backups/forms.py:139 msgid "The entered encryption passphrases do not match" msgstr "" -#: plinth/modules/backups/forms.py:139 +#: plinth/modules/backups/forms.py:143 msgid "Passphrase is needed for encryption." msgstr "" -#: plinth/modules/backups/forms.py:174 +#: plinth/modules/backups/forms.py:178 msgid "Select Disk or Partition" msgstr "" -#: plinth/modules/backups/forms.py:175 +#: plinth/modules/backups/forms.py:179 msgid "Backups will be stored in the directory FreedomBoxBackups" msgstr "" -#: plinth/modules/backups/forms.py:184 +#: plinth/modules/backups/forms.py:188 msgid "SSH Repository Path" msgstr "" -#: plinth/modules/backups/forms.py:185 +#: plinth/modules/backups/forms.py:189 msgid "" "Path of a new or existing repository. Example: user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -346,13 +358,6 @@ msgstr "" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "" @@ -394,7 +399,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -485,87 +490,87 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -638,8 +643,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -654,24 +659,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1286,8 +1299,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1406,17 +1419,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1472,6 +1485,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2561,6 +2586,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2601,36 +2630,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3574,6 +3603,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3701,30 +3736,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3732,15 +3763,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3770,20 +3801,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3792,33 +3818,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3827,15 +3853,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4099,24 +4125,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4259,6 +4286,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5117,6 +5164,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5408,6 +5461,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6317,7 +6374,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/kn/LC_MESSAGES/django.po b/plinth/locale/kn/LC_MESSAGES/django.po index 9f0ea4c59..6df7fd33e 100644 --- a/plinth/locale/kn/LC_MESSAGES/django.po +++ b/plinth/locale/kn/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -141,115 +141,127 @@ msgid "{app} (No data to backup)" msgstr "" #: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/templates/backups_delete.html:18 +#: plinth/modules/ikiwiki/forms.py:15 +#: plinth/modules/networks/templates/connection_show.html:63 +#: plinth/modules/sharing/templates/sharing.html:37 +msgid "Name" +msgstr "" + +#: plinth/modules/backups/forms.py:53 +msgid "(Optional) Set a name for this backup archive" +msgstr "" + +#: plinth/modules/backups/forms.py:56 msgid "Included apps" msgstr "" -#: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/forms.py:56 msgid "Apps to include in the backup" msgstr "" -#: plinth/modules/backups/forms.py:66 +#: plinth/modules/backups/forms.py:70 msgid "Select the apps you want to restore" msgstr "" -#: plinth/modules/backups/forms.py:79 +#: plinth/modules/backups/forms.py:83 msgid "Upload File" msgstr "" -#: plinth/modules/backups/forms.py:81 +#: plinth/modules/backups/forms.py:85 msgid "Backup files have to be in .tar.gz format" msgstr "" -#: plinth/modules/backups/forms.py:82 +#: plinth/modules/backups/forms.py:86 msgid "Select the backup file you want to upload" msgstr "" -#: plinth/modules/backups/forms.py:88 +#: plinth/modules/backups/forms.py:92 msgid "Repository path format incorrect." msgstr "" -#: plinth/modules/backups/forms.py:95 +#: plinth/modules/backups/forms.py:99 #, python-brace-format msgid "Invalid username: {username}" msgstr "" -#: plinth/modules/backups/forms.py:105 +#: plinth/modules/backups/forms.py:109 #, python-brace-format msgid "Invalid hostname: {hostname}" msgstr "" -#: plinth/modules/backups/forms.py:109 +#: plinth/modules/backups/forms.py:113 #, python-brace-format msgid "Invalid directory path: {dir_path}" msgstr "" -#: plinth/modules/backups/forms.py:115 +#: plinth/modules/backups/forms.py:119 msgid "Encryption" msgstr "" -#: plinth/modules/backups/forms.py:116 +#: plinth/modules/backups/forms.py:120 msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" -#: plinth/modules/backups/forms.py:120 plinth/modules/networks/forms.py:262 +#: plinth/modules/backups/forms.py:124 plinth/modules/networks/forms.py:262 msgid "Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:121 +#: plinth/modules/backups/forms.py:125 msgid "Passphrase; Only needed when using encryption." msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Confirm Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Repeat the passphrase." msgstr "" -#: plinth/modules/backups/forms.py:135 +#: plinth/modules/backups/forms.py:139 msgid "The entered encryption passphrases do not match" msgstr "" -#: plinth/modules/backups/forms.py:139 +#: plinth/modules/backups/forms.py:143 msgid "Passphrase is needed for encryption." msgstr "" -#: plinth/modules/backups/forms.py:174 +#: plinth/modules/backups/forms.py:178 msgid "Select Disk or Partition" msgstr "" -#: plinth/modules/backups/forms.py:175 +#: plinth/modules/backups/forms.py:179 msgid "Backups will be stored in the directory FreedomBoxBackups" msgstr "" -#: plinth/modules/backups/forms.py:184 +#: plinth/modules/backups/forms.py:188 msgid "SSH Repository Path" msgstr "" -#: plinth/modules/backups/forms.py:185 +#: plinth/modules/backups/forms.py:189 msgid "" "Path of a new or existing repository. Example: user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -346,13 +358,6 @@ msgstr "" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "" @@ -394,7 +399,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -485,87 +490,87 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -638,8 +643,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -654,24 +659,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1286,8 +1299,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1406,17 +1419,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1472,6 +1485,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2561,6 +2586,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2601,36 +2630,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3574,6 +3603,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3701,30 +3736,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3732,15 +3763,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3770,20 +3801,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3792,33 +3818,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3827,15 +3853,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4099,24 +4125,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4259,6 +4286,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5117,6 +5164,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5408,6 +5461,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6317,7 +6374,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/lt/LC_MESSAGES/django.po b/plinth/locale/lt/LC_MESSAGES/django.po index bac1ff7f6..730b75906 100644 --- a/plinth/locale/lt/LC_MESSAGES/django.po +++ b/plinth/locale/lt/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -142,115 +142,127 @@ msgid "{app} (No data to backup)" msgstr "" #: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/templates/backups_delete.html:18 +#: plinth/modules/ikiwiki/forms.py:15 +#: plinth/modules/networks/templates/connection_show.html:63 +#: plinth/modules/sharing/templates/sharing.html:37 +msgid "Name" +msgstr "" + +#: plinth/modules/backups/forms.py:53 +msgid "(Optional) Set a name for this backup archive" +msgstr "" + +#: plinth/modules/backups/forms.py:56 msgid "Included apps" msgstr "" -#: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/forms.py:56 msgid "Apps to include in the backup" msgstr "" -#: plinth/modules/backups/forms.py:66 +#: plinth/modules/backups/forms.py:70 msgid "Select the apps you want to restore" msgstr "" -#: plinth/modules/backups/forms.py:79 +#: plinth/modules/backups/forms.py:83 msgid "Upload File" msgstr "" -#: plinth/modules/backups/forms.py:81 +#: plinth/modules/backups/forms.py:85 msgid "Backup files have to be in .tar.gz format" msgstr "" -#: plinth/modules/backups/forms.py:82 +#: plinth/modules/backups/forms.py:86 msgid "Select the backup file you want to upload" msgstr "" -#: plinth/modules/backups/forms.py:88 +#: plinth/modules/backups/forms.py:92 msgid "Repository path format incorrect." msgstr "" -#: plinth/modules/backups/forms.py:95 +#: plinth/modules/backups/forms.py:99 #, python-brace-format msgid "Invalid username: {username}" msgstr "" -#: plinth/modules/backups/forms.py:105 +#: plinth/modules/backups/forms.py:109 #, python-brace-format msgid "Invalid hostname: {hostname}" msgstr "" -#: plinth/modules/backups/forms.py:109 +#: plinth/modules/backups/forms.py:113 #, python-brace-format msgid "Invalid directory path: {dir_path}" msgstr "" -#: plinth/modules/backups/forms.py:115 +#: plinth/modules/backups/forms.py:119 msgid "Encryption" msgstr "" -#: plinth/modules/backups/forms.py:116 +#: plinth/modules/backups/forms.py:120 msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" -#: plinth/modules/backups/forms.py:120 plinth/modules/networks/forms.py:262 +#: plinth/modules/backups/forms.py:124 plinth/modules/networks/forms.py:262 msgid "Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:121 +#: plinth/modules/backups/forms.py:125 msgid "Passphrase; Only needed when using encryption." msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Confirm Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Repeat the passphrase." msgstr "" -#: plinth/modules/backups/forms.py:135 +#: plinth/modules/backups/forms.py:139 msgid "The entered encryption passphrases do not match" msgstr "" -#: plinth/modules/backups/forms.py:139 +#: plinth/modules/backups/forms.py:143 msgid "Passphrase is needed for encryption." msgstr "" -#: plinth/modules/backups/forms.py:174 +#: plinth/modules/backups/forms.py:178 msgid "Select Disk or Partition" msgstr "" -#: plinth/modules/backups/forms.py:175 +#: plinth/modules/backups/forms.py:179 msgid "Backups will be stored in the directory FreedomBoxBackups" msgstr "" -#: plinth/modules/backups/forms.py:184 +#: plinth/modules/backups/forms.py:188 msgid "SSH Repository Path" msgstr "" -#: plinth/modules/backups/forms.py:185 +#: plinth/modules/backups/forms.py:189 msgid "" "Path of a new or existing repository. Example: user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -347,13 +359,6 @@ msgstr "" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "" @@ -395,7 +400,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -486,87 +491,87 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -639,8 +644,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -655,24 +660,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1287,8 +1300,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1407,17 +1420,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1473,6 +1486,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2562,6 +2587,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2602,36 +2631,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3575,6 +3604,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3702,30 +3737,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3733,15 +3764,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3771,20 +3802,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3793,33 +3819,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3828,15 +3854,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4100,24 +4126,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4260,6 +4287,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5118,6 +5165,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5409,6 +5462,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6318,7 +6375,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/nb/LC_MESSAGES/django.po b/plinth/locale/nb/LC_MESSAGES/django.po index 456664bc0..32f776ebd 100644 --- a/plinth/locale/nb/LC_MESSAGES/django.po +++ b/plinth/locale/nb/LC_MESSAGES/django.po @@ -15,7 +15,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-29 18:41+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål user@host:~/path/to/repo/" @@ -256,11 +270,11 @@ msgstr "" "Sti til et nytt eller eksisterende depot. Eksempel: user@vert:~/sti/til/" "depot/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH-tjenermaskinpassord" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -268,11 +282,11 @@ msgstr "" "Passord til SSH-tjeneren.
Nøkkelbasert SSH-autentisering er så langt " "ikke mulig." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Fjerndepot for sikkerhetskopi eksisterer allerede." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Velg bekreftet offentlig SSH-nøkkel" @@ -376,13 +390,6 @@ msgstr "Opprett depot" msgid "Delete this archive permanently?" msgstr "Slett dette arkivet permanent?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Navn" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Tid" @@ -426,7 +433,7 @@ msgstr "Last ned" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Gjenopprett" @@ -542,88 +549,88 @@ msgstr "Bekreft vert" msgid "Archive created." msgstr "Arkiv opprettet." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Slett arkiv" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Arkiv slettet." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Last opp og tilbakefør en sikkerhetskopi" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Gjenopprettede filer fra sikkerhetskopi." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Fant ingen sikkerhetskopifiler." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Gjenopprett fra opplastet fil" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 #, fuzzy msgid "No additional disks available to add a repository." msgstr "Ingen ytterligere disker å legge til i pakkebrønn." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Opprett depot for sikkerhetskopier" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Opprett fjerndepot for sikkerhetskopi" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "La til nytt SSH-depot annensteds fra." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Bekreft SSH-vertsnøkkel" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH-vert allerede bekreftet." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH-vert bekreftet." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "Offentlig nøkkel tilhørende SSH-vert kunne ikke bekreftes." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Identitetsbekreftelse til fjerntjener mislyktes." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Klarte ikke å koble til tjener: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Depot fjernet." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Fjern depot" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Depot fjernet. Sikkerhetskopier ble ikke slettet." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Klarte ikke å avmontere!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Montering feilet" @@ -708,8 +715,8 @@ msgstr "Oppdater IP-adresse og domener" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Oppsett oppdatert" @@ -728,6 +735,14 @@ msgstr "" "for konsolloperasjoner er også tilgjengelig." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -741,7 +756,7 @@ msgstr "" "a>-banen på nettjeneren. Den kan brukes av enhver " "bruker på {box_name} som er medlem i admin-gruppen." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -749,12 +764,12 @@ msgstr "" "Cockpit krever at du når det gjennom et domenenavn. Det fungerer ikke når " "det nås ved bruk av en IP-adresse, eller som del av nettadressen." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Styrhus" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Tjeneradministrasjon" @@ -1477,8 +1492,8 @@ msgstr "Om" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1620,17 +1635,17 @@ msgstr "" msgid "Firewall" msgstr "Brannmur" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) tilgjengelig på interne nettverk" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) tilgjengelig på eksterne nettverk" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} ({details}) er utilgjengelig for eksterne nettverk" @@ -1693,6 +1708,18 @@ msgstr "" "også tillatt i brannmuren, og når du deaktiverer en tjeneste, er den også " "deaktivert i brannmuren." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, fuzzy, python-brace-format #| msgid "" @@ -3026,6 +3053,10 @@ msgstr "" msgid "Media streaming server" msgstr "Media-strømmetjener" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 #, fuzzy msgid "Simple Media Server" @@ -3068,7 +3099,7 @@ msgstr "Angitt mappe finnes ikke" msgid "Updated media directory" msgstr "Oppdatert mediekatalog" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -3078,7 +3109,7 @@ msgstr "" "store filer. Det kan delta i flere maskin-til-maskin -nettverk, inkludert " "eDonkey, Kademlia, Overnet, BitTorrent og DirectConnect." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3089,22 +3120,22 @@ msgstr "" "gjennom en av de egne mobil- eller skrivebords-grenseflatene, eller et " "telnet-grensesnitt. Se manualen." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "På {box_name}, finner du nedlastede filer i mappen /var/lib/mldonkey/." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Last ned filer ved bruk av eDonkey-programmer" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Maskin til maskin-fildeling" @@ -4139,6 +4170,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4275,33 +4312,29 @@ msgstr "" "Du kan også få tilgang til resten av Internettet via {box_name} med utvidet " "sikkerhet og anonymitet." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Virtuelt privat nettverk" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "Last ned profil" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Aktiver OpenVPN-tjener" - #: plinth/modules/openvpn/manifest.py:48 #, fuzzy #| msgid "TunnelBlick" msgid "Tunnelblick" msgstr "Tunnelblick" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4312,15 +4345,15 @@ msgstr "" "tid. Avhengig av hvor fort din %(box_name)s er, kan det hende at det tar " "timer. Hvis oppsettingen blir avbrutt, kan du starte den igjen." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Start oppsett" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "OpenVPN-oppsett kjører" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4366,20 +4399,15 @@ msgstr "" msgid "Download my profile" msgstr "Last ned min profil" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Oppsettet fullført." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Oppsettet mislyktes." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Oppsett uendret" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4392,17 +4420,17 @@ msgstr "" "{box_name}-tjenester ikke nås fra resten av nettet. Dette omfatter de " "følgende situasjoner:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} er bak en begrensende brannmur." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "{box_name} er koblet til en (trådløs) ruter du ikke kan kontrollere." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4410,7 +4438,7 @@ msgstr "" "Din Internett-leverandør gir deg ikke en ekstern IP-adresse, og gir i stedet " "en NAT-et Internett-tilkobling." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4418,11 +4446,11 @@ msgstr "" "Internett-leverandøren gir deg ikke en statisk IP-adresse, og IP-adressen " "endres hver gang du kobler deg til Internett." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Din Internett-leverandør begrenser innkommende oppkoblinger." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4442,15 +4470,15 @@ msgstr "" "\"https://pagekite.net\">pagekite.net. I fremtiden kan det bli mulig å " "bruke kameratens {box_name} til dette." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Offentlig synlighet" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "PageKite-domene" @@ -4764,19 +4792,25 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale er en CalDAV- og CardDAV-tjener. Den tillater synkronisering og " "deling av kontakt- og planleggingsdata. For å bruke Radicale trengs et støttet klientprogram . Radicale " "kan nås av alle brukere med {box_name}-innlogging." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4786,12 +4820,12 @@ msgstr "" "kalendre og adressebøker. Den tilbyr ikke å legge inn nye hendelser eller " "kontakter, det må gjøres med en egen klient." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Kalender og adressebok" @@ -4967,6 +5001,30 @@ msgstr "Samba" msgid "Network File Storage" msgstr "Distribuert fillagring" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Add Client" +msgid "Android Samba Client" +msgstr "Legg til klient" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "GNOME-kalender" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5955,6 +6013,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Utvid root-partisjon" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6311,6 +6375,10 @@ msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" "En Tor SOCKS-port er tilgjengelig på din %(box_name)s på TCP port 9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Oppsett uendret" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7377,8 +7445,11 @@ msgid "Mailing list" msgstr "Adresseliste" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" "Tjenesten %(service_name)s er kun tilgjengelig på interne nettverk." @@ -7459,6 +7530,9 @@ msgstr "%(percentage)s%% fullført" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Aktiver OpenVPN-tjener" + #~ msgid "active" #~ msgstr "Slått på" @@ -8044,9 +8118,6 @@ msgstr "Gujarati" #~ msgid "Archive name" #~ msgstr "Arkivnavn" -#~ msgid "Name for new backup archive." -#~ msgstr "Navn på nytt sikkerhetskopiarkiv." - #~ msgid "Invalid archive name" #~ msgstr "Ugyldig arkivnavn" diff --git a/plinth/locale/nl/LC_MESSAGES/django.po b/plinth/locale/nl/LC_MESSAGES/django.po index 7702c33c2..8b39b77f0 100644 --- a/plinth/locale/nl/LC_MESSAGES/django.po +++ b/plinth/locale/nl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-01-17 21:21+0000\n" "Last-Translator: ikmaak \n" "Language-Team: Dutch user@host:~/path/to/repo/" @@ -250,11 +264,11 @@ msgstr "" "Pad naar een nieuwe of bestaande repository.Voorbeeld: user@host:~/pad/" "naar/repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH-server wachtwoord" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -262,11 +276,11 @@ msgstr "" "Wachtwoord van de SSH Server.
SSH-sleutel-gebaseerde authenticatie is " "nog niet mogelijk." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Externe backup repository bestaat al." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Selecteer geverifieerde SSH openbare sleutel" @@ -365,13 +379,6 @@ msgstr "Maak Repository" msgid "Delete this archive permanently?" msgstr "Dit archief permanent verwijderen?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Naam" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Tijd" @@ -421,7 +428,7 @@ msgstr "downloaden" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Herstellen" @@ -527,87 +534,87 @@ msgstr "" msgid "Archive created." msgstr "Archief aangemaakt." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Archief verwijderen" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archief verwijderd." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Een back-up uploaden en herstellen" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Er is geen back-upbestand gevonden." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Maak een back-up repository" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Nieuwe externe SSH-repository toegevoegd." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Fout bij het tot stand brengen van een verbinding met de server: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Repository verwijderd." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -695,8 +702,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Configuratie bijgewerkt" @@ -715,6 +722,14 @@ msgstr "" "Er is ook een webgebaseerde terminal beschikbaar voor consoleactiviteiten." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -723,18 +738,18 @@ msgstr "" "Het kan geraadpleegd worden door iedere gebruiker op {box_name} die lid is van de systeembeheerdergroep (admin)." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Serverbeheer" @@ -1439,8 +1454,8 @@ msgstr "Over" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1583,17 +1598,17 @@ msgstr "" msgid "Firewall" msgstr "Firewall" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Poort {name} ({details}) is beschikbaar binnen interne netwerken" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Poort {name} ({details})is beschikbaar voor externe netwerken" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1656,6 +1671,18 @@ msgstr "" "wordt deze ook toegevoegd aan de firewall, en als een dienst wordt " "uitgeschakeld, gebeurt dit ook in de firewall." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, fuzzy, python-brace-format #| msgid "" @@ -2929,6 +2956,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 #, fuzzy #| msgid "Mumble Voice Chat Server" @@ -2971,36 +3002,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Bestanden downloaden met eDonkey-toepassingen" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Peer-to-peer bestandsdeling" @@ -4026,6 +4057,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4161,31 +4198,27 @@ msgstr "" "mogelijk om de rest van het internetgebruik via {box_name} te leiden, voor " "meer veiligheid en anonimiteit." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Virtual Private Network" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" " Download profiel" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "OpenVPN server Inschakelen" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4196,15 +4229,15 @@ msgstr "" "Afhankelijk van de snelheid van %(box_name)s kan dit zelfs uren duren. Als " "de installatie wordt onderbroken, kan deze opnieuw gestart worden." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Setup starten" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "OpenVPN setup draait" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4249,20 +4282,15 @@ msgstr "" msgid "Download my profile" msgstr "Download mijn profiel" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Instelling voltooid." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Instelling mislukt." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Instelling onveranderd" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4275,19 +4303,19 @@ msgstr "" "Dit is alleen vereist als de diensten op {box_name} niet te bereiken zijn " "vanaf de rest van internet. Dit is het geval in de volgende situaties:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} is verbonden achter een beperkende firewall." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} is verbonden met een (wireless) router die niet onder eigen " "controle staat." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4295,7 +4323,7 @@ msgstr "" "De internetprovider geeft geen extern IP adres maar maakt gebruik van een " "NAT verbinding." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4303,11 +4331,11 @@ msgstr "" "De internetprovider geeft geen statisch IP adres, en het IP adres verandert " "telkens wanneer u verbinding maakt met internet." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "De internetprovider beperkt inkomende verbindingen." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4327,15 +4355,15 @@ msgstr "" "\">pagekite.net. In de toekomst is het misschien mogelijk om de " "{box_name} van een van je vrienden te gebruiken." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Publieke zichtbaarheid" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "PageKite domein" @@ -4649,31 +4677,37 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale is een CalDAV en CardDAV server. Het biedt synchronisatie en delen " "van agenda- en contactgegevens. Om Radicale te gebruiken is een ondersteunde clienttoepassing nodig. " "Radicale kan worden benaderd door elke {box_name} gebruiker." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Agenda en Adresboek" @@ -4855,6 +4889,30 @@ msgstr "" msgid "Network File Storage" msgstr "Netwerktijdsserver" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "IRC Client" +msgid "Android Samba Client" +msgstr "IRC Cliënt" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "GNOME Kalender" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5826,6 +5884,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Root-partitie uitbreiden" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6194,6 +6258,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "Een Tor SOCKS poort is beschikbaar op %(box_name)s, op TCP poort 9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Instelling onveranderd" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7257,8 +7325,11 @@ msgid "Mailing list" msgstr "Mailinglijst" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" "%(service_name)s is alleen beschikbaar binnen interne netwerken." @@ -7339,6 +7410,9 @@ msgstr "%(percentage)s%% voltooid" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Enable OpenVPN server" +#~ msgstr "OpenVPN server Inschakelen" + #~ msgid "active" #~ msgstr "actief" @@ -8001,9 +8075,6 @@ msgstr "Gujarati" #~ msgid "Archive name" #~ msgstr "Archiefnaam" -#~ msgid "Name for new backup archive." -#~ msgstr "Naam voor nieuw back-uparchief." - #~ msgid "Invalid archive name" #~ msgstr "Ongeldige archiefnaam" diff --git a/plinth/locale/pl/LC_MESSAGES/django.po b/plinth/locale/pl/LC_MESSAGES/django.po index 381783204..6f2eedbf1 100644 --- a/plinth/locale/pl/LC_MESSAGES/django.po +++ b/plinth/locale/pl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-02-19 22:47+0000\n" "Last-Translator: Radek Pasiok \n" "Language-Team: Polish user@host:~/path/to/repo/" @@ -248,11 +262,11 @@ msgstr "" "Ścieżka nowego lub istniejącego repozytorium, np.: user@host:~/sciezka/do/" "repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Hasło do serwera SSH" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -260,11 +274,11 @@ msgstr "" "Hasło do serwera SSH.
Autoryzacja z użyciem klucza SSH nie jest jeszcze " "możliwa." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Zdalne repozytorium już istnieje." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Wybierz zweryfikowany klucz publiczny SSH" @@ -369,13 +383,6 @@ msgstr "Utwórz repozytorium" msgid "Delete this archive permanently?" msgstr "Usunąć trwale to archiwum?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Nazwa" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Czas" @@ -425,7 +432,7 @@ msgstr "{box_name} Podręcznik" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Odtwórz" @@ -549,89 +556,89 @@ msgstr "Zweryfikuj hosta" msgid "Archive created." msgstr "Archiwum zostało utworzone." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Usuń archiwum" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archiwum zostało usunięte." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Prześlij i odtwórz kopię zapasową" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Odtworzono dane z kopii zapasowej." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Brak kopii zapasowych." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Odtwórz z przesłanego pliku" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "Nie ma dysków, na których można dodać repozytorium." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Utwórz repozytorium kopii zapasowych" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Utwórz zdalne repozytorium kopii zapasowych" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Dodano nowe zdalne repozytorium SSH." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Zweryfikuj klucz hosta SSH" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "Host SSH został już zweryfikowany." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "Zweryfikowano hosta SSH." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "Nie można zweryfikować klucza publicznego hosta SSH." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Nie powiodła się autoryzacja na zdalnym serwerze." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Błąd podczas ustanawiania połączenia z serwerem: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Usunięto repozytorium." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Usuń repozytorium" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" "Usunięto repozytorium. Umieszczone w nim kopie bezpieczeństwa nie zostały " "usunięte." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Nie udało się odmontować!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Montowanie nie udało się" @@ -716,8 +723,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Konfigurcja uaktualniona" @@ -736,6 +743,14 @@ msgstr "" "wymagane. Dostępny jest również terminal konsoli." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -749,18 +764,18 @@ msgstr "" "href=\"/_cockpit/\">/_cockpit/. Dostęp do niego mają użytkownicy {box_name} z do grupy administratorów." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Administracja serwera" @@ -1471,8 +1486,8 @@ msgstr "Informacje" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1610,19 +1625,19 @@ msgstr "" msgid "Firewall" msgstr "Firewall" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "Service %(service_name)s is not running." msgid "Port {name} ({details}) available for internal networks" msgstr "Usługa %(service_name)s nie jest uruchomiona." -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "Service %(service_name)s is not running." msgid "Port {name} ({details}) available for external networks" msgstr "Usługa %(service_name)s nie jest uruchomiona." -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1685,6 +1700,18 @@ msgstr "" "automatycznie przepuszczana przez firewall a gdy jest wyłączona, jest " "również blokowana przez firewall." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2877,6 +2904,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2917,36 +2948,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3900,6 +3931,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "Plinth is up to date." @@ -4028,30 +4065,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4059,15 +4092,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4097,20 +4130,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Ustawienie bez zmian" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4119,33 +4147,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4154,15 +4182,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4433,24 +4461,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4595,6 +4624,28 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Chat Client" +msgid "Android Samba Client" +msgstr "Klient czatu" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5506,6 +5557,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Rozszerz główną partycję" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5803,6 +5860,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Ustawienie bez zmian" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6829,7 +6890,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, fuzzy, python-format #| msgid "Service %(service_name)s is not running." -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "Usługa %(service_name)s nie jest uruchomiona." #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/pt/LC_MESSAGES/django.po b/plinth/locale/pt/LC_MESSAGES/django.po index a3f912684..f468e6cd9 100644 --- a/plinth/locale/pt/LC_MESSAGES/django.po +++ b/plinth/locale/pt/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-04-08 13:55+0000\n" "Last-Translator: Manuela Silva \n" "Language-Team: Portuguese user@host:~/path/to/repo/" @@ -248,11 +262,11 @@ msgstr "" "Caminho de um repositório novo ou existente. Exemplo: user@host:~/path/to/" "repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Palavra-passe do servidor SSH" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -260,11 +274,11 @@ msgstr "" "Password do Servidor SSH.
Autenticação SSH key-based ainda não é " "possível." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "O repositório remoto de backup já existe." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Seleccione a chave pública de SSH verificada" @@ -368,13 +382,6 @@ msgstr "Criar Repositório" msgid "Delete this archive permanently?" msgstr "Apagar este arquivo permanentemente?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Nome" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Hora" @@ -416,7 +423,7 @@ msgstr "Transferir" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Restaurar" @@ -516,87 +523,87 @@ msgstr "Verificar Hospedeiro" msgid "Archive created." msgstr "Arquivo criado." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Eliminar Arquivo" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Arquivo eliminado." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Enviar e restaurar uma cópia de segurança" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Ficheiros da cópia de segurança restaurados." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Ficheiro de cópias de segurança não encontrado." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Restaurar de um ficheiro enviado" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "Nenhum disco adicional disponível para adicionar um repositório." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Criar repositório de cópias de segurança" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Criar repositório remoto de cópias de segurança" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Adicionar novo repositório de SSH remoto." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Erro a estabelecer ligação ao servidor: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Repositório removido." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Remover Repositório" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Repositório removido. As cópias de segurança não foram eliminadas." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Remoção falhou!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Criação falhou" @@ -672,8 +679,8 @@ msgstr "Atualizar endereço de IP e domínios" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Configuração atualizada" @@ -688,24 +695,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Administração do Servidor" @@ -1341,8 +1356,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1463,19 +1478,19 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for internal networks" msgstr "O Servidor da descoberta do serviço não está a correr" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for external networks" msgstr "O Servidor da descoberta do serviço não está a correr" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1531,6 +1546,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2694,6 +2721,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2734,36 +2765,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3723,6 +3754,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3850,30 +3887,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3881,15 +3914,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3919,20 +3952,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Definição inalterada" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3941,33 +3969,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3976,15 +4004,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4248,24 +4276,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4412,6 +4441,26 @@ msgstr "" msgid "Network File Storage" msgstr "Servidor do Tempo da Rede" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5301,6 +5350,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5599,6 +5654,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Definição inalterada" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6561,7 +6620,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, fuzzy, python-format #| msgid "Service discovery server is not running" -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "O Servidor da descoberta do serviço não está a correr" #: plinth/templates/internal-zone.html:17 @@ -6715,9 +6776,6 @@ msgstr "Gujarati" #~ msgid "chrony client in contact with servers" #~ msgstr "Cliente NTP em contacto com servidores" -#~ msgid "Name for new backup archive." -#~ msgstr "Nome para o novo arquivo de backup." - #, fuzzy #~| msgid "New backup" #~ msgid "Upload backup" diff --git a/plinth/locale/ru/LC_MESSAGES/django.po b/plinth/locale/ru/LC_MESSAGES/django.po index e86adca45..ba75be99f 100644 --- a/plinth/locale/ru/LC_MESSAGES/django.po +++ b/plinth/locale/ru/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-21 13:41+0000\n" "Last-Translator: Artem \n" "Language-Team: Russian user@host:~/path/to/repo/" @@ -250,22 +264,22 @@ msgstr "" "Путь к новому или существующему репозиторию. Например: user@host:~/path/" "to/repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Пароль SSH-сервера" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" "Пароль SSH сервера.
SSH key-based authentication is not yet possible." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Удалённое хранилище резервных копий уже существует." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Выберите проверенный открытый ключ SSH" @@ -389,13 +403,6 @@ msgstr "Создать репозиторий" msgid "Delete this archive permanently?" msgstr "Окончательно удалить этот архив?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Имя" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Время" @@ -446,7 +453,7 @@ msgstr "Загрузка" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Восстановить" @@ -564,83 +571,83 @@ msgstr "Проверить хост" msgid "Archive created." msgstr "Архив создан." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Удалить архив" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Архив удалён." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 #, fuzzy #| msgid "Exported backup archives" msgid "Upload and restore a backup" msgstr "Экспортированные резервные копии" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Восстановленные файлы из резервного копирования." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Резервных копий не найдено." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Восстановить из загруженного файла" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "Нет дополнительных дисков, чтобы добавить репозиторий." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create remote backup repository" msgid "Create backup repository" msgstr "Создать удаленный репозиторий резервного сохранения" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Создать удаленный репозиторий резервного сохранения" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Добавлен новый удалённый SSH-репозиторий." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Проверить ключ SSH хоста" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH хост уже проверен." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH хост проверен." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "Открытый ключ SSH хоста не может быть проверен." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Аутентификация на удалённый сервер не прошла." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Ошибка при установке соединения с сервером: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Репозиторий удалён." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Удалить репозиторий" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 #, fuzzy #| msgid "Repository removed. The remote backup itself was not deleted." msgid "Repository removed. Backups were not deleted." @@ -648,11 +655,11 @@ msgstr "" "Репозиторий удалён. Файлы резервного сохранения на удаленной машине не были " "удалены." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Размонтирование не удалось!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Монтирование не удалась" @@ -739,8 +746,8 @@ msgstr "Обновите IP-адреса и домены" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Конфигурация обновлена" @@ -759,6 +766,14 @@ msgstr "" "на основе консоли управления также доступен." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -772,7 +787,7 @@ msgstr "" "веб-сервере. Он может быть доступен на любому " "пользователю {box_name}, принадлежащему к группе админов." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -780,12 +795,12 @@ msgstr "" "Доступ в Кокпит возможен только через доменное имя. Доступ невозможен, если " "использовать IP-адрес как часть URL." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Администрирование сервера" @@ -1512,8 +1527,8 @@ msgstr "О службе" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1660,19 +1675,19 @@ msgstr "" msgid "Firewall" msgstr "Брандмауэр" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "%(service_name)s is available only on internal networks." msgid "Port {name} ({details}) available for internal networks" msgstr "%(service_name)s доступно только во внутренних сетях." -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "%(service_name)s is available only on internal networks." msgid "Port {name} ({details}) available for external networks" msgstr "%(service_name)s доступно только во внутренних сетях." -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Порт {name} ({details}) недоступен для внешних сетей" @@ -1736,6 +1751,18 @@ msgstr "" "разрешается в брандмауэре и при отключении службы она также запрещается в " "брандмауэре." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, fuzzy, python-brace-format #| msgid "" @@ -3067,6 +3094,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 #, fuzzy #| msgid "Mumble Voice Chat Server" @@ -3109,7 +3140,7 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -3120,7 +3151,7 @@ msgstr "" "пиринговый сетях, таких, как eDonkey, Kademlia, Overnet, BitTorrent и " "DirectConnect." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3131,7 +3162,7 @@ msgstr "" "это с помощью любого мобильного или десктопного фронтэнда или через telnet. " "Смотри руководство." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." @@ -3139,16 +3170,16 @@ msgstr "" "В {box_name}, загруженные Файлы могут быть найдены в /var/lib/mldonkey/ " "directory." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Загрузить файлы, используя приложение eDonkey" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "MLDonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Файлообмен P2P" @@ -4172,6 +4203,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4307,31 +4344,27 @@ msgstr "" "также получить доступ к остальной части Интернет через {box_name} для " "дополнительной безопасности и анонимности." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Виртуальная частная сеть" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "Скачать профиль" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Включить сервер OpenVPN" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4343,15 +4376,15 @@ msgstr "" "занять продолжительное время. Если установка прерывается, вы можете начать " "её снова." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Запуск программы установки" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "Выполняется установка OpenVPN" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4398,20 +4431,15 @@ msgstr "" msgid "Download my profile" msgstr "Скачать мой профиль" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Установка завершена." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Установка не удалась." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Настройки без изменений" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4424,19 +4452,19 @@ msgstr "" "недоступны из остальной части интернета. Это включает в себя следующие " "ситуации:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} ограничен брандмауэром." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} подключен к маршрутизатору (беспроводному), который вы не " "контролируете." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4444,7 +4472,7 @@ msgstr "" "Ваш провайдер не предоставляет вам внешний IP-адрес и вместо этого " "обеспечивает подключение к Интернету через NAT." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4452,11 +4480,11 @@ msgstr "" "Ваш провайдер не предоставляет вам статический IP-адрес, и ваш-IP адрес " "изменяется каждый раз при подключении к Интернету." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Ваш провайдер ограничивает входящие соединения." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4475,15 +4503,15 @@ msgstr "" "услуг pagekite, например pagekite.net. " "В будущем, для этого возможно будет использовать {box_name} вашего приятеля." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PаgeKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Публичная видимость" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -4796,12 +4824,18 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale это CalDAV и CardDAV сервер. Он позволяет синхронизировать и " "делиться запланированными событиями и контактами. Чтобы использовать " @@ -4809,7 +4843,7 @@ msgstr "" "клиентское приложение. Radicale будет доступен всем пользователям " "{box_name}." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4819,12 +4853,12 @@ msgstr "" "создание новых календарей и адресных книг. Он не поддерживает добавление " "событий или контактов, для этого требуется отдельный клиент." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Календарь и Адресная книга" @@ -5007,6 +5041,30 @@ msgstr "" msgid "Network File Storage" msgstr "Сетевой сервер времени" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "IRC Client" +msgid "Android Samba Client" +msgstr "IRC-клиент" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "GNOME календарь" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -6006,6 +6064,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Расширить корневой раздел" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6367,6 +6431,10 @@ msgstr "SОCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "Порт Tor SOCKS вашего %(box_name)s доступен по порту TCP 9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Настройки без изменений" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7429,8 +7497,11 @@ msgid "Mailing list" msgstr "Список рассылки" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "%(service_name)s доступно только во внутренних сетях." #: plinth/templates/internal-zone.html:17 @@ -7513,6 +7584,9 @@ msgstr "%(percentage)s%% завершено" msgid "Gujarati" msgstr "Гуджарати" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Включить сервер OpenVPN" + #~ msgid "active" #~ msgstr "активен" @@ -8077,9 +8151,6 @@ msgstr "Гуджарати" #~ msgid "Archive name" #~ msgstr "Имя архива" -#~ msgid "Name for new backup archive." -#~ msgstr "Имя для нового архива." - #~ msgid "Invalid archive name" #~ msgstr "Недопустимое имя архива" diff --git a/plinth/locale/sl/LC_MESSAGES/django.po b/plinth/locale/sl/LC_MESSAGES/django.po index b4d5731c6..b69a1061c 100644 --- a/plinth/locale/sl/LC_MESSAGES/django.po +++ b/plinth/locale/sl/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2019-05-07 20:48+0000\n" "Last-Translator: Erik Ušaj \n" "Language-Team: Slovenian user@host:~/path/to/repo/" @@ -255,11 +267,11 @@ msgstr "" "Pot do novega ali obstoječega skladišča. Npr. uporabnik@gostitelj:~/pot/" "do/skladišča/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "Geslo strežnika SSH" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -267,13 +279,13 @@ msgstr "" "Geslo strežnika SSH.
Preverjanje pristnosti na osnovi ključev SSH še " "ni omogočeno." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 #, fuzzy #| msgid "Create remote backup repository" msgid "Remote backup repository already exists." msgstr "Ustvari oddaljeno skladišče za rezervne kopije" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -393,13 +405,6 @@ msgstr "Ustvari novo skladišče" msgid "Delete this archive permanently?" msgstr "Želite ta arhiv trajno izbrisati?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Ime" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Čas" @@ -447,7 +452,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Obnovitev" @@ -569,97 +574,97 @@ msgstr "" msgid "Archive created." msgstr "Arhiv je ustvarjen." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Izbriši arhiv" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Arhiv je izbrisan." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Datoteke iz rezervne kopije so obnovljene." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Ne najdem datoteke z rezervno kopijo." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Obnavljanje iz naložene datoteke" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create remote backup repository" msgid "Create backup repository" msgstr "Ustvari oddaljeno skladišče za rezervne kopije" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Ustvari oddaljeno skladišče za rezervne kopije" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 #, fuzzy #| msgid "Added new repository." msgid "Added new remote SSH repository." msgstr "Dodano je novo skladišče." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing application: {error}" msgid "Error establishing connection to server: {}" msgstr "Napaka ob nameščanju aplikacije: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 #, fuzzy #| msgid "Repository not found" msgid "Repository removed." msgstr "Ne najdem skladišča" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Odstrani skladišče" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 #, fuzzy #| msgid "Repository removed. The remote backup itself was not deleted." msgid "Repository removed. Backups were not deleted." msgstr "Skladišče je odstranjeno. Oddaljena rezervna kopija ni izbrisana." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Odklapljanje ni uspelo!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Priklapljanje ni uspelo" @@ -742,8 +747,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Konfiguracija je posodobljena" @@ -762,6 +767,14 @@ msgstr "" "ukazno vrstico." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -776,18 +789,18 @@ msgstr "" "\"{users_url}\">katerikoli uporabnik na {box_name}, ki je član skupine " "skrbnikov." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Skrbništvo strežnika" @@ -1414,8 +1427,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1534,17 +1547,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1600,6 +1613,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2715,6 +2740,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2755,36 +2784,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3732,6 +3761,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3859,30 +3894,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3890,15 +3921,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3928,20 +3959,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3950,33 +3976,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3985,15 +4011,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4257,24 +4283,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4417,6 +4444,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5287,6 +5334,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5578,6 +5631,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6531,7 +6588,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/sr/LC_MESSAGES/django.po b/plinth/locale/sr/LC_MESSAGES/django.po index 7bc756c21..b4d029527 100644 --- a/plinth/locale/sr/LC_MESSAGES/django.po +++ b/plinth/locale/sr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-04-13 05:34+0000\n" "Last-Translator: vihor \n" "Language-Team: Serbian user@host:~/path/to/repo/" @@ -250,11 +264,11 @@ msgstr "" "Putanja novog ili postojećeg repozitorijuma: Primer: user@host:~/path/to/" "repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH serverska lozinka" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -262,11 +276,11 @@ msgstr "" "SSH serverska lozinka.
Autentifikacija sa SSH ključem još uvek nije " "moguća." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Remote rezervni repozitorijum već postoji." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Izaberi provereni SSH javni ključ" @@ -365,13 +379,6 @@ msgstr "Kreirajte repozitorij" msgid "Delete this archive permanently?" msgstr "Obrisati arhivu trajno?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Ime" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Vreme" @@ -413,7 +420,7 @@ msgstr "Preuzmi" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Vrati" @@ -518,87 +525,87 @@ msgstr "Potvrdi host mašinu" msgid "Archive created." msgstr "Arhiva kreirana." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Izbriši arhivu" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Arhiva izbrisana." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Otpremi ili vrati rezervnu arhivsku kopiju" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Restorovane datoteke." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Nije pronađena rezervna datoteka." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Povrati podatke iz otpremljenog fajla" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "Nema dodatnih hard diskova , da dodate repozitorijum." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Kreirajte rezervni repozitorij" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Kreirajte remote rezervni repozitorij" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Novi remote SSH repozitorij dodat." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Verifikujte SSH hostkey" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH je već verifikovan." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH host je verifikovan." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "SSH host public key nije verifikovan." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Remote server autentifikacija je neuspešna." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Greška prilikom uspostavljanja veze sa serverom: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Repozitorij obrisan." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Obriši repozitorij" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Repzitorij obrisan. Rezervne kopije nisu izbrisane." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Neuspešno unmountovanje!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Mountovanje neuspešno" @@ -677,8 +684,8 @@ msgstr "Osveži listu IP adresa i domena" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Konfiguracija sačuvana" @@ -696,6 +703,14 @@ msgstr "" "takođe dostupan." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -704,7 +719,7 @@ msgstr "" "Pristup moguć korisnik na {box_name} koja " "pripada admin grupi." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -712,12 +727,12 @@ msgstr "" "Cockpit-u se pristupa isključivo preko domena. Neće raditi preko IP adrese " "kao URL." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Kokpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Administracija Servera" @@ -1332,8 +1347,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1452,17 +1467,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1518,6 +1533,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2607,6 +2634,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2647,36 +2678,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3620,6 +3651,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3747,30 +3784,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3778,15 +3811,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3816,20 +3849,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3838,33 +3866,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3873,15 +3901,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4145,24 +4173,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4305,6 +4334,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5163,6 +5212,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5454,6 +5509,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6363,7 +6422,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/sv/LC_MESSAGES/django.po b/plinth/locale/sv/LC_MESSAGES/django.po index 6b986c457..dc20a4dfe 100644 --- a/plinth/locale/sv/LC_MESSAGES/django.po +++ b/plinth/locale/sv/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-05-11 10:41+0000\n" "Last-Translator: Michael Breidenbach \n" "Language-Team: Swedish user@host:~/path/to/repo/" @@ -248,11 +262,11 @@ msgstr "" "Sökväg till ett nytt eller befintligt arkiv. Exempel: user@host:~/path/to/" "repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH server lösenord" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -260,11 +274,11 @@ msgstr "" "Lösenord för SSH-servern.
SSH-nyckelbaserad autentisering är ännu " "inte möjligt." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Fjärrbackup respository finns redan." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "Välj verifierad Offentlig SSH-nyckel" @@ -367,13 +381,6 @@ msgstr "Skapa respository" msgid "Delete this archive permanently?" msgstr "Vill du ta bort arkivet permanent?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Namn" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Tid" @@ -416,7 +423,7 @@ msgstr "Ladda ner" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Återställa" @@ -525,89 +532,89 @@ msgstr "Verifiera Host" msgid "Archive created." msgstr "Arkiv skapat." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Ta bort Archiv" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Archiv borttagen." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "Ladda upp och återställ en säkerhetskopia" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Återställda filer från säkerhetskopian." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Ingen backup-fil hittades." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Återställ från uppladdad fil" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" "Det finns inga ytterligare diskar tillgängliga för att lägga till ett " "repository." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "Skapa backup repository" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Skapa remote backup repository" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Lade till ett nytt remote SSH-repository." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "Verifiera SSH hostkey" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH host redan verifierat." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH host verifierade." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "SSH hosts offentliga nyckel kunde inte verifieras." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "Autentisering till remote servern misslyckades." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Fel vid upprättande av anslutning till servern: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Repository raderad." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Radera Repository" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "Repository tas bort.Säkerhetskopior raderades inte." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Avmontering misslyckas!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Avmontering misslyckades" @@ -687,8 +694,8 @@ msgstr "Uppdatera IP-adress och domäner" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Konfiguration uppdaterad" @@ -707,6 +714,14 @@ msgstr "" "webbaserad terminal för konsoloperationer är också tillgänglig." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " @@ -715,7 +730,7 @@ msgstr "" "Den kan nås genom att alla användar på " "{box_name} som hör till administratörsgruppen." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." @@ -723,12 +738,12 @@ msgstr "" "Cockpit kräver att du öppnar den via ett domännamn. Det kommer inte att " "fungera när de nås med en IP-adress som en del av webbadressen." -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Server administrering" @@ -1442,8 +1457,8 @@ msgstr "Om" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1585,17 +1600,17 @@ msgstr "" msgid "Firewall" msgstr "Brandvägg" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "Port {name} ({details}) tillgängligt för interna nätverk" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "Port {name} ({details}) tillgängligt för externa nätverk" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "Port {name} ({details}) är inte tillgängligt för externa nätverk" @@ -1658,6 +1673,18 @@ msgstr "" "automatiskt i brandväggen och om du inaktiverar en tjänst, så inaktiveras " "den även automatiskt i brandväggen." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2942,6 +2969,10 @@ msgstr "" msgid "Media streaming server" msgstr "Media Streaming Server" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "Enkel mediaserver" @@ -2987,7 +3018,7 @@ msgstr "Den angivna katalogen finns inte." msgid "Updated media directory" msgstr "Uppdaterad mediekatalog" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " @@ -2997,7 +3028,7 @@ msgstr "" "stora filer. Det kan delta i flera peer-to-peer-nätverk, inklusive eDonkey, " "Kademlia, Overnet, BitTorrent och DirectConnect." -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " @@ -3008,23 +3039,23 @@ msgstr "" "någon av de separata mobil-eller skrivbords frontend-ändarna eller ett " "Telnet-gränssnitt. Se manualen." -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" "På {box_name}, kan nedladdade filer hittas i /var/lib/mldonkey/ mappen." -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "Ladda ner filer med eDonkey program" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "Mldonkey" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "Peer-to-peer fildelning" @@ -4110,6 +4141,12 @@ msgstr "" "Din Internetanslutning är direkt kopplad till dina %(box_name)s och det " "finns inga andra enheter i nätverket." +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -4262,31 +4299,27 @@ msgstr "" "tillhandahålls av {box_name}. Du kan också komma åt resten av Internet via " "{box_name} för ökad säkerhet och anonymitet." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Virtuellt privat nätverk" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "Ladda ner profil" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "Aktivera OpenVPN server" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "Tunnelblick" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4297,15 +4330,15 @@ msgstr "" "säker installation. Beroende på hur snabbt din %(box_name)s är, kan det " "även ta timmar. Om installationen avbryts kan du starta den igen." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Starta installation" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "OpenVPN-installationen körs" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4344,20 +4377,15 @@ msgstr "" msgid "Download my profile" msgstr "Ladda ner min profil" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Installationen har slutförts." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Installationen misslyckades." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Instänllningar oförändrade" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4370,18 +4398,18 @@ msgstr "" "tjänster inte kan nås från resten av Internet. Detta inkluderar följande " "situationer:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} är bakom en begränsad brandvägg." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} är anslutet till en (trådlös) router som du inte kontrollerar." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4389,7 +4417,7 @@ msgstr "" "Din ISP ger dig inte en extern IP-adress och ger istället Internet " "uppkoppling via NAT." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." @@ -4397,11 +4425,11 @@ msgstr "" "Din ISP ger dig inte en statisk IP-adress och din IP-adress ändras varje " "gång du ansluter till Internet." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "Din ISP begränsar inkommande anslutningar." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -4415,15 +4443,15 @@ msgstr "" "pagekite. net . I framtiden kan det vara möjligt att använda din kompis " "{box_name} för detta." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Offentlig Synlighet" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "PageKite domän" @@ -4725,19 +4753,25 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale är en CalDAV och CardDAV Server. Det tillåter synkronisering och " "delning av schemaläggning och kontaktdata. Om du vill använda Radicale krävs " "en klientprogram som stöds. " "Radicale kan kommas åt av alla användare med en {box_name}-inloggning." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " @@ -4747,12 +4781,12 @@ msgstr "" "skapandet av nya kalendrar och adressböcker. Det stöder inte att lägga till " "händelser eller kontakter, som måste göras med hjälp av en separat klient." -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Kalender och adressbok" @@ -4937,6 +4971,30 @@ msgstr "Samba" msgid "Network File Storage" msgstr "Tidsserver för nätverket" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Add Client" +msgid "Android Samba Client" +msgstr "Lägg till klient" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "GNOME-kalender" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5884,6 +5942,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Utöka root-partitionen" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6229,6 +6293,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "En Tor SOCKS-port finns på din %(box_name)s på TCP-port 9050." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Instänllningar oförändrade" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7224,8 +7292,11 @@ msgid "Mailing list" msgstr "E-postlista" #: plinth/templates/internal-zone.html:11 -#, python-format -msgid "%(service_name)s is available only on internal networks." +#, fuzzy, python-format +#| msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "%(service_name)s är endast tillgänglig på interna nätverk." #: plinth/templates/internal-zone.html:17 @@ -7307,6 +7378,9 @@ msgstr "%(percentage)s %% färdigt" msgid "Gujarati" msgstr "Gujarati" +#~ msgid "Enable OpenVPN server" +#~ msgstr "Aktivera OpenVPN server" + #~ msgid "active" #~ msgstr "Aktiva" diff --git a/plinth/locale/ta/LC_MESSAGES/django.po b/plinth/locale/ta/LC_MESSAGES/django.po index f0527da62..ce6356e4d 100644 --- a/plinth/locale/ta/LC_MESSAGES/django.po +++ b/plinth/locale/ta/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -141,115 +141,127 @@ msgid "{app} (No data to backup)" msgstr "" #: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/templates/backups_delete.html:18 +#: plinth/modules/ikiwiki/forms.py:15 +#: plinth/modules/networks/templates/connection_show.html:63 +#: plinth/modules/sharing/templates/sharing.html:37 +msgid "Name" +msgstr "" + +#: plinth/modules/backups/forms.py:53 +msgid "(Optional) Set a name for this backup archive" +msgstr "" + +#: plinth/modules/backups/forms.py:56 msgid "Included apps" msgstr "" -#: plinth/modules/backups/forms.py:52 +#: plinth/modules/backups/forms.py:56 msgid "Apps to include in the backup" msgstr "" -#: plinth/modules/backups/forms.py:66 +#: plinth/modules/backups/forms.py:70 msgid "Select the apps you want to restore" msgstr "" -#: plinth/modules/backups/forms.py:79 +#: plinth/modules/backups/forms.py:83 msgid "Upload File" msgstr "" -#: plinth/modules/backups/forms.py:81 +#: plinth/modules/backups/forms.py:85 msgid "Backup files have to be in .tar.gz format" msgstr "" -#: plinth/modules/backups/forms.py:82 +#: plinth/modules/backups/forms.py:86 msgid "Select the backup file you want to upload" msgstr "" -#: plinth/modules/backups/forms.py:88 +#: plinth/modules/backups/forms.py:92 msgid "Repository path format incorrect." msgstr "" -#: plinth/modules/backups/forms.py:95 +#: plinth/modules/backups/forms.py:99 #, python-brace-format msgid "Invalid username: {username}" msgstr "" -#: plinth/modules/backups/forms.py:105 +#: plinth/modules/backups/forms.py:109 #, python-brace-format msgid "Invalid hostname: {hostname}" msgstr "" -#: plinth/modules/backups/forms.py:109 +#: plinth/modules/backups/forms.py:113 #, python-brace-format msgid "Invalid directory path: {dir_path}" msgstr "" -#: plinth/modules/backups/forms.py:115 +#: plinth/modules/backups/forms.py:119 msgid "Encryption" msgstr "" -#: plinth/modules/backups/forms.py:116 +#: plinth/modules/backups/forms.py:120 msgid "" "\"Key in Repository\" means that a password-protected key is stored with the " "backup." msgstr "" -#: plinth/modules/backups/forms.py:120 plinth/modules/networks/forms.py:262 +#: plinth/modules/backups/forms.py:124 plinth/modules/networks/forms.py:262 msgid "Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:121 +#: plinth/modules/backups/forms.py:125 msgid "Passphrase; Only needed when using encryption." msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Confirm Passphrase" msgstr "" -#: plinth/modules/backups/forms.py:124 +#: plinth/modules/backups/forms.py:128 msgid "Repeat the passphrase." msgstr "" -#: plinth/modules/backups/forms.py:135 +#: plinth/modules/backups/forms.py:139 msgid "The entered encryption passphrases do not match" msgstr "" -#: plinth/modules/backups/forms.py:139 +#: plinth/modules/backups/forms.py:143 msgid "Passphrase is needed for encryption." msgstr "" -#: plinth/modules/backups/forms.py:174 +#: plinth/modules/backups/forms.py:178 msgid "Select Disk or Partition" msgstr "" -#: plinth/modules/backups/forms.py:175 +#: plinth/modules/backups/forms.py:179 msgid "Backups will be stored in the directory FreedomBoxBackups" msgstr "" -#: plinth/modules/backups/forms.py:184 +#: plinth/modules/backups/forms.py:188 msgid "SSH Repository Path" msgstr "" -#: plinth/modules/backups/forms.py:185 +#: plinth/modules/backups/forms.py:189 msgid "" "Path of a new or existing repository. Example: user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -346,13 +358,6 @@ msgstr "" msgid "Delete this archive permanently?" msgstr "" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "" @@ -394,7 +399,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "" @@ -485,87 +490,87 @@ msgstr "" msgid "Archive created." msgstr "" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 msgid "Create backup repository" msgstr "" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -638,8 +643,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "" @@ -654,24 +659,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1286,8 +1299,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1406,17 +1419,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1472,6 +1485,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2561,6 +2586,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2601,36 +2630,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3574,6 +3603,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3701,30 +3736,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3732,15 +3763,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3770,20 +3801,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3792,33 +3818,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3827,15 +3853,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4099,24 +4125,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4259,6 +4286,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5117,6 +5164,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5408,6 +5461,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6317,7 +6374,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/te/LC_MESSAGES/django.po b/plinth/locale/te/LC_MESSAGES/django.po index a2f25e803..e7c45d76c 100644 --- a/plinth/locale/te/LC_MESSAGES/django.po +++ b/plinth/locale/te/LC_MESSAGES/django.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: FreedomBox UI\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2020-04-25 14:11+0000\n" "Last-Translator: Joseph Nuthalapati \n" "Language-Team: Telugu user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH సర్వర్ పాస్ వర్డ్" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "SSH సర్వర్ యొక్క పాస్వర్డ్.
SSH కీ-ఆధారిత ప్రామాణీకరణ ఇంకా సాధ్యం కాదు." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "ధృవీకరించబడిన SSH పబ్లిక్ కీని ఎంచుకోండి" @@ -379,13 +393,6 @@ msgstr "వినియోగదారుని సృష్టించు" msgid "Delete this archive permanently?" msgstr "%(name)s అనుసంధానం శాశ్వతంగా తొలగించు ?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "పేరు" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "సమయం" @@ -434,7 +441,7 @@ msgstr "దిగుమతి అవుతోంది" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "పునరుద్ధరించు" @@ -532,93 +539,93 @@ msgstr "హోస్ట్ ను నిర్ధారించండి" msgid "Archive created." msgstr "భాండాగారాము సృజింపబడింది." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "ఆర్కైవ్ తొలగించు" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "ఆర్కైవ్ తొలగించబడింది." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "బ్యాకప్‌ను అప్‌లోడ్ చేసి పునరుద్ధరించండి" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "బ్యాకప్ నుండి పునరుద్ధరించబడిన ఫైళ్లు." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "ఏ బ్యాకప్ ఫైల్ దొరకలేదు." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "అప్‌లోడ్ చేసిన ఫైల్ నుండి పునరుద్ధరించండి" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "రిపోజిటరీని జోడించడానికి అదనపు డిస్కులు అందుబాటులో లేవు." -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create Snapshot" msgid "Create backup repository" msgstr "స్నాప్షాట్‌ని సృష్టించు" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "రిమోట్ బ్యాకప్ రిపోజిటరీని సృష్టించండి" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 #, fuzzy #| msgid "Add new introducer" msgid "Added new remote SSH repository." msgstr "కొత్త పరిచయకర్తని జోడించండి" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "SSH హోస్ట్‌కీని ధృవీకరించండి" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH హోస్ట్ ఇప్పటికే ధృవీకరించబడింది." -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH హోస్ట్ ధృవీకరించబడింది." -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "SSH హోస్ట్ పబ్లిక్ కీని ధృవీకరించడం సాధ్యం కాలేదు." -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "రిమోట్ సర్వర్‌కు ప్రామాణీకరణ విఫలమైంది." -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing application: {error}" msgid "Error establishing connection to server: {}" msgstr "అనువర్తనం స్థాపించుటలో దోషం: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "రిపోజిటరీ తొలగించబడింది." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "రిపోజిటరీని తొలగించండి" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "రిపోజిటరీ తొలగించబడింది. బ్యాకప్‌లు తొలగించబడలేదు." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "అన్‌మౌంటింగ్ విఫలమైంది!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "మౌంటింగ్ విఫలమైంది" @@ -703,8 +710,8 @@ msgstr "IP చిరునామా మరియు డొమైన్‌లన #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "ఆకృతీకరణ నవీకరించబడింది" @@ -722,6 +729,14 @@ msgstr "" "ఉన్నాయి.కన్సోల్ ఆపరేషన్లకు వెబ్ ఆధారిత టెర్మినల్ కూడా అందుబాటులో ఉంది." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -738,18 +753,18 @@ msgstr "" "ద్వారా పొందవచ్చు {box_name}.\n" "అంగీకార సమాచారం మరియు సిస్టమ్ మార్చడం సామర్ధ్యాలు నిర్వాహక సమూహం చెందిన వినియోగదారులకు పరిమితం." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "కాక్పిట్" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "సేవిక పరిపాలాన" @@ -1453,8 +1468,8 @@ msgstr "గురించి" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1595,19 +1610,19 @@ msgstr "" msgid "Firewall" msgstr "ఫైర్వాల్" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for internal networks" msgstr "సేవ ఆవిష్కరణ సేవికను నడుపటంలేదు" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for external networks" msgstr "సేవ ఆవిష్కరణ సేవికను నడుపటంలేదు" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1669,6 +1684,18 @@ msgstr "" "ఫైర్వాల్ పనితీరు స్వయాంచలికమైనది. మీరు ఒక సేవను అనుమతిస్తే అది ఫైర్వాల్లోకి కూడా అనుమతిచబడుతుంది. అలాగే " "మీరు ఒక సేవను ఆనుమతించకపోతే ఫైర్వాల్లో కూడా అది అనుమతింపబడదు." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2937,6 +2964,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "సరళమైన మీడియా సేవిక" @@ -2977,38 +3008,38 @@ msgstr "నిర్దేశిత డైరెక్టరీ ఉనికి msgid "Updated media directory" msgstr "మీడియా డైరెక్టరీని నవీకరించబడింది" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 #, fuzzy #| msgid "Download files using BitTorrent applications" msgid "Download files using eDonkey applications" msgstr "బిట్ టోరెంట్ అనువర్తనాలను ఉపయోగించి ఫైళ్లను డౌన్లోడ్ చేయండి" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "ఎంఎల్ డాంకీ" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "పీర్-టు-పీర్ ఫైల్ షేరింగ్" @@ -4034,6 +4065,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s is up to date." @@ -4169,33 +4206,29 @@ msgstr "" "మిగిలిన ఇంటర్నెట్ను యాక్సెస్ చేయవచ్చు మీ {box_name} 1 అనుసంధానించవచ్చు అదనపు భద్రత మరియు " "అనామకత్వం కోసం." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 #, fuzzy #| msgid "Open" msgid "OpenVPN" msgstr "తెరచిన" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "వర్చువల్ ప్రైవేట్ నెట్వర్క్" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" "స్థూల వివరం దిగుమతి" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "సేవిక తెరవండిVPN అమలుచెయ్యి" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, fuzzy, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4206,15 +4239,15 @@ msgstr "" "(box_name) లు 1 ఆధారపడి, అది కూడా గంటల సమయం పట్టవచ్చు. సెటప్ ఆటకం, మీరు మళ్ళీ దాన్ని మొదలు " "పెడతాయి." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "అమర్చిపెట్టు ప్రారంభం" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "అమర్చిపెటినా తెరిచినVPNనడుస్తుంది" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, fuzzy, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4251,20 +4284,15 @@ msgstr "ప్రొఫైల్ ప్రతి %(box_name)s వాడుకర msgid "Download my profile" msgstr "నా స్థూలవివరంల దిగుమతి" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "అమరక పూర్తయ్యింది." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "అమరక విఫలమైంది." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "మారకుండా అమర్చుతోంది" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, fuzzy, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4276,17 +4304,17 @@ msgstr "" "లేనప్పుడు కోసం ఒక వ్యవస్థ. మీ {box_name} 2 సేవలు ఇంటర్నెట్ మిగిలిన నుండి అందుబాటులో ఉంటే మీరు " "మాత్రమే ఈ అవసరం. ఈ క్రింది సందర్భాలలో కలిగి:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, fuzzy, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{Box_name} 1 నిరోధిత ఫైర్వాల్ వెనుక ఉంది." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, fuzzy, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "{Box_name} 1 మీరు నియంత్రించే లేని ఒక (వైర్లెస్) రౌటర్ అనుసంధానించబడిన." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 #, fuzzy msgid "" "Your ISP does not provide you an external IP address and instead provides " @@ -4295,7 +4323,7 @@ msgstr "" "మీ ISP మీరు ఒక బాహ్య IP చిరునామా అందించడం లేదు మరియు బదులుగా NAT ద్వారా ఇంటర్నెట్ కనెక్షన్ " "అందిస్తుంది." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 #, fuzzy msgid "" "Your ISP does not provide you a static IP address and your IP address " @@ -4304,12 +4332,12 @@ msgstr "" "మీ ISP మీరు స్టాటిక్ IP చిరునామా అందించడం లేదు మరియు మీ IP చిరునామా మీరు ఇంటర్నెట్ కు కనెక్ట్ ప్రతి " "సమయ మార్పులు." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 #, fuzzy msgid "Your ISP limits incoming connections." msgstr "మీ ISP ఇన్కమింగ్ కనెక్షన్లను పరిమితం చేస్తుంది." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4328,18 +4356,18 @@ msgstr "" "ఉపయోగించడానికి 3 సాధ్యం కావచ్చు ఉదాహరణకు pagekite." "net కోసం, ఏ pagekite సేవా ప్రదాత ఉపయోగించవచ్చు." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 #, fuzzy #| msgid "Pagekite" msgid "PageKite" msgstr "పేజ్ కైట్" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 #, fuzzy msgid "Public Visibility" msgstr "పబ్లిక్ దృష్టి గోచరత (PageKite)" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy msgid "PageKite Domain" msgstr "PageKite ఖాతా" @@ -4638,28 +4666,29 @@ msgstr "క్వాసెల్ డ్రొఇడ్" #, fuzzy, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "రాడికల్ అనేది CalDAV మరియు CardDAV సర్వర్.ఇది సిన్క్రోనైజేషన్ మరియు షెడ్యూలింగ్ మరియు సంప్రదింపు డేటా " "యొక్క భాగస్వామ్యాన్ని అనుమతిస్తుంది.రాడికల్ ను వాడటానికి supported client application అవసరం.\n" "రాడికల్ ఏ యూజర్ అయినా {box_name}లాగిన్ తో యాక్సెస్ చేయవచ్చు" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "రాడికేల్" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "క్యాలెండర్ మరియు అడ్రస్సు పుస్తకము" @@ -4822,6 +4851,29 @@ msgstr "సాంబా" msgid "Network File Storage" msgstr "అల్లిక సేవిక సమయం" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +msgid "Android Samba Client" +msgstr "ఐ ర్ సి క్లయింట్ (Quassel)" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "కేలండర్" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5820,6 +5872,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "రూట్ విభజనను విస్తరించు" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6156,6 +6214,10 @@ msgstr "సాక్స్‌లు" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "టిసిపి పోర్ట్ 9050 పై ఒక టార్ సొక్స్ పోర్ట్ మీ %(box_name)sలో అందుబాటులో ఉంది." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "మారకుండా అమర్చుతోంది" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7171,7 +7233,9 @@ msgstr "మెయిలింగ్ జాబితా" #: plinth/templates/internal-zone.html:11 #, fuzzy, python-format #| msgid "Service discovery server is not running" -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "సేవ ఆవిష్కరణ సేవికను నడుపటంలేదు" #: plinth/templates/internal-zone.html:17 @@ -7252,6 +7316,9 @@ msgstr "%(percentage)s %% పూర్తి" msgid "Gujarati" msgstr "గుజరాతీ" +#~ msgid "Enable OpenVPN server" +#~ msgstr "సేవిక తెరవండిVPN అమలుచెయ్యి" + #, fuzzy #~| msgid "Inactive" #~ msgid "active" @@ -7857,9 +7924,6 @@ msgstr "గుజరాతీ" #~ msgid "Archive name" #~ msgstr "ఆర్కైవ్ పేరు" -#~ msgid "Name for new backup archive." -#~ msgstr "కొత్త బ్యాకప్ ఆర్కైవుకి పేరు." - #~ msgid "Invalid archive name" #~ msgstr "చెల్లని ఆర్కైవ్ పేరు" diff --git a/plinth/locale/tr/LC_MESSAGES/django.po b/plinth/locale/tr/LC_MESSAGES/django.po index 129eb6a0d..795bf24ed 100644 --- a/plinth/locale/tr/LC_MESSAGES/django.po +++ b/plinth/locale/tr/LC_MESSAGES/django.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2019-08-08 00:22+0000\n" "Last-Translator: Mesut Akcan \n" "Language-Team: Turkish user@host:~/path/to/repo/" msgstr "" "Yeni veya varolan bir havuz yolu. Örnek: user@host:~/path/to/repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH sunucu parolası" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -259,11 +271,11 @@ msgstr "" "SSH sunucusunun parolası.
SSH anahtar tabanlı kimlik doğrulaması henüz " "mümkün değildir." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "Uzaktan yedekleme deposu zaten var." -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -371,13 +383,6 @@ msgstr "Depo oluştur" msgid "Delete this archive permanently?" msgstr "Bu arşiv kalıcı olarak silinsin mi?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "İsim" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Zaman" @@ -427,7 +432,7 @@ msgstr "indiriliyor" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Geri yükle" @@ -546,91 +551,91 @@ msgstr "" msgid "Archive created." msgstr "Arşiv oluşturuldu." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Arşivi Sil" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Arşiv silindi." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "Yedeklemeden geri yüklenen dosyalar." -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "Yedekleme dosyası bulunamadı." -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "Yüklenen dosyadan geri yükle" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create remote backup repository" msgid "Create backup repository" msgstr "Uzak yedekleme deposu oluştur" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "Uzak yedekleme deposu oluştur" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "Yeni uzak SSH deposu eklendi." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "Sunucuyla bağlantı kurulurken hata oluştu: {}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "Depo kaldırıldı." -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Depoyu kaldır" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 #, fuzzy #| msgid "Repository removed. The remote backup itself was not deleted." msgid "Repository removed. Backups were not deleted." msgstr "Depo kaldırıldı. Uzaktan yedeklemenin kendisi silinmedi." -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "Çıkarma işlemi başarısız oldu!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "Montaj başarısız oldu" @@ -718,8 +723,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Kurulum güncellendi" @@ -738,6 +743,14 @@ msgstr "" "Konsol işlemleri için ağ tabanlı bir terminal de mevcuttur." #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -755,18 +768,18 @@ msgstr "" "kullanılabilir. Hassas bilgiler ve sistem değiştirme kabiliyeti, yönetici " "(yani admin) grubuna ait kullanıcılar ile sınırlıdır." -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "Sunucu Yönetimi" @@ -1475,8 +1488,8 @@ msgstr "Hakkında" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1630,19 +1643,19 @@ msgstr "" msgid "Firewall" msgstr "Güvenlik Duvarı" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "Service %(service_name)s is not running." msgid "Port {name} ({details}) available for internal networks" msgstr "%(service_name)s servisi çalışmamaktadır." -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "Service %(service_name)s is not running." msgid "Port {name} ({details}) available for external networks" msgstr "%(service_name)s servisi çalışmamaktadır." -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1706,6 +1719,18 @@ msgstr "" "güvenlik duvarında da izinli hale gelir ve devre dışı bıraktığınızda " "güvenlik duvarında da devre dışı bırakılır." +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -3023,6 +3048,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 #, fuzzy #| msgid "Mumble Voice Chat Server" @@ -3065,40 +3094,40 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 #, fuzzy #| msgid "Download files using BitTorrent applications" msgid "Download files using eDonkey applications" msgstr "BitTorrent uygulamaları kullanarak dosya indir" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 #, fuzzy #| msgid "Monkeysphere" msgid "MLDonkey" msgstr "Monkeysphere" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 #, fuzzy #| msgid "File Synchronization" msgid "Peer-to-peer File Sharing" @@ -4126,6 +4155,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "Plinth is up to date." @@ -4262,30 +4297,26 @@ msgstr "" "servisleri kullanabilirsiniz. Aynı zamanda ek güvenlik ve anonimlik için " "İnternet'in geri kalanına {box_name} vasıtasıyla erişebilirsiniz." -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "OpenVPN" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "Sanal Özel Şebeke" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "Profil İndir" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "OpenVPN sunucusunu etkinleştir" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4296,15 +4327,15 @@ msgstr "" "süre alır. %(box_name)s kutunuzun hızına bağlı olarak saatler sürmesi bile " "mümkündür. Eğer kurulum kesilirse, tekrar başlatabilirsiniz." -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "Kuruluma başla" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "OpenVPN kurulumu çalışmaktadır" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4352,20 +4383,15 @@ msgstr "" msgid "Download my profile" msgstr "Profilimi indir" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "Kurulum tamamlandı." -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "Kurulum başarısız oldu." -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "Ayar değiştirilmedi" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4377,19 +4403,19 @@ msgstr "" "erişmek için bir sistemdir. Buna sadece {box_name} servislerine İnternet'ten " "erişmek mümkün değilse ihtiyaç duyarsınız. Bu, şu durumları kapsar:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} kısıtlı bir güvenlik duvarının arkasında olduğunda." -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" "{box_name} kontrolünüzde olmayan bir (kablosuz) yönlendiriciye bağlı " "olduğunda." -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." @@ -4397,7 +4423,7 @@ msgstr "" "İnternet Erişim Sağlayıcınız size harici bir IP adresi sunmadığında ve bunun " "yerine İnternet bağlantısını NAT vasıtasıyla sağladığında." -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 #, fuzzy #| msgid "" #| "Your ISP does not provide you a static IP address and your IP address " @@ -4409,11 +4435,11 @@ msgstr "" "İnternet Erişim Sağlayıcınız size statik bir IP adresi sağlamadığında ve IP " "adresiniz İnternet'e her bağlandığınızda değiştiğinde." -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "İnternet Erişim Sağlayıcınız içeri gelen bağlantıları kısıtladığında." -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4433,15 +4459,15 @@ msgstr "" "pagekite.net\">pagekite.net. Gelecekte bunun için arkadaşlarınızın " "{box_name} kutusunu kullanmanız mümkün olacaktır." -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "PageKite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "Herkese Açık Görünülürlük" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -4758,12 +4784,18 @@ msgid "Quasseldroid" msgstr "Quasseldroid" #: plinth/modules/radicale/__init__.py:33 -#, python-brace-format +#, fuzzy, python-brace-format +#| msgid "" +#| "Radicale is a CalDAV and CardDAV server. It allows synchronization and " +#| "sharing of scheduling and contact data. To use Radicale, a supported client application is " +#| "needed. Radicale can be accessed by any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale, bir CalDAV ve CardDAV sunucusudur. İletişim ve randevu verilerinin " "paylaşılmasına ve eşleştirilmesine imkân verir. Radicale'i kullanmak için " @@ -4771,19 +4803,19 @@ msgstr "" "gereklidir. Radicale'e erişim {box_name} girişi olan herhangi bir kullanıcı " "tarafından yapılabilir." -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "Radicale" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "Takvim ve Adres Defteri" @@ -4980,6 +5012,30 @@ msgstr "" msgid "Network File Storage" msgstr "Ağ Zaman Sunucusu" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "IRC Client" +msgid "Android Samba Client" +msgstr "IRC İstemcisi" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +#, fuzzy +#| msgid "GNOME Calendar" +msgid "GNOME Files" +msgstr "GNOME Takvim" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5999,6 +6055,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "Kök Bölümünü Genişlet" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6367,6 +6429,10 @@ msgstr "" "Bir Tor SOCKS bağlantı noktası %(box_name)s kutunuzda TCP 9050 numaralı " "portta mevcuttur." +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "Ayar değiştirilmedi" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7442,7 +7508,9 @@ msgstr "E-posta listesi" #: plinth/templates/internal-zone.html:11 #, fuzzy, python-format #| msgid "Service %(service_name)s is not running." -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "%(service_name)s servisi çalışmamaktadır." #: plinth/templates/internal-zone.html:17 @@ -7522,6 +7590,9 @@ msgstr "%(percentage)s%% tamamlandı" msgid "Gujarati" msgstr "" +#~ msgid "Enable OpenVPN server" +#~ msgstr "OpenVPN sunucusunu etkinleştir" + #~ msgid "active" #~ msgstr "etkin" diff --git a/plinth/locale/uk/LC_MESSAGES/django.po b/plinth/locale/uk/LC_MESSAGES/django.po index f9cb438e4..f9b54a06e 100644 --- a/plinth/locale/uk/LC_MESSAGES/django.po +++ b/plinth/locale/uk/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2019-01-04 17:06+0000\n" "Last-Translator: prolinux ukraine \n" "Language-Team: Ukrainian user@host:~/path/to/repo/" msgstr "" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "пароль SSH серверу" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." @@ -262,11 +274,11 @@ msgstr "" "Пароль для SSH серверу.
Аутентифікація на основі SSH ключа поки не " "підтримується." -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "" @@ -380,13 +392,6 @@ msgstr "Видалити сховище" msgid "Delete this archive permanently?" msgstr "Остаточно видалити цей архів?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "Ім’я" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "Час" @@ -434,7 +439,7 @@ msgstr "" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "Відновити" @@ -529,95 +534,95 @@ msgstr "" msgid "Archive created." msgstr "Архів створено." -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "Видалити архів" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "Архів видалено." -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create" msgid "Create backup repository" msgstr "Створити" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 #, fuzzy #| msgid "Added new repository." msgid "Added new remote SSH repository." msgstr "Додано нове сховище." -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 #, fuzzy #| msgid "Error installing application: {error}" msgid "Error establishing connection to server: {}" msgstr "Помилка при встановлені застосунку: {error}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 #, fuzzy #| msgid "Repository not found" msgid "Repository removed." msgstr "Сховище не знайдено" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "Видалити сховище" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 msgid "Repository removed. Backups were not deleted." msgstr "" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "" @@ -694,8 +699,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "Конфігурацію оновлено" @@ -710,24 +715,32 @@ msgid "" msgstr "" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, python-brace-format msgid "" "It can be accessed by any user on {box_name} " "belonging to the admin group." msgstr "" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "" @@ -1350,8 +1363,8 @@ msgstr "" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1470,17 +1483,17 @@ msgstr "" msgid "Firewall" msgstr "" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, python-brace-format msgid "Port {name} ({details}) available for internal networks" msgstr "" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, python-brace-format msgid "Port {name} ({details}) available for external networks" msgstr "" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1536,6 +1549,18 @@ msgid "" "disabled in the firewall." msgstr "" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2651,6 +2676,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 msgid "Simple Media Server" msgstr "" @@ -2691,36 +2720,36 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 msgid "MLDonkey" msgstr "" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 msgid "Peer-to-peer File Sharing" msgstr "" @@ -3670,6 +3699,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, python-format msgid "Setup %(box_name)s Behind a Router" @@ -3797,30 +3832,26 @@ msgid "" "security and anonymity." msgstr "" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 msgid "OpenVPN" msgstr "" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 msgid "Virtual Private Network" msgstr "" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -3828,15 +3859,15 @@ msgid "" "If the setup is interrupted, you may start it again." msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -3866,20 +3897,15 @@ msgstr "" msgid "Download my profile" msgstr "" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -3888,33 +3914,33 @@ msgid "" "following situations:" msgstr "" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 msgid "" "Your ISP does not provide you a static IP address and your IP address " "changes every time you connect to Internet." msgstr "" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, python-brace-format msgid "" "PageKite works around NAT, firewalls and IP address limitations by using a " @@ -3923,15 +3949,15 @@ msgid "" "the future it might be possible to use your buddy's {box_name} for this." msgstr "" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 msgid "PageKite" msgstr "" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 msgid "Public Visibility" msgstr "" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 msgid "PageKite Domain" msgstr "" @@ -4197,24 +4223,25 @@ msgstr "" #, python-brace-format msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 msgid "Calendar and Addressbook" msgstr "" @@ -4357,6 +4384,26 @@ msgstr "" msgid "Network File Storage" msgstr "" +#: plinth/modules/samba/manifest.py:15 +msgid "Android Samba Client" +msgstr "" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 msgid "Shares" @@ -5225,6 +5272,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -5516,6 +5569,10 @@ msgstr "" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -6461,7 +6518,9 @@ msgstr "" #: plinth/templates/internal-zone.html:11 #, python-format -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "" #: plinth/templates/internal-zone.html:17 diff --git a/plinth/locale/zh_Hans/LC_MESSAGES/django.po b/plinth/locale/zh_Hans/LC_MESSAGES/django.po index e40750b79..454ece527 100644 --- a/plinth/locale/zh_Hans/LC_MESSAGES/django.po +++ b/plinth/locale/zh_Hans/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Plinth\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-18 18:36-0400\n" +"POT-Creation-Date: 2020-06-01 17:44-0400\n" "PO-Revision-Date: 2019-09-13 05:23+0000\n" "Last-Translator: Anxin YI <2732146152@qq.com>\n" "Language-Team: Chinese (Simplified) user@host:~/path/to/repo/" msgstr "新的或已有存储库的路径。例如:user@host:~/path/to/repo/" -#: plinth/modules/backups/forms.py:189 +#: plinth/modules/backups/forms.py:193 msgid "SSH server password" msgstr "SSH 服务器密码" -#: plinth/modules/backups/forms.py:190 +#: plinth/modules/backups/forms.py:194 msgid "" "Password of the SSH Server.
SSH key-based authentication is not yet " "possible." msgstr "SSH 服务器的密码。
基于密钥的 SSH 验证暂不支持。" -#: plinth/modules/backups/forms.py:209 +#: plinth/modules/backups/forms.py:213 msgid "Remote backup repository already exists." msgstr "远程备份存储库已存在。" -#: plinth/modules/backups/forms.py:215 +#: plinth/modules/backups/forms.py:219 msgid "Select verified SSH public key" msgstr "选择经过验证的 SSH 公钥" @@ -362,13 +376,6 @@ msgstr "创建用户" msgid "Delete this archive permanently?" msgstr "永久删除此归档?" -#: plinth/modules/backups/templates/backups_delete.html:18 -#: plinth/modules/ikiwiki/forms.py:15 -#: plinth/modules/networks/templates/connection_show.html:63 -#: plinth/modules/sharing/templates/sharing.html:37 -msgid "Name" -msgstr "名称" - #: plinth/modules/backups/templates/backups_delete.html:19 msgid "Time" msgstr "时间" @@ -418,7 +425,7 @@ msgstr "下载中" #: plinth/modules/backups/templates/backups_repository.html:81 #: plinth/modules/backups/templates/backups_restore.html:28 -#: plinth/modules/backups/views.py:154 +#: plinth/modules/backups/views.py:155 msgid "Restore" msgstr "恢复" @@ -537,91 +544,91 @@ msgstr "核实本地计算机" msgid "Archive created." msgstr "文档已创建。" -#: plinth/modules/backups/views.py:82 +#: plinth/modules/backups/views.py:83 msgid "Delete Archive" msgstr "删除文档" -#: plinth/modules/backups/views.py:94 +#: plinth/modules/backups/views.py:95 msgid "Archive deleted." msgstr "归档已删除。" -#: plinth/modules/backups/views.py:107 +#: plinth/modules/backups/views.py:108 msgid "Upload and restore a backup" msgstr "上传并且储存一个备份" -#: plinth/modules/backups/views.py:142 +#: plinth/modules/backups/views.py:143 msgid "Restored files from backup." msgstr "从备份中恢复文件" -#: plinth/modules/backups/views.py:169 +#: plinth/modules/backups/views.py:170 msgid "No backup file found." msgstr "没有找到备份文件。" -#: plinth/modules/backups/views.py:177 +#: plinth/modules/backups/views.py:178 msgid "Restore from uploaded file" msgstr "从已上传的文件中恢复" -#: plinth/modules/backups/views.py:234 +#: plinth/modules/backups/views.py:235 msgid "No additional disks available to add a repository." msgstr "没有可增加到信息库的额外可用磁盘。" -#: plinth/modules/backups/views.py:242 +#: plinth/modules/backups/views.py:243 #, fuzzy #| msgid "Create remote backup repository" msgid "Create backup repository" msgstr "创建远程备份存储库" -#: plinth/modules/backups/views.py:269 +#: plinth/modules/backups/views.py:270 msgid "Create remote backup repository" msgstr "创建远程备份存储库" -#: plinth/modules/backups/views.py:288 +#: plinth/modules/backups/views.py:289 msgid "Added new remote SSH repository." msgstr "已添加新的远程 SSH 存储库。" -#: plinth/modules/backups/views.py:310 +#: plinth/modules/backups/views.py:311 msgid "Verify SSH hostkey" msgstr "验证 SSH hostkey" -#: plinth/modules/backups/views.py:336 +#: plinth/modules/backups/views.py:337 msgid "SSH host already verified." msgstr "SSH 主机已经验证过了。" -#: plinth/modules/backups/views.py:346 +#: plinth/modules/backups/views.py:347 msgid "SSH host verified." msgstr "SSH 主机已验证。" -#: plinth/modules/backups/views.py:360 +#: plinth/modules/backups/views.py:361 msgid "SSH host public key could not be verified." msgstr "SSH 主机的公钥无法被验证。" -#: plinth/modules/backups/views.py:362 +#: plinth/modules/backups/views.py:363 msgid "Authentication to remote server failed." msgstr "远程服务器认证失败。" -#: plinth/modules/backups/views.py:364 +#: plinth/modules/backups/views.py:365 msgid "Error establishing connection to server: {}" msgstr "启用到服务器的连接时错误:{}" -#: plinth/modules/backups/views.py:375 +#: plinth/modules/backups/views.py:376 msgid "Repository removed." msgstr "储存库被移除。" -#: plinth/modules/backups/views.py:389 +#: plinth/modules/backups/views.py:390 msgid "Remove Repository" msgstr "移除存储" -#: plinth/modules/backups/views.py:398 +#: plinth/modules/backups/views.py:399 #, fuzzy #| msgid "Repository removed. The remote backup itself was not deleted." msgid "Repository removed. Backups were not deleted." msgstr "存储库已移除。已有的远程备份未删除。" -#: plinth/modules/backups/views.py:408 +#: plinth/modules/backups/views.py:409 msgid "Unmounting failed!" msgstr "卸载失败!" -#: plinth/modules/backups/views.py:423 plinth/modules/backups/views.py:427 +#: plinth/modules/backups/views.py:424 plinth/modules/backups/views.py:428 msgid "Mounting failed" msgstr "安装失败" @@ -706,8 +713,8 @@ msgstr "" #: plinth/modules/bind/views.py:72 plinth/modules/coturn/views.py:40 #: plinth/modules/deluge/views.py:42 plinth/modules/dynamicdns/views.py:150 -#: plinth/modules/openvpn/views.py:133 plinth/modules/pagekite/forms.py:90 -#: plinth/modules/quassel/views.py:30 plinth/modules/shadowsocks/views.py:59 +#: plinth/modules/pagekite/forms.py:90 plinth/modules/quassel/views.py:30 +#: plinth/modules/shadowsocks/views.py:59 #: plinth/modules/transmission/views.py:47 msgid "Configuration updated" msgstr "配置已更新" @@ -725,6 +732,14 @@ msgstr "" "的终端来进行控制台操作。" #: plinth/modules/cockpit/__init__.py:38 +msgid "" +"Cockpit can be used to perform advanced storage operations such as disk " +"partitioning and RAID management. It can also be used for opening custom " +"firewall ports and advanced networking such as bonding, bridging and VLAN " +"management." +msgstr "" + +#: plinth/modules/cockpit/__init__.py:43 #, fuzzy, python-brace-format #| msgid "" #| "When enabled, Cockpit will be available from /" @@ -738,18 +753,18 @@ msgstr "" "径访问。它将能被该 {box_name} 上任何属于 admin 组的用" "户访问。" -#: plinth/modules/cockpit/__init__.py:42 +#: plinth/modules/cockpit/__init__.py:47 msgid "" "Cockpit requires that you access it through a domain name. It will not work " "when accessed using an IP address as part of the URL." msgstr "" -#: plinth/modules/cockpit/__init__.py:59 plinth/modules/cockpit/manifest.py:12 +#: plinth/modules/cockpit/__init__.py:64 plinth/modules/cockpit/manifest.py:12 #: plinth/modules/performance/manifest.py:11 msgid "Cockpit" msgstr "Cockpit" -#: plinth/modules/cockpit/__init__.py:61 +#: plinth/modules/cockpit/__init__.py:66 msgid "Server Administration" msgstr "服务器管理" @@ -1434,8 +1449,8 @@ msgstr "关于" #: plinth/modules/firewall/templates/firewall.html:30 #: plinth/modules/letsencrypt/templates/letsencrypt.html:23 #: plinth/modules/networks/templates/connection_show.html:246 -#: plinth/modules/openvpn/templates/openvpn.html:24 -#: plinth/modules/openvpn/templates/openvpn.html:45 +#: plinth/modules/openvpn/templates/openvpn.html:28 +#: plinth/modules/openvpn/templates/openvpn.html:49 #: plinth/modules/tor/templates/tor.html:22 #: plinth/modules/tor/templates/tor.html:36 #: plinth/modules/wireguard/templates/wireguard_show_client.html:46 @@ -1573,19 +1588,19 @@ msgstr "" msgid "Firewall" msgstr "防火墙" -#: plinth/modules/firewall/components.py:124 +#: plinth/modules/firewall/components.py:133 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for internal networks" msgstr "服务发现服务未运行" -#: plinth/modules/firewall/components.py:132 +#: plinth/modules/firewall/components.py:141 #, fuzzy, python-brace-format #| msgid "Service discovery server is not running" msgid "Port {name} ({details}) available for external networks" msgstr "服务发现服务未运行" -#: plinth/modules/firewall/components.py:137 +#: plinth/modules/firewall/components.py:146 #, python-brace-format msgid "Port {name} ({details}) unavailable for external networks" msgstr "" @@ -1646,6 +1661,18 @@ msgstr "" "防火墙的操作是自动的。当您启用服务时它也在防火墙中允许,当禁用一项服务时也会" "禁用防火墙中的相应服务。" +#: plinth/modules/firewall/templates/firewall.html:96 +#: plinth/modules/networks/templates/networks_configuration.html:49 +#: plinth/modules/storage/templates/storage.html:91 +msgid "Advanced" +msgstr "" + +#: plinth/modules/firewall/templates/firewall.html:98 +msgid "" +"Advanced firewall operations such as opening custom ports are provided by " +"the Cockpit app." +msgstr "" + #: plinth/modules/first_boot/forms.py:14 #, python-brace-format msgid "" @@ -2945,6 +2972,10 @@ msgstr "" msgid "Media streaming server" msgstr "" +#: plinth/modules/minidlna/__init__.py:47 +msgid "MiniDLNA" +msgstr "" + #: plinth/modules/minidlna/__init__.py:48 #, fuzzy #| msgid "Mumble Voice Chat Server" @@ -2987,38 +3018,38 @@ msgstr "" msgid "Updated media directory" msgstr "" -#: plinth/modules/mldonkey/__init__.py:26 +#: plinth/modules/mldonkey/__init__.py:27 msgid "" "MLDonkey is a peer-to-peer file sharing application used to exchange large " "files. It can participate in multiple peer-to-peer networks including " "eDonkey, Kademlia, Overnet, BitTorrent and DirectConnect." msgstr "" -#: plinth/modules/mldonkey/__init__.py:29 +#: plinth/modules/mldonkey/__init__.py:30 msgid "" "Users belonging to admin and ed2k group can control it through the web " "interface. Users in the admin group can also control it through any of the " "separate mobile or desktop front-ends or a telnet interface. See manual." msgstr "" -#: plinth/modules/mldonkey/__init__.py:34 +#: plinth/modules/mldonkey/__init__.py:35 #, python-brace-format msgid "" "On {box_name}, downloaded files can be found in /var/lib/mldonkey/ directory." msgstr "" -#: plinth/modules/mldonkey/__init__.py:50 +#: plinth/modules/mldonkey/__init__.py:53 msgid "Download files using eDonkey applications" msgstr "" -#: plinth/modules/mldonkey/__init__.py:53 +#: plinth/modules/mldonkey/__init__.py:56 #: plinth/modules/mldonkey/manifest.py:12 #, fuzzy #| msgid "Monkeysphere" msgid "MLDonkey" msgstr "Monkeysphere" -#: plinth/modules/mldonkey/__init__.py:55 +#: plinth/modules/mldonkey/__init__.py:58 #, fuzzy #| msgid "Enable Shaarli" msgid "Peer-to-peer File Sharing" @@ -4023,6 +4054,12 @@ msgid "" "are no other devices on the network." msgstr "" +#: plinth/modules/networks/templates/networks_configuration.html:51 +msgid "" +"Advanced networking operations such as bonding, bridging and VLAN management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/networks/templates/router_configuration_content.html:10 #, fuzzy, python-format #| msgid "%(box_name)s Setup" @@ -4155,34 +4192,30 @@ msgstr "" "供的私人/内部服务。您还可以通过 {box_name} 访问互联网的其他部分,以增加安全性" "和匿名性。" -#: plinth/modules/openvpn/__init__.py:49 plinth/modules/openvpn/manifest.py:18 +#: plinth/modules/openvpn/__init__.py:56 plinth/modules/openvpn/manifest.py:18 #, fuzzy #| msgid "Open" msgid "OpenVPN" msgstr "打开" -#: plinth/modules/openvpn/__init__.py:50 +#: plinth/modules/openvpn/__init__.py:57 #: plinth/modules/wireguard/__init__.py:53 #, fuzzy #| msgid "Virtual Private Network (OpenVPN)" msgid "Virtual Private Network" msgstr "虚拟专用网络(OpenVPN)" -#: plinth/modules/openvpn/__init__.py:61 +#: plinth/modules/openvpn/__init__.py:68 #, python-brace-format msgid "" "Download Profile" msgstr "" -#: plinth/modules/openvpn/forms.py:12 -msgid "Enable OpenVPN server" -msgstr "启用 OpenVPN 服务器" - #: plinth/modules/openvpn/manifest.py:48 msgid "Tunnelblick" msgstr "" -#: plinth/modules/openvpn/templates/openvpn.html:27 +#: plinth/modules/openvpn/templates/openvpn.html:31 #, python-format msgid "" "OpenVPN has not yet been setup. Performing a secure setup takes a very long " @@ -4192,15 +4225,15 @@ msgstr "" "OpenVPN 尚未安装。 执行安全的安装需要很长的时间。 根据您的 %(box_name)s 运行" "速度,它甚至可能需要小时。 如果安装程序中断,您可以重新启动。" -#: plinth/modules/openvpn/templates/openvpn.html:40 +#: plinth/modules/openvpn/templates/openvpn.html:44 msgid "Start setup" msgstr "启动安装程序" -#: plinth/modules/openvpn/templates/openvpn.html:49 +#: plinth/modules/openvpn/templates/openvpn.html:53 msgid "OpenVPN setup is running" msgstr "OpenVPN 安装程序正在运行" -#: plinth/modules/openvpn/templates/openvpn.html:53 +#: plinth/modules/openvpn/templates/openvpn.html:57 #, python-format msgid "" "To perform a secure setup, this process takes a very long time. Depending " @@ -4243,20 +4276,15 @@ msgstr "配置文件是特定于每个 %(box_name)s 用户的。请保持其私 msgid "Download my profile" msgstr "下载我的配置文件" -#: plinth/modules/openvpn/views.py:113 +#: plinth/modules/openvpn/views.py:87 msgid "Setup completed." msgstr "安装已完成。" -#: plinth/modules/openvpn/views.py:115 +#: plinth/modules/openvpn/views.py:89 msgid "Setup failed." msgstr "安装失败。" -#: plinth/modules/openvpn/views.py:135 plinth/modules/tor/views.py:136 -#: plinth/views.py:196 -msgid "Setting unchanged" -msgstr "设置未改变" - -#: plinth/modules/pagekite/__init__.py:27 +#: plinth/modules/pagekite/__init__.py:28 #, python-brace-format msgid "" "PageKite is a system for exposing {box_name} services when you don't have a " @@ -4267,23 +4295,23 @@ msgstr "" "PageKite 是一种在您没有直接连接到互联网时暴露 {box_name} 服务的系统。 如果您" "的 {box_name} 服务无法从互联网访问,您只需要设置 PageKite。这包括以下情况:" -#: plinth/modules/pagekite/__init__.py:32 +#: plinth/modules/pagekite/__init__.py:33 #, python-brace-format msgid "{box_name} is behind a restricted firewall." msgstr "{box_name} 位于受限的防火墙的后面。" -#: plinth/modules/pagekite/__init__.py:35 +#: plinth/modules/pagekite/__init__.py:36 #, python-brace-format msgid "{box_name} is connected to a (wireless) router which you don't control." msgstr "{box_name} 已连接到非你控制的(无线)路由器。" -#: plinth/modules/pagekite/__init__.py:37 +#: plinth/modules/pagekite/__init__.py:38 msgid "" "Your ISP does not provide you an external IP address and instead provides " "Internet connection through NAT." msgstr "您的 ISP 没有提供外部的 IP 地址而是通过提供 NAT 连接互联网。" -#: plinth/modules/pagekite/__init__.py:39 +#: plinth/modules/pagekite/__init__.py:40 #, fuzzy #| msgid "" #| "Your ISP does not provide you a static IP address and your IP address " @@ -4294,11 +4322,11 @@ msgid "" msgstr "" "您的 ISP 不提供你一个静态的 IP 地址且你连接到互联网的 IP 地址每次会更改。" -#: plinth/modules/pagekite/__init__.py:41 +#: plinth/modules/pagekite/__init__.py:42 msgid "Your ISP limits incoming connections." msgstr "您的 ISP 限制传入的连接。" -#: plinth/modules/pagekite/__init__.py:43 +#: plinth/modules/pagekite/__init__.py:44 #, fuzzy, python-brace-format #| msgid "" #| "PageKite works around NAT, firewalls and IP-address limitations by using " @@ -4316,19 +4344,19 @@ msgstr "" "使用任何 pagekite 服务提供商,例如pagekite." "net。将来,您甚至可以使用好友的 {box_name}。" -#: plinth/modules/pagekite/__init__.py:63 +#: plinth/modules/pagekite/__init__.py:64 #, fuzzy #| msgid "Pagekite" msgid "PageKite" msgstr "Pagekite" -#: plinth/modules/pagekite/__init__.py:65 +#: plinth/modules/pagekite/__init__.py:66 #, fuzzy #| msgid "Public Visibility (PageKite)" msgid "Public Visibility" msgstr "公开可见性(PageKite)" -#: plinth/modules/pagekite/__init__.py:75 +#: plinth/modules/pagekite/__init__.py:76 #, fuzzy #| msgid "PageKite Account" msgid "PageKite Domain" @@ -4636,28 +4664,29 @@ msgstr "" #| "any user with a {box_name} login." msgid "" "Radicale is a CalDAV and CardDAV server. It allows synchronization and " -"sharing of scheduling and contact data. To use Radicale, a supported client application is needed. Radicale " -"can be accessed by any user with a {box_name} login." +"sharing of scheduling and contact data. To use Radicale, a supported client " +"application is needed. Radicale can be accessed by any user with a " +"{box_name} login." msgstr "" "Radicale 是一个 CalDAV 和 CardDAV 服务器。它允许同步和日程安排和联系人数据的" "共享。要使用 Radicale,需要安装支持的客户端应用程序。" "任何拥有 {box_name} 登录名的用户都可以访问 Radicale。" -#: plinth/modules/radicale/__init__.py:38 +#: plinth/modules/radicale/__init__.py:39 msgid "" "Radicale provides a basic web interface, which only supports creating new " "calendars and addressbooks. It does not support adding events or contacts, " "which must be done using a separate client." msgstr "" -#: plinth/modules/radicale/__init__.py:61 +#: plinth/modules/radicale/__init__.py:62 #: plinth/modules/radicale/manifest.py:75 msgid "Radicale" msgstr "" -#: plinth/modules/radicale/__init__.py:62 +#: plinth/modules/radicale/__init__.py:63 #, fuzzy #| msgid "" #| "Calendar and Addressbook \n" @@ -4838,6 +4867,28 @@ msgstr "" msgid "Network File Storage" msgstr "网络时间服务器" +#: plinth/modules/samba/manifest.py:15 +#, fuzzy +#| msgid "Quassel IRC Client" +msgid "Android Samba Client" +msgstr "Quassel IRC 客户端" + +#: plinth/modules/samba/manifest.py:28 +msgid "Ghost Commander - Samba plugin" +msgstr "" + +#: plinth/modules/samba/manifest.py:42 +msgid "VLC media player" +msgstr "" + +#: plinth/modules/samba/manifest.py:56 +msgid "GNOME Files" +msgstr "" + +#: plinth/modules/samba/manifest.py:68 +msgid "Dolphin" +msgstr "" + #: plinth/modules/samba/templates/samba.html:24 #: plinth/modules/samba/templates/samba.html:35 #, fuzzy @@ -5851,6 +5902,12 @@ msgstr "" msgid "Expand Root Partition" msgstr "扩展根分区" +#: plinth/modules/storage/templates/storage.html:93 +msgid "" +"Advanced storage operations such as disk partitioning and RAID management " +"are provided by the Cockpit app." +msgstr "" + #: plinth/modules/storage/templates/storage_expand.html:14 #, python-format msgid "" @@ -6174,6 +6231,10 @@ msgstr "SOCKS" msgid "A Tor SOCKS port is available on your %(box_name)s on TCP port 9050." msgstr "Tor SOCKS 端口是你 %(box_name)s 上的 TCP 端口 9050 。" +#: plinth/modules/tor/views.py:136 plinth/views.py:196 +msgid "Setting unchanged" +msgstr "设置未改变" + #: plinth/modules/transmission/__init__.py:28 msgid "" "BitTorrent is a peer-to-peer file sharing protocol. Transmission daemon " @@ -7265,7 +7326,9 @@ msgstr "邮件列表" #: plinth/templates/internal-zone.html:11 #, fuzzy, python-format #| msgid "Service discovery server is not running" -msgid "%(service_name)s is available only on internal networks." +msgid "" +"%(service_name)s is available only on internal networks or when the " +"client is connected to %(box_name)s through VPN." msgstr "服务发现服务未运行" #: plinth/templates/internal-zone.html:17 @@ -7343,6 +7406,9 @@ msgstr "已完成 %(percentage)s%%" msgid "Gujarati" msgstr "古吉拉特语" +#~ msgid "Enable OpenVPN server" +#~ msgstr "启用 OpenVPN 服务器" + #~ msgid "active" #~ msgstr "激活" From b5ad52ac50b63271d62390380f5c0933e212ed4c Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Mon, 1 Jun 2020 18:32:48 -0400 Subject: [PATCH 40/41] doc: Fetch latest manual Signed-off-by: James Valleroy --- doc/manual/en/Apache_userdir.raw.xml | 2 +- doc/manual/en/Backups.raw.xml | 2 +- doc/manual/en/Bind.raw.xml | 1 + doc/manual/en/Cockpit.raw.xml | 4 +- doc/manual/en/Configure.raw.xml | 2 +- doc/manual/en/Coquelicot.raw.xml | 2 +- doc/manual/en/Coturn.raw.xml | 4 +- doc/manual/en/DateTime.raw.xml | 2 +- doc/manual/en/Deluge.raw.xml | 2 +- doc/manual/en/Diagnostics.raw.xml | 2 +- doc/manual/en/DynamicDNS.raw.xml | 2 +- doc/manual/en/Firewall.raw.xml | 4 +- doc/manual/en/GitWeb.raw.xml | 2 +- doc/manual/en/I2P.raw.xml | 2 +- doc/manual/en/Ikiwiki.raw.xml | 2 +- doc/manual/en/Infinoted.raw.xml | 2 +- doc/manual/en/LetsEncrypt.raw.xml | 2 +- doc/manual/en/MLDonkey.raw.xml | 2 +- doc/manual/en/MatrixSynapse.raw.xml | 4 +- doc/manual/en/MediaWiki.raw.xml | 2 +- doc/manual/en/Minetest.raw.xml | 2 +- doc/manual/en/MiniDLNA.raw.xml | 2 +- doc/manual/en/Monkeysphere.raw.xml | 2 +- doc/manual/en/Mumble.raw.xml | 4 +- doc/manual/en/NameServices.raw.xml | 2 +- doc/manual/en/Networks.raw.xml | 6 +- doc/manual/en/OpenVPN.raw.xml | 4 +- doc/manual/en/PageKite.raw.xml | 2 +- doc/manual/en/Performance.raw.xml | 2 +- doc/manual/en/Power.raw.xml | 2 +- doc/manual/en/Privoxy.raw.xml | 2 +- doc/manual/en/Quassel.raw.xml | 2 +- doc/manual/en/Radicale.raw.xml | 6 +- doc/manual/en/Repro.raw.xml | 2 +- doc/manual/en/Roundcube.raw.xml | 2 +- doc/manual/en/Samba.raw.xml | 2 +- doc/manual/en/Searx.raw.xml | 2 +- doc/manual/en/SecureShell.raw.xml | 4 +- doc/manual/en/Security.raw.xml | 2 +- doc/manual/en/ServiceDiscovery.raw.xml | 2 +- doc/manual/en/Shadowsocks.raw.xml | 2 +- doc/manual/en/Snapshots.raw.xml | 2 +- doc/manual/en/Storage.raw.xml | 2 +- doc/manual/en/Syncthing.raw.xml | 2 +- doc/manual/en/TinyTinyRSS.raw.xml | 2 +- doc/manual/en/Tor.raw.xml | 2 +- doc/manual/en/Transmission.raw.xml | 2 +- doc/manual/en/Upgrades.raw.xml | 4 +- doc/manual/en/Users.raw.xml | 2 +- doc/manual/en/ejabberd.raw.xml | 2 +- doc/manual/en/freedombox-manual.raw.xml | 3173 ++++++++------- doc/manual/en/images/firewalld-cockpit.png | Bin 0 -> 46555 bytes doc/manual/en/images/networks-cockpit.png | Bin 0 -> 46402 bytes doc/manual/en/images/storage-cockpit.png | Bin 0 -> 61222 bytes doc/manual/es/Apache_userdir.raw.xml | 2 +- doc/manual/es/Backups.raw.xml | 2 +- doc/manual/es/Bind.raw.xml | 1 + doc/manual/es/Cockpit.raw.xml | 4 +- doc/manual/es/Configure.raw.xml | 2 +- doc/manual/es/Coquelicot.raw.xml | 2 +- doc/manual/es/Coturn.raw.xml | 4 +- doc/manual/es/DateTime.raw.xml | 2 +- doc/manual/es/Deluge.raw.xml | 2 +- doc/manual/es/Diagnostics.raw.xml | 2 +- doc/manual/es/DynamicDNS.raw.xml | 2 +- doc/manual/es/Firewall.raw.xml | 4 +- doc/manual/es/GitWeb.raw.xml | 2 +- doc/manual/es/I2P.raw.xml | 2 +- doc/manual/es/Ikiwiki.raw.xml | 2 +- doc/manual/es/Infinoted.raw.xml | 2 +- doc/manual/es/LetsEncrypt.raw.xml | 2 +- doc/manual/es/MLDonkey.raw.xml | 2 +- doc/manual/es/MatrixSynapse.raw.xml | 4 +- doc/manual/es/MediaWiki.raw.xml | 2 +- doc/manual/es/Minetest.raw.xml | 2 +- doc/manual/es/MiniDLNA.raw.xml | 2 +- doc/manual/es/Monkeysphere.raw.xml | 2 +- doc/manual/es/Mumble.raw.xml | 4 +- doc/manual/es/NameServices.raw.xml | 2 +- doc/manual/es/Networks.raw.xml | 6 +- doc/manual/es/OpenVPN.raw.xml | 4 +- doc/manual/es/PageKite.raw.xml | 2 +- doc/manual/es/Power.raw.xml | 2 +- doc/manual/es/Privoxy.raw.xml | 2 +- doc/manual/es/Quassel.raw.xml | 2 +- doc/manual/es/Radicale.raw.xml | 6 +- doc/manual/es/Repro.raw.xml | 2 +- doc/manual/es/Roundcube.raw.xml | 2 +- doc/manual/es/Samba.raw.xml | 2 +- doc/manual/es/Searx.raw.xml | 2 +- doc/manual/es/SecureShell.raw.xml | 4 +- doc/manual/es/Security.raw.xml | 2 +- doc/manual/es/ServiceDiscovery.raw.xml | 2 +- doc/manual/es/Shadowsocks.raw.xml | 2 +- doc/manual/es/Snapshots.raw.xml | 2 +- doc/manual/es/Storage.raw.xml | 2 +- doc/manual/es/Syncthing.raw.xml | 2 +- doc/manual/es/TinyTinyRSS.raw.xml | 2 +- doc/manual/es/Tor.raw.xml | 2 +- doc/manual/es/Transmission.raw.xml | 2 +- doc/manual/es/Upgrades.raw.xml | 4 +- doc/manual/es/Users.raw.xml | 2 +- doc/manual/es/ejabberd.raw.xml | 2 +- doc/manual/es/freedombox-manual.raw.xml | 4081 ++++++++++---------- doc/manual/es/images/firewalld-cockpit.png | Bin 0 -> 46555 bytes doc/manual/es/images/networks-cockpit.png | Bin 0 -> 46402 bytes doc/manual/es/images/storage-cockpit.png | Bin 0 -> 61222 bytes 107 files changed, 3978 insertions(+), 3520 deletions(-) create mode 100644 doc/manual/en/Bind.raw.xml create mode 100644 doc/manual/en/images/firewalld-cockpit.png create mode 100644 doc/manual/en/images/networks-cockpit.png create mode 100644 doc/manual/en/images/storage-cockpit.png create mode 100644 doc/manual/es/Bind.raw.xml create mode 100644 doc/manual/es/images/firewalld-cockpit.png create mode 100644 doc/manual/es/images/networks-cockpit.png create mode 100644 doc/manual/es/images/storage-cockpit.png diff --git a/doc/manual/en/Apache_userdir.raw.xml b/doc/manual/en/Apache_userdir.raw.xml index 0ac0f6dc3..74b06b669 100644 --- a/doc/manual/en/Apache_userdir.raw.xml +++ b/doc/manual/en/Apache_userdir.raw.xml @@ -1 +1 @@ -

FreedomBox/Manual/Apache_userdir62020-02-26 22:51:55JamesValleroyrephrase52020-02-26 22:50:33JamesValleroyPlinth -> FreedomBox42020-02-26 22:49:27JamesValleroysimply wording32019-02-27 00:08:57JamesValleroyremove wiki links22019-02-17 21:44:22MikkelKirkgaardNielsenrefer to ourselves as User websites, add basics table from new template12019-02-13 23:15:52MikkelKirkgaardNielsenadd draft page
User websites (userdir)
What is User websites?User websites is a module of the Apache webserver enabled to allow users defined in the FreedomBox system to expose a set of static files on the FreedomBox filesystem as a website to the local network and/or the internet according to the network and firewall setup. Application basicsCategory File sharing Available since version 0.9.4Upstream project website Upstream end user documentation
ScreenshotAdd when/if an interface is made for FreedomBox
Using User websitesThe module is always enabled and offers no configuration from the FreedomBox web interface. There is no configuration or status page shown for this module in the FreedomBox web interface. To serve documents, place the files in the designated directory in a FreedomBox user's home directory in the filesystem. 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. 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.
Using SFTP to create public_html and upload documentsTo be written Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Apache_userdir82020-05-30 17:51:15SunilMohanAdapaUpdate the title to emphasize app name over its generic name72020-05-23 19:43:05JamesValleroyadd TableOfContents62020-02-26 22:51:55JamesValleroyrephrase52020-02-26 22:50:33JamesValleroyPlinth -> FreedomBox42020-02-26 22:49:27JamesValleroysimply wording32019-02-27 00:08:57JamesValleroyremove wiki links22019-02-17 21:44:22MikkelKirkgaardNielsenrefer to ourselves as User websites, add basics table from new template12019-02-13 23:15:52MikkelKirkgaardNielsenadd draft page
User Websites
What is User websites?User websites is a module of the Apache webserver enabled to allow users defined in the FreedomBox system to expose a set of static files on the FreedomBox filesystem as a website to the local network and/or the internet according to the network and firewall setup. Application basicsCategory File sharing Available since version 0.9.4Upstream project website Upstream end user documentation
ScreenshotAdd when/if an interface is made for FreedomBox
Using User websitesThe module is always enabled and offers no configuration from the FreedomBox web interface. There is no configuration or status page shown for this module in the FreedomBox web interface. To serve documents, place the files in the designated directory in a FreedomBox user's home directory in the filesystem. 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. 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.
Using SFTP to create public_html and upload documentsTo be written Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Backups.raw.xml b/doc/manual/en/Backups.raw.xml index b308df17a..828d397c9 100644 --- a/doc/manual/en/Backups.raw.xml +++ b/doc/manual/en/Backups.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Backups312019-11-11 17:07:05JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service302019-02-26 23:33:42SunilMohanAdapaUpdate information about tt-rss292019-02-23 00:11:05JamesValleroyadd mldonkey282019-02-04 01:16:41SunilMohanAdapaAdd FreedomBox footer272019-01-31 01:30:48SunilMohanAdapaMinor formatting262019-01-31 01:29:18SunilMohanAdapaMake manual friendly, consolidate feature data, update description252019-01-30 17:45:57SunilMohanAdapaMinor release update242019-01-23 00:43:21SunilMohanAdapaUpdate information about syncthing232019-01-18 22:26:06SunilMohanAdapaUpdate OpenVPN information222018-10-30 05:04:32SunilMohanAdapaUpdate information about Tahoe-LAFS212018-10-29 23:50:51SunilMohanAdapaUpdate information about users and letsencrypt202018-10-26 05:36:32SunilMohanAdapaUpdate information about Monkeysphere192018-10-23 23:30:58SunilMohanAdapaUpdate information about upgrades182018-10-23 22:21:23SunilMohanAdapaAdd information about Tor172018-10-22 17:17:31SunilMohanAdapaUpdate information about newly merged changes162018-10-19 17:12:53SunilMohanAdapaAdd information about SSH152018-10-19 15:38:54SunilMohanAdapaUpdate information on recent progress142018-10-15 23:09:09SunilMohanAdapaUpdate status of datetime and deluge132018-10-09 03:22:17SunilMohanAdapaUpdate information about release of version 0.40122018-10-04 11:34:24JamesValleroyremove links to "FreedomBox" page112018-10-04 04:47:13SunilMohanAdapaMinor formatting102018-10-04 04:46:50SunilMohanAdapaUpdate list of supported applications92018-10-02 15:43:29DannyHaidar82018-10-02 15:41:49DannyHaidar72018-10-02 15:38:00DannyHaidar62018-10-01 17:38:55DannyHaidar52018-10-01 16:50:33DannyHaidar42018-10-01 16:49:00DannyHaidar32018-10-01 16:39:47DannyHaidar22018-10-01 16:37:48DannyHaidar12018-10-01 16:36:42DannyHaidar
BackupsFreedomBox includes the ability to backup and restore data, preferences, configuration and secrets from most of the applications. The Backups feature is built using Borg backup software. Borg is a deduplicating and compressing backup program. It is designed for efficient and secure backups. This backups feature can be used to selectively backup and restore data on an app-by-app basis. Backed up data can be stored on the FreedomBox machine itself or on a remote server. Any remote server providing SSH access can be used as a backup storage repository for FreedomBox backups. Data stored remotely may be encrypted and in such cases remote server cannot access your decrypted data.
Status of Backups Feature App/Feature Support in Version Notes Avahi - no backup needed Backups - no backup needed Bind 0.41 Cockpit - no backup needed Coquelicot 0.40 includes uploaded files Datetime 0.41 Deluge 0.41 does not include downloaded/seeding files Diagnostics - no backup needed Dynamic DNS 0.39 ejabberd 0.39 includes all data and configuration Firewall - no backup needed ikiwiki 0.39 includes all wikis/blogs and their content infinoted 0.39 includes all data and keys JSXC - no backup needed Let's Encrypt 0.42 Matrix Synapse 0.39 includes media and uploads MediaWiki 0.39 includes wiki pages and uploaded files Minetest 0.39 MLDonkey 19.0 Monkeysphere 0.42 Mumble 0.40 Names - no backup needed Networks No No plans currently to implement backup OpenVPN 0.48 includes all user and server keys Pagekite 0.40 Power - no backup needed Privoxy - no backup needed Quassel 0.40 includes users and logs Radicale 0.39 includes calendar and cards data for all users repro 0.39 includes all users, data and keys Roundcube - no backup needed SearX - no backup needed Secure Shell (SSH) Server 0.41 includes host keys Security 0.41 Shadowsocks 0.40 only secrets Sharing 0.40 does not include the data in the shared folders Snapshot 0.41 only configuration, does not include snapshot data Storage - no backup needed Syncthing 0.48 does not include data in the shared folders Tahoe-LAFS 0.42 includes all data and configuration Tiny Tiny RSS 19.2 includes database containing feeds, stories, etc. Tor 0.42 includes configuration and secrets such as onion service keys Transmission 0.40 does not include downloaded/seeding files Upgrades 0.42 Users No No plans currently to implement backup
How to install and use BackupsStep 1 Backups: Step 1 Step 2 Backups: Step 2 Step 3 Backups: Step 3 Step 4 Backups: Step 4 Step 5 Backups: Step 5 Step 6 Backups: Step 6 Step 7 Backups: Step 7 Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Backups322020-05-23 20:39:02JamesValleroyadd TableOfContents312019-11-11 17:07:05JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service302019-02-26 23:33:42SunilMohanAdapaUpdate information about tt-rss292019-02-23 00:11:05JamesValleroyadd mldonkey282019-02-04 01:16:41SunilMohanAdapaAdd FreedomBox footer272019-01-31 01:30:48SunilMohanAdapaMinor formatting262019-01-31 01:29:18SunilMohanAdapaMake manual friendly, consolidate feature data, update description252019-01-30 17:45:57SunilMohanAdapaMinor release update242019-01-23 00:43:21SunilMohanAdapaUpdate information about syncthing232019-01-18 22:26:06SunilMohanAdapaUpdate OpenVPN information222018-10-30 05:04:32SunilMohanAdapaUpdate information about Tahoe-LAFS212018-10-29 23:50:51SunilMohanAdapaUpdate information about users and letsencrypt202018-10-26 05:36:32SunilMohanAdapaUpdate information about Monkeysphere192018-10-23 23:30:58SunilMohanAdapaUpdate information about upgrades182018-10-23 22:21:23SunilMohanAdapaAdd information about Tor172018-10-22 17:17:31SunilMohanAdapaUpdate information about newly merged changes162018-10-19 17:12:53SunilMohanAdapaAdd information about SSH152018-10-19 15:38:54SunilMohanAdapaUpdate information on recent progress142018-10-15 23:09:09SunilMohanAdapaUpdate status of datetime and deluge132018-10-09 03:22:17SunilMohanAdapaUpdate information about release of version 0.40122018-10-04 11:34:24JamesValleroyremove links to "FreedomBox" page112018-10-04 04:47:13SunilMohanAdapaMinor formatting102018-10-04 04:46:50SunilMohanAdapaUpdate list of supported applications92018-10-02 15:43:29DannyHaidar82018-10-02 15:41:49DannyHaidar72018-10-02 15:38:00DannyHaidar62018-10-01 17:38:55DannyHaidar52018-10-01 16:50:33DannyHaidar42018-10-01 16:49:00DannyHaidar32018-10-01 16:39:47DannyHaidar22018-10-01 16:37:48DannyHaidar12018-10-01 16:36:42DannyHaidar
BackupsFreedomBox includes the ability to backup and restore data, preferences, configuration and secrets from most of the applications. The Backups feature is built using Borg backup software. Borg is a deduplicating and compressing backup program. It is designed for efficient and secure backups. This backups feature can be used to selectively backup and restore data on an app-by-app basis. Backed up data can be stored on the FreedomBox machine itself or on a remote server. Any remote server providing SSH access can be used as a backup storage repository for FreedomBox backups. Data stored remotely may be encrypted and in such cases remote server cannot access your decrypted data.
Status of Backups Feature App/Feature Support in Version Notes Avahi - no backup needed Backups - no backup needed Bind 0.41 Cockpit - no backup needed Coquelicot 0.40 includes uploaded files Datetime 0.41 Deluge 0.41 does not include downloaded/seeding files Diagnostics - no backup needed Dynamic DNS 0.39 ejabberd 0.39 includes all data and configuration Firewall - no backup needed ikiwiki 0.39 includes all wikis/blogs and their content infinoted 0.39 includes all data and keys JSXC - no backup needed Let's Encrypt 0.42 Matrix Synapse 0.39 includes media and uploads MediaWiki 0.39 includes wiki pages and uploaded files Minetest 0.39 MLDonkey 19.0 Monkeysphere 0.42 Mumble 0.40 Names - no backup needed Networks No No plans currently to implement backup OpenVPN 0.48 includes all user and server keys Pagekite 0.40 Power - no backup needed Privoxy - no backup needed Quassel 0.40 includes users and logs Radicale 0.39 includes calendar and cards data for all users repro 0.39 includes all users, data and keys Roundcube - no backup needed SearX - no backup needed Secure Shell (SSH) Server 0.41 includes host keys Security 0.41 Shadowsocks 0.40 only secrets Sharing 0.40 does not include the data in the shared folders Snapshot 0.41 only configuration, does not include snapshot data Storage - no backup needed Syncthing 0.48 does not include data in the shared folders Tahoe-LAFS 0.42 includes all data and configuration Tiny Tiny RSS 19.2 includes database containing feeds, stories, etc. Tor 0.42 includes configuration and secrets such as onion service keys Transmission 0.40 does not include downloaded/seeding files Upgrades 0.42 Users No No plans currently to implement backup
How to install and use BackupsStep 1 Backups: Step 1 Step 2 Backups: Step 2 Step 3 Backups: Step 3 Step 4 Backups: Step 4 Step 5 Backups: Step 5 Step 6 Backups: Step 6 Step 7 Backups: Step 7 Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Bind.raw.xml b/doc/manual/en/Bind.raw.xml new file mode 100644 index 000000000..31dc5064f --- /dev/null +++ b/doc/manual/en/Bind.raw.xml @@ -0,0 +1 @@ +
FreedomBox/Manual/Bind72020-05-30 18:19:00SunilMohanAdapaUpdate the title to emphasize app name over its generic name62020-05-26 14:03:37fioddorCorrección.52020-05-26 14:03:05fioddorLinks to translations42020-05-26 13:36:27fioddorTOC and BEGIN_INCLUDE32020-05-26 04:53:53SunilMohanAdapaMinor formatting22020-05-26 04:53:30SunilMohanAdapaAdd note about not being available on OpenVPN12017-01-21 17:35:14JamesValleroycreate page for bindTranslation(s): - English - Español
BIND (Domain Name Server)BIND enables you to publish your Domain Name System (DNS) information on the Internet, and to resolve DNS queries for your user devices on your network. Currently, on FreedomBox, BIND is only used to resolve DNS queries for other machines on local network. It is also incompatible with sharing Internet connection from FreedomBox. Note: This service is available only on networks configured as "internal" zone. It is not available when connected via OpenVPN. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Cockpit.raw.xml b/doc/manual/en/Cockpit.raw.xml index e5a9d5570..9d267d883 100644 --- a/doc/manual/en/Cockpit.raw.xml +++ b/doc/manual/en/Cockpit.raw.xml @@ -1,3 +1,3 @@ -
FreedomBox/Manual/Cockpit62019-11-14 18:04:05fioddorwiki link to wiki page52019-11-11 16:57:11JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service42019-08-20 18:22:51SunilMohanAdapaUpdate information about .local domain and fix URLs32019-07-19 00:08:47SunilMohanAdapaAdd informatio about Cockpit needing a proper domain name22019-01-10 21:41:56SunilMohanAdapaWrite manual page for Cockpit12018-03-02 12:57:48JosephNuthalapatiCreate stub for Cockpit
Cockpit (Server Administration)Cockpit is a server manager that makes it easy to administer GNU/Linux servers via a web browser. On a FreedomBox, controls are available for many advanced functions that are not usually required. A web based terminal for console operations is also available. It can be accessed by any user on your FreedomBox belonging to the admin group. Cockpit is only usable when you have proper domain name setup for your FreedomBox and you use that domain name to access Cockpit. See the Troubleshooting section for more information. Use cockpit only if you are an administrator of GNU/Linux systems with advanced skills. FreedomBox tries to coexist with changes to system by system administrators and system administration tools like Cockpit. However, improper changes to the system might causes failures in FreedomBox functions.
Using CockpitInstall Cockpit like any other application on FreedomBox. Make sure that Cockpit is enabled after that. cockpit-enable.png Ensure that the user account on FreedomBox that will used for Cockpit is part of the administrators group. cockpit-admin-user.png Launch the Cockpit web interface. Login using the configured user account. cockpit-login.png Start using cockpit. cockpit-system.png Cockpit is usable on mobile interfaces too. cockpit-mobile.png
FeaturesThe following features of Cockpit may be useful for advanced FreedomBox users.
System DashboardCockpit has a system dashboard that Shows detailed hardware information Shows basic performance metrics of a system Allows changing system time and timezone Allows changing hostname. Please use FreedomBox UI to do this Shows SSH server fingerprints cockpit-system.png
Viewing System LogsCockpit allows querying system logs and examining them in full detail. cockpit-logs.png
Managing StorageCockpit allows following advanced storage functions: View full disk information Editing disk partitions RAID management cockpit-storage1.png cockpit-storage2.png
NetworkingCockpit and FreedomBox both rely on NetworkManager to configure the network. However, Cockpit offers some advanced configuration not available on FreedomBox: Route configuration Configure Bonds, Bridges, VLANs cockpit-network1.png cockpit-network2.png cockpit-network3.png
ServicesCockpit allows management of services and periodic jobs (similar to cron). cockpit-services1.png cockpit-services2.png
Web TerminalCockpit offers a web based terminal that can be used perform manual system administration tasks. cockpit-terminal.png
TroubleshootingCockpit requires a domain name to be properly setup on your FreedomBox and will only work when you access it using a URL with that domain name. Cockpit will not work when using IP address in the URL. Using freedombox.local as the domain name also does not work. For example, the following URLs will not work:
FreedomBox/Manual/Cockpit72020-05-23 20:39:42JamesValleroyadd TableOfContents62019-11-14 18:04:05fioddorwiki link to wiki page52019-11-11 16:57:11JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service42019-08-20 18:22:51SunilMohanAdapaUpdate information about .local domain and fix URLs32019-07-19 00:08:47SunilMohanAdapaAdd informatio about Cockpit needing a proper domain name22019-01-10 21:41:56SunilMohanAdapaWrite manual page for Cockpit12018-03-02 12:57:48JosephNuthalapatiCreate stub for Cockpit
Cockpit (Server Administration)Cockpit is a server manager that makes it easy to administer GNU/Linux servers via a web browser. On a FreedomBox, controls are available for many advanced functions that are not usually required. A web based terminal for console operations is also available. It can be accessed by any user on your FreedomBox belonging to the admin group. Cockpit is only usable when you have proper domain name setup for your FreedomBox and you use that domain name to access Cockpit. See the Troubleshooting section for more information. Use cockpit only if you are an administrator of GNU/Linux systems with advanced skills. FreedomBox tries to coexist with changes to system by system administrators and system administration tools like Cockpit. However, improper changes to the system might causes failures in FreedomBox functions.
Using CockpitInstall Cockpit like any other application on FreedomBox. Make sure that Cockpit is enabled after that. cockpit-enable.png Ensure that the user account on FreedomBox that will used for Cockpit is part of the administrators group. cockpit-admin-user.png Launch the Cockpit web interface. Login using the configured user account. cockpit-login.png Start using cockpit. cockpit-system.png Cockpit is usable on mobile interfaces too. cockpit-mobile.png
FeaturesThe following features of Cockpit may be useful for advanced FreedomBox users.
System DashboardCockpit has a system dashboard that Shows detailed hardware information Shows basic performance metrics of a system Allows changing system time and timezone Allows changing hostname. Please use FreedomBox UI to do this Shows SSH server fingerprints cockpit-system.png
Viewing System LogsCockpit allows querying system logs and examining them in full detail. cockpit-logs.png
Managing StorageCockpit allows following advanced storage functions: View full disk information Editing disk partitions RAID management cockpit-storage1.png cockpit-storage2.png
NetworkingCockpit and FreedomBox both rely on NetworkManager to configure the network. However, Cockpit offers some advanced configuration not available on FreedomBox: Route configuration Configure Bonds, Bridges, VLANs cockpit-network1.png cockpit-network2.png cockpit-network3.png
ServicesCockpit allows management of services and periodic jobs (similar to cron). cockpit-services1.png cockpit-services2.png
Web TerminalCockpit offers a web based terminal that can be used perform manual system administration tasks. cockpit-terminal.png
TroubleshootingCockpit requires a domain name to be properly setup on your FreedomBox and will only work when you access it using a URL with that domain name. Cockpit will not work when using IP address in the URL. Using freedombox.local as the domain name also does not work. For example, the following URLs will not work: Starting with FreedomBox version 19.15, using .local domain works. You can access Cockpit using the URL . The .local domain is based on your hostname. If your hostname is mybox, your .local domain name will be mybox.local and the Cockpit URL will be . To properly access Cockpit, use the domain name configured for your FreedomBox.Cockpit will also work well when using a Tor Onion Service. The following URLs will work: The reason for this behaviour is that Cockpit uses WebSockets to connect to the backend server. Cross site requests for WebSockets must be prevented for security reasons. To implement this, Cockpit maintains a list of all domains from which requests are allowed. FreedomBox automatically configures this list whenever you add or remove a domain. However, since we can't rely on IP addresses, they are not added by FreedomBox to this domain list. You can see the current list of allowed domains, as managed by FreedomBox, in /etc/cockpit/cockpit.conf. You may edit this, but do so only if you understand web security consequences of this. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +https://exampletorhs.onion/_cockpit/]]>
The reason for this behaviour is that Cockpit uses WebSockets to connect to the backend server. Cross site requests for WebSockets must be prevented for security reasons. To implement this, Cockpit maintains a list of all domains from which requests are allowed. FreedomBox automatically configures this list whenever you add or remove a domain. However, since we can't rely on IP addresses, they are not added by FreedomBox to this domain list. You can see the current list of allowed domains, as managed by FreedomBox, in /etc/cockpit/cockpit.conf. You may edit this, but do so only if you understand web security consequences of this. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Configure.raw.xml b/doc/manual/en/Configure.raw.xml index 0dc6b2282..984e61e04 100644 --- a/doc/manual/en/Configure.raw.xml +++ b/doc/manual/en/Configure.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Configure92019-02-28 10:25:01JosephNuthalapatiRename default app to webserver home page82018-10-09 09:54:01JosephNuthalapatiImprove formatting72018-07-25 08:38:53JosephNuthalapatiRemove /home as an alias to /freedombox62018-07-24 17:51:28SunilMohanAdapaRename FreedomBox Plinth to FreedomBox Service (Plinth)52018-07-24 16:12:49JosephNuthalapatiAdd tip about bookmarking FreedomBox Plinth42018-07-24 13:52:47JosephNuthalapatiAdd wiki entry about Default App32016-12-31 04:11:43JamesValleroymention how domain name is used22016-12-31 04:07:26JamesValleroyfix outline12016-08-21 16:35:55DrahtseilCreated Configure
ConfigureConfigure has some general configuration options:
HostnameHostname is the local name by which other devices on the local network can reach your FreedomBox. The default hostname is freedombox.
Domain NameDomain name is the global name by which other devices on the Internet can reach your FreedomBox. The value set here is used by the Chat Server (XMPP), Matrix Synapse, Certificates (Let's Encrypt), and Monkeysphere.
Webserver Home PageThis is an advanced option that allows you to set something other than FreedomBox Service (Plinth) as the home page to be served on the domain name of the FreedomBox. For example, if your FreedomBox's domain name is and you set MediaWiki as the home page, visiting will take you to instead of the usual . You can set any web application, Ikiwiki wikis and blogs or Apache's default index.html page as the web server home page. Once some other app is set as the home page, you can only navigate to the FreedomBox Service (Plinth) by typing into the browser. /freedombox can also be used as an alias to /plinth Tip: Bookmark the URL of FreedomBox Service (Plinth) before setting the home page to some other app. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Configure112020-05-23 19:47:01JamesValleroymove TableOfContents above BEGIN_INCLUDE102020-05-23 17:08:24JamesValleroyremove references to (Plinth)92019-02-28 10:25:01JosephNuthalapatiRename default app to webserver home page82018-10-09 09:54:01JosephNuthalapatiImprove formatting72018-07-25 08:38:53JosephNuthalapatiRemove /home as an alias to /freedombox62018-07-24 17:51:28SunilMohanAdapaRename FreedomBox Plinth to FreedomBox Service (Plinth)52018-07-24 16:12:49JosephNuthalapatiAdd tip about bookmarking FreedomBox Plinth42018-07-24 13:52:47JosephNuthalapatiAdd wiki entry about Default App32016-12-31 04:11:43JamesValleroymention how domain name is used22016-12-31 04:07:26JamesValleroyfix outline12016-08-21 16:35:55DrahtseilCreated Configure
ConfigureConfigure has some general configuration options:
HostnameHostname is the local name by which other devices on the local network can reach your FreedomBox. The default hostname is freedombox.
Domain NameDomain name is the global name by which other devices on the Internet can reach your FreedomBox. The value set here is used by the Chat Server (XMPP), Matrix Synapse, Certificates (Let's Encrypt), and Monkeysphere.
Webserver Home PageThis is an advanced option that allows you to set something other than FreedomBox Service as the home page to be served on the domain name of the FreedomBox. For example, if your FreedomBox's domain name is and you set MediaWiki as the home page, visiting will take you to instead of the usual . You can set any web application, Ikiwiki wikis and blogs or Apache's default index.html page as the web server home page. Once some other app is set as the home page, you can only navigate to the FreedomBox Service by typing into the browser. /freedombox can also be used as an alias to /plinth Tip: Bookmark the URL of FreedomBox Service before setting the home page to some other app. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Coquelicot.raw.xml b/doc/manual/en/Coquelicot.raw.xml index a0f08b4f8..5dea7f314 100644 --- a/doc/manual/en/Coquelicot.raw.xml +++ b/doc/manual/en/Coquelicot.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Coquelicot82020-04-12 16:01:36JamesValleroyadd links back to top level pages72019-09-11 09:45:09fioddorCategory Deduplicated62018-12-30 19:59:56DrahtseilBasic priniciple52018-03-05 09:15:01JosephNuthalapaticoquelicot: Fix broken links42018-02-26 17:14:51JamesValleroyincluded in 0.2432018-02-12 23:48:10JamesValleroybump version22018-02-12 23:47:14JamesValleroyreplace fancy quote characters with plain quote characters12018-02-10 03:14:55JosephNuthalapatiCreate new page for Coquelicot
File Sharing (Coquelicot)
About CoquelicotCoquelicot is a "one-click" file sharing web application with a focus on protecting users' privacy. The basic principle is simple: users can upload a file to the server, in return they get a unique URL which can be shared with others in order to download the file. A download password can be defined. After the upload you get a unique link that can be shared to your partners in order to Read more about Coquelicot at the Coquelicot README Available since: version 0.24.0
When to use CoquelicotCoquelicot is best used to quickly share a single file. If you want to share a folder, for a single use, compress the folder and share it over Coquelicot which must be kept synchronized between computers, use Syncthing instead Coquelicot can only provide a reasonable degree of privacy. If anonymity is required, you should consider using the desktop application Onionshare instead. Since Coquelicot fully uploads the file to the server, your FreedomBox will incur both upload and download bandwidth costs. For very large files, consider sharing them using BitTorrent by creating a private torrent file. If anonymity is required, use Onionshare. It is P2P and doesn't require a server.
Coquelicot on FreedomBoxWith Coquelicot installed, you can upload files to your FreedomBox server and privately share them. Post installation, the Coquelicot page offers two settings. Upload Password: Coquelicot on FreedomBox is currently configured to use simple password authentication for ease of use. Remember that it's one global password for this Coquelicot instance and not your user password for FreedomBox. You need not remember this password. You can set a new one from the Plinth interface anytime. Maximum File Size: You can alter the maximum size of the file that can be transferred through Coquelicot using this setting. The size is in Mebibytes. The maximum file size is only limited by the disk size of your FreedomBox.
PrivacySomeone monitoring your network traffic might find out that some file is being transferred through your FreedomBox and also possibly its size, but will not know the file name. Coquelicot encrypts files on the server and also fills the file contents with 0s when deleting them. This eliminates the risk of file contents being revealed in the event of your FreedomBox being confiscated or stolen. The real risk to mitigate here is a third-party also downloading your file along with the intended recipient.
Sharing over instant messengersSome instant messengers which have previews for websites might download your file in order to show a preview in the conversation. If you set the option of one-time download on a file, you might notice that the one download will be used up by the instant messenger. If sharing over such messengers, please use a download password in combination with a one-time download option.
Sharing download links privatelyIt is recommended to share your file download links and download passwords over encrypted channels. You can simply avoid all the above problems with instant messenger previews by using instant messengers that support encrypted conversations like Riot with Matrix Synapse or XMPP (ejabberd server on FreedomBox) with clients that support end-to-end encryption. Send the download link and the download password in two separate messages (helps if your messenger supports perfect forward secrecy like XMPP with OTR). You can also share your links over PGP-encrypted email using Thunderbird. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Coquelicot112020-05-30 17:57:45SunilMohanAdapaUpdate the title to emphasize app name over its generic name102020-05-23 19:51:30JamesValleroyadd TableOfContents92020-05-23 17:03:10JamesValleroyrename plinth -> freedombox82020-04-12 16:01:36JamesValleroyadd links back to top level pages72019-09-11 09:45:09fioddorCategory Deduplicated62018-12-30 19:59:56DrahtseilBasic priniciple52018-03-05 09:15:01JosephNuthalapaticoquelicot: Fix broken links42018-02-26 17:14:51JamesValleroyincluded in 0.2432018-02-12 23:48:10JamesValleroybump version22018-02-12 23:47:14JamesValleroyreplace fancy quote characters with plain quote characters12018-02-10 03:14:55JosephNuthalapatiCreate new page for Coquelicot
Coquelicot (File Sharing)
About CoquelicotCoquelicot is a "one-click" file sharing web application with a focus on protecting users' privacy. The basic principle is simple: users can upload a file to the server, in return they get a unique URL which can be shared with others in order to download the file. A download password can be defined. After the upload you get a unique link that can be shared to your partners in order to Read more about Coquelicot at the Coquelicot README Available since: version 0.24.0
When to use CoquelicotCoquelicot is best used to quickly share a single file. If you want to share a folder, for a single use, compress the folder and share it over Coquelicot which must be kept synchronized between computers, use Syncthing instead Coquelicot can only provide a reasonable degree of privacy. If anonymity is required, you should consider using the desktop application Onionshare instead. Since Coquelicot fully uploads the file to the server, your FreedomBox will incur both upload and download bandwidth costs. For very large files, consider sharing them using BitTorrent by creating a private torrent file. If anonymity is required, use Onionshare. It is P2P and doesn't require a server.
Coquelicot on FreedomBoxWith Coquelicot installed, you can upload files to your FreedomBox server and privately share them. Post installation, the Coquelicot page offers two settings. Upload Password: Coquelicot on FreedomBox is currently configured to use simple password authentication for ease of use. Remember that it's one global password for this Coquelicot instance and not your user password for FreedomBox. You need not remember this password. You can set a new one from the FreedomBox interface anytime. Maximum File Size: You can alter the maximum size of the file that can be transferred through Coquelicot using this setting. The size is in Mebibytes. The maximum file size is only limited by the disk size of your FreedomBox.
PrivacySomeone monitoring your network traffic might find out that some file is being transferred through your FreedomBox and also possibly its size, but will not know the file name. Coquelicot encrypts files on the server and also fills the file contents with 0s when deleting them. This eliminates the risk of file contents being revealed in the event of your FreedomBox being confiscated or stolen. The real risk to mitigate here is a third-party also downloading your file along with the intended recipient.
Sharing over instant messengersSome instant messengers which have previews for websites might download your file in order to show a preview in the conversation. If you set the option of one-time download on a file, you might notice that the one download will be used up by the instant messenger. If sharing over such messengers, please use a download password in combination with a one-time download option.
Sharing download links privatelyIt is recommended to share your file download links and download passwords over encrypted channels. You can simply avoid all the above problems with instant messenger previews by using instant messengers that support encrypted conversations like Riot with Matrix Synapse or XMPP (ejabberd server on FreedomBox) with clients that support end-to-end encryption. Send the download link and the download password in two separate messages (helps if your messenger supports perfect forward secrecy like XMPP with OTR). You can also share your links over PGP-encrypted email using Thunderbird. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Coturn.raw.xml b/doc/manual/en/Coturn.raw.xml index bbdd59ade..aad0f6a91 100644 --- a/doc/manual/en/Coturn.raw.xml +++ b/doc/manual/en/Coturn.raw.xml @@ -1,4 +1,4 @@ -
FreedomBox/Manual/Coturn82020-05-18 23:24:50JamesValleroyremove duplicate word "server"72020-05-18 23:23:07JamesValleroyspelling "known"62020-05-18 23:22:26JamesValleroyadd common acronym (NAT)52020-05-18 23:21:45JamesValleroyspelling42020-05-10 10:33:22fioddorStress the benefits of direct streaming.32020-05-08 19:15:06Drahtseiltiny typo in synapes corrected22020-05-06 06:04:11SunilMohanAdapaUpdate title, include footer12020-05-06 05:59:44SunilMohanAdapaAdd manual page for new app Coturn
VoIP Helper (Coturn)Coturn is a server to facilitate audio/video calls and conferences by providing an implementation of TURN and STUN protocols. WebRTC, SIP and other communication servers can use it to establish a call between parties who are otherwise unable connect to each other. It is not meant to be used directly by users. Servers such as Matrix Synapse need to be configured with the details provided on the Coturn app page. Apart from Matrix Synapse, Jitsi, Ejabberd, Nextcloud Talk, etc. can use Coturn server for audio/video calls and conferences. There is no need for the servers to be running on the same machine as FreedomBox and external servers can use Coturn running on FreedomBox. Coturn is available in FreedomBox since version 20.8 as an advanced app. This means that you need to check "Show advanced apps and features" in "General Configuration" to see Coturn icon in the "Apps" section.
How it worksWhen making an audio/video call, it is best to route the media streams between two peers directly. This will give the best possible latency (better signal quality) and avoid depending on a centralized server (privacy). It scales well because a simple chat server can host thousands of calls without involving the server in any way other than to setup the call. However, this approach does not work most of the time to due to how networks are configured. Most peers on the network do not have a unique IP address allocated to them. They work hidden behind a network device that performs "Network Address Translation" (NAT) for them. This means that the two peers have no way of reaching each other. To address this problem, a simple technique known as STUN was introduced. With the help of a third party STUN server, the peers can trick the NAT devices, to carry the traffic between the two peers. Unfortunately, this trick only works about 80% of the time. So, if STUN fails, peers have no choice but to route their traffic through an intermediary server called TURN server. All the mechanism of trying out STUN first and then falling back to TURN is described in a protocol known as ICE. On FreedomBox, Coturn provides both STUN and TURN servers. Both services are provided over TCP as well as UDP. They are provided on unencrypted as well as encrypted channels (with have a higher chance of success). Since STUN servers are very inexpensive and don't consume a lot of server resources, there is no authentication needed to use them. TURN servers on the other hand need authentication. This authentication is highly simplified and does not require maintaining a database of users. A server such as matrix-synapse which is about to setup an audio/video call between two peers will generate a username and password using a shared secret. When the peers use the TURN server, they will be validated using these credentials because the TURN server also knows the same secret. In summary, a communication server needs to know the URLs of the STUN/TURN servers along with a shared authentication secret for TURN. After that, during audio/video call setup, they will correctly guide the peers to use STUN/TURN servers. Coturn app in FreedomBox provides exactly this information. This information can be used to configure a communication server irrespective of whether it is running on the same FreedomBox or on another server.
Configuring Matrix SynapseMatrix Synapse server in FreedomBox can be configured to use Coturn TURN/STUN server. In future, when you install Matrix Synapse, FreedomBox will automatically install Coturn and configure its parameters into Matrix Synapse. To configure Matrix Synapse, edit the file /etc/matrix-synapse/homeserver.yaml with the following lines:
FreedomBox/Manual/Coturn102020-05-30 18:10:51SunilMohanAdapaUpdate the title to emphasize app name over its generic name92020-05-23 19:57:40JamesValleroyadd TableOfContents82020-05-18 23:24:50JamesValleroyremove duplicate word "server"72020-05-18 23:23:07JamesValleroyspelling "known"62020-05-18 23:22:26JamesValleroyadd common acronym (NAT)52020-05-18 23:21:45JamesValleroyspelling42020-05-10 10:33:22fioddorStress the benefits of direct streaming.32020-05-08 19:15:06Drahtseiltiny typo in synapes corrected22020-05-06 06:04:11SunilMohanAdapaUpdate title, include footer12020-05-06 05:59:44SunilMohanAdapaAdd manual page for new app Coturn
Coturn (VoIP Helper)Coturn is a server to facilitate audio/video calls and conferences by providing an implementation of TURN and STUN protocols. WebRTC, SIP and other communication servers can use it to establish a call between parties who are otherwise unable connect to each other. It is not meant to be used directly by users. Servers such as Matrix Synapse need to be configured with the details provided on the Coturn app page. Apart from Matrix Synapse, Jitsi, Ejabberd, Nextcloud Talk, etc. can use Coturn server for audio/video calls and conferences. There is no need for the servers to be running on the same machine as FreedomBox and external servers can use Coturn running on FreedomBox. Coturn is available in FreedomBox since version 20.8 as an advanced app. This means that you need to check "Show advanced apps and features" in "General Configuration" to see Coturn icon in the "Apps" section.
How it worksWhen making an audio/video call, it is best to route the media streams between two peers directly. This will give the best possible latency (better signal quality) and avoid depending on a centralized server (privacy). It scales well because a simple chat server can host thousands of calls without involving the server in any way other than to setup the call. However, this approach does not work most of the time to due to how networks are configured. Most peers on the network do not have a unique IP address allocated to them. They work hidden behind a network device that performs "Network Address Translation" (NAT) for them. This means that the two peers have no way of reaching each other. To address this problem, a simple technique known as STUN was introduced. With the help of a third party STUN server, the peers can trick the NAT devices, to carry the traffic between the two peers. Unfortunately, this trick only works about 80% of the time. So, if STUN fails, peers have no choice but to route their traffic through an intermediary server called TURN server. All the mechanism of trying out STUN first and then falling back to TURN is described in a protocol known as ICE. On FreedomBox, Coturn provides both STUN and TURN servers. Both services are provided over TCP as well as UDP. They are provided on unencrypted as well as encrypted channels (with have a higher chance of success). Since STUN servers are very inexpensive and don't consume a lot of server resources, there is no authentication needed to use them. TURN servers on the other hand need authentication. This authentication is highly simplified and does not require maintaining a database of users. A server such as matrix-synapse which is about to setup an audio/video call between two peers will generate a username and password using a shared secret. When the peers use the TURN server, they will be validated using these credentials because the TURN server also knows the same secret. In summary, a communication server needs to know the URLs of the STUN/TURN servers along with a shared authentication secret for TURN. After that, during audio/video call setup, they will correctly guide the peers to use STUN/TURN servers. Coturn app in FreedomBox provides exactly this information. This information can be used to configure a communication server irrespective of whether it is running on the same FreedomBox or on another server.
Configuring Matrix SynapseMatrix Synapse server in FreedomBox can be configured to use Coturn TURN/STUN server. In future, when you install Matrix Synapse, FreedomBox will automatically install Coturn and configure its parameters into Matrix Synapse. To configure Matrix Synapse, edit the file /etc/matrix-synapse/homeserver.yaml with the following lines: And then restart matrix-synapse server by disabling and re-enabling the matrix-synapse app. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +turn_allow_guests: True]]>
And then restart matrix-synapse server by disabling and re-enabling the matrix-synapse app. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/DateTime.raw.xml b/doc/manual/en/DateTime.raw.xml index a7f3cad8f..2f4825bc4 100644 --- a/doc/manual/en/DateTime.raw.xml +++ b/doc/manual/en/DateTime.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/DateTime32020-03-30 00:08:09JamesValleroytoo many #s in front of END_INCLUDE22017-03-31 20:20:57DrahtseilScreenshot DateTime12016-08-21 09:26:45DrahtseilCreated Date & Time
Date & TimeThis network time server is a program that maintains the system time in synchronization with servers on the Internet. You can select your time zone by picking a big city nearby (they are sorted by Continent/City) or select directly the zone with respect to GMT (Greenwich Mean Time). DateTime.png Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/DateTime52020-05-23 20:41:22JamesValleroyRevert to revision 3.42020-05-23 20:40:09JamesValleroyadd TableOfContents32020-03-30 00:08:09JamesValleroytoo many #s in front of END_INCLUDE22017-03-31 20:20:57DrahtseilScreenshot DateTime12016-08-21 09:26:45DrahtseilCreated Date & Time
Date & TimeThis network time server is a program that maintains the system time in synchronization with servers on the Internet. You can select your time zone by picking a big city nearby (they are sorted by Continent/City) or select directly the zone with respect to GMT (Greenwich Mean Time). DateTime.png Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Deluge.raw.xml b/doc/manual/en/Deluge.raw.xml index ca1c70f80..27bf64439 100644 --- a/doc/manual/en/Deluge.raw.xml +++ b/doc/manual/en/Deluge.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Deluge112016-12-31 01:32:15JamesValleroyadd initial setup directions102016-12-30 19:20:00JamesValleroyreword92016-12-30 19:14:16JamesValleroyadd intro paragraph82016-12-30 19:00:50JamesValleroyno space in "BitTorrent"72016-12-26 18:07:46JamesValleroyadd screenshot62016-09-01 19:05:24Drahtseiladapted title to Plinth wording52016-04-10 07:26:48PhilippeBaretAdded bottom navigation link42015-12-15 20:41:02PhilippeBaretCorrection32015-12-15 20:40:16PhilippeBaretCorrection22015-12-15 18:16:28PhilippeBaretAdded Deluge definition12015-12-15 16:59:01PhilippeBaretCreated new Deluge page for manual
BitTorrent (Deluge)
What is Deluge?BitTorrent is a communications protocol using peer-to-peer (P2P) file sharing. It is not anonymous; you should assume that others can see what files you are sharing. There are two BitTorrent web clients available in FreedomBox: Transmission and Deluge. They have similar features, but you may prefer one over the other. Deluge is a lightweight BitTorrent client that is highly configurable. Additional functionality can be added by installing plugins.
ScreenshotDeluge Web UI
Initial SetupAfter installing Deluge, it can be accessed by pointing your browser to https://<your freedombox>/deluge. You will need to enter a password to login: Deluge Login The initial password is "deluge". The first time that you login, Deluge will ask if you wish to change the password. You should change it to something that is harder to guess. Next you will be shown the connection manager. Click on the first entry (Offline - 127.0.0.1:58846). Then click "Start Daemon" to start the Deluge service that will run in the background. Deluge Connection Manager (Offline) Now it should say "Online". Click "Connect" to complete the setup. Deluge Connection Manager (Online) At this point, you are ready to begin using Deluge. You can make further changes in the Preferences, or add a torrent file or URL. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Deluge132020-05-30 17:53:48SunilMohanAdapaUpdate the title to emphasize app name over its generic name122020-05-23 19:48:36JamesValleroyadd TableOfContents112016-12-31 01:32:15JamesValleroyadd initial setup directions102016-12-30 19:20:00JamesValleroyreword92016-12-30 19:14:16JamesValleroyadd intro paragraph82016-12-30 19:00:50JamesValleroyno space in "BitTorrent"72016-12-26 18:07:46JamesValleroyadd screenshot62016-09-01 19:05:24Drahtseiladapted title to Plinth wording52016-04-10 07:26:48PhilippeBaretAdded bottom navigation link42015-12-15 20:41:02PhilippeBaretCorrection32015-12-15 20:40:16PhilippeBaretCorrection22015-12-15 18:16:28PhilippeBaretAdded Deluge definition12015-12-15 16:59:01PhilippeBaretCreated new Deluge page for manual
Deluge (BitTorrent Web Client)
What is Deluge?BitTorrent is a communications protocol using peer-to-peer (P2P) file sharing. It is not anonymous; you should assume that others can see what files you are sharing. There are two BitTorrent web clients available in FreedomBox: Transmission and Deluge. They have similar features, but you may prefer one over the other. Deluge is a lightweight BitTorrent client that is highly configurable. Additional functionality can be added by installing plugins.
ScreenshotDeluge Web UI
Initial SetupAfter installing Deluge, it can be accessed by pointing your browser to https://<your freedombox>/deluge. You will need to enter a password to login: Deluge Login The initial password is "deluge". The first time that you login, Deluge will ask if you wish to change the password. You should change it to something that is harder to guess. Next you will be shown the connection manager. Click on the first entry (Offline - 127.0.0.1:58846). Then click "Start Daemon" to start the Deluge service that will run in the background. Deluge Connection Manager (Offline) Now it should say "Online". Click "Connect" to complete the setup. Deluge Connection Manager (Online) At this point, you are ready to begin using Deluge. You can make further changes in the Preferences, or add a torrent file or URL. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Diagnostics.raw.xml b/doc/manual/en/Diagnostics.raw.xml index 705c9a44d..aa6724428 100644 --- a/doc/manual/en/Diagnostics.raw.xml +++ b/doc/manual/en/Diagnostics.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Diagnostics12016-08-21 09:43:52DrahtseilCreated Diagnostics
DiagnosticsThe system diagnostic test will run a number of checks on your system to confirm that applications and services are working as expected. Just click Run Diagnostics. This may take some minutes. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Diagnostics12016-08-21 09:43:52DrahtseilCreated Diagnostics
DiagnosticsThe system diagnostic test will run a number of checks on your system to confirm that applications and services are working as expected. Just click Run Diagnostics. This may take some minutes. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/DynamicDNS.raw.xml b/doc/manual/en/DynamicDNS.raw.xml index 2b81854c6..b04be918c 100644 --- a/doc/manual/en/DynamicDNS.raw.xml +++ b/doc/manual/en/DynamicDNS.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/DynamicDNS162019-07-31 13:18:03NikolasNybyfix typo152019-02-26 03:20:16JamesValleroyspelling142018-03-11 03:11:04JosephNuthalapatiFix oversized image132017-03-31 20:35:42Drahtseilupdated screenshot122016-09-09 15:40:08SunilMohanAdapaMinor indentation fix with screenshot112016-09-01 19:18:48Drahtseiladapted title to Plinth wording102016-08-15 18:46:51DrahtseilScreenshot GNU-DIP92016-04-14 14:22:41PhilippeBaretAdded accurate How to create a DNS name with GnuDIP82016-04-10 07:15:47PhilippeBaretAdded bottom navigation link72016-01-11 06:28:36PhilippeBaretCorrection62015-12-15 18:48:25PhilippeBaretAdded definition title to Dynamic DNS page52015-09-13 15:02:37SunilMohanAdapaDemote headings one level for inclusion into manual42015-09-13 13:14:41SunilMohanAdapaMove DynamicDNS page to manual32015-08-13 13:03:13SunilMohanAdapaAdd more introduction and re-organize.22015-08-09 21:38:52DanielSteglich12015-08-09 21:23:48DanielSteglich
Dynamic DNS Client
What is Dynamic DNS?In order to reach a server on the Internet, the server needs to have permanent address also known as the static IP address. Many Internet service providers don't provide home users with a static IP address or they charge more providing a static IP address. Instead they provide the home user with an IP address that changes every time the user connects to the Internet. Clients wishing to contact the server will have difficulty reaching the server. Dynamic DNS service providers assist in working around a problem. First they provide you with a domain name, such as 'myhost.example.org'. Then they associate your IP address, whenever it changes, with this domain name. Then anyone intending to reach the server will be to contact the server using the domain name 'myhost.example.org' which always points to the latest IP address of the server. 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.
GnuDIP vs. Update URLThere 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. If a service provided using update URL is not properly secured using HTTPS, your credentials may be visible to an adversary. Once an adversary gains your credentials, they will be able to replay your request your server and hijack your domain. On the other hand, the GnuDIP protocol will only transport a salted MD5 value of your password, in a way that is secure against replay attacks.
Using the GnuDIP protocolRegister an account with any Dynamic DNS service provider. A free service provided by the FreedomBox community is available at . In FreedomBox UI, enable the Dynamic DNS Service. Select GnuDIP as Service type, enter your Dynamic DNS service provider address (for example, gnudip.datasystems24.net) into GnuDIP Server Address field. Dynamic DNS Settings Fill Domain Name, Username, Password information given by your provider into the corresponding fields.
Using an Update URLThis feature is implemented because the most popular Dynamic DNS providers are using Update URLs mechanism. Register an account with a Dynamic DNS service provider providing their service using Update URL mechanism. Some example providers are listed in the configuration page itself. In FreedomBox UI, enable the Dynamic DNS service. Select other Update URL as Service type, enter the update URL given by your provider into Update URL field. If you browse the update URL with your Internet browser and a warning message about untrusted certificate appears, then enable accept all SSL certificates. WARNING: your credentials may be readable here because man-in-the-middle attacks are possible! Consider choosing a better service provider instead. If you browse the update URL with your Internet browser and the username/password box appears, enable use HTTP basic authentication checkbox and provide the Username and Password. If the update URL contains your current IP address, replace the IP address with the string <Ip>.
Checking If It WorksMake sure that external services you have enabled such as /jwchat, /roundcube and /ikiwiki are available on your domain address. Go to the Status page, make sure that the NAT type is detected correctly. If your FreedomBox is behind a NAT device, this should be detected over there (Text: Behind NAT). If your FreedomBox has a public IP address assigned, the text should be "Direct connection to the Internet". Check that the last update status is not failed.
Recap: How to create a DNS name with GnuDIPto delete or to replace the old text Access to GnuIP login page (answer Yes to all pop ups) Click on "Self Register" Fill the registration form (Username and domain will form the public IP address [username.domain]) Take note of the username/hostname and password that will be used on the FreedomBox app. Save and return to the GnuDIP login page to verify your username, domain and password (enter the datas, click login). Login output should display your new domain name along with your current public IP address (this is a unique address provided by your router for all your local devices). Leave the GnuDIP interface and open the Dynamic DNS Client app page in your FreedomBox. Click on "Set Up" in the top menu. Activate Dynamic DNS Choose GnuDIP service. Add server address (gnudip.datasystems24.net) Add your fresh domain name (username.domain, ie [username].freedombox.rocks) Add your fresh username (the one used in your new IP address) and password Add your GnuDIP password Fill the option with (try this url in your browser, you will figure out immediately) Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/DynamicDNS172020-05-23 20:41:48JamesValleroyadd TableOfContents162019-07-31 13:18:03NikolasNybyfix typo152019-02-26 03:20:16JamesValleroyspelling142018-03-11 03:11:04JosephNuthalapatiFix oversized image132017-03-31 20:35:42Drahtseilupdated screenshot122016-09-09 15:40:08SunilMohanAdapaMinor indentation fix with screenshot112016-09-01 19:18:48Drahtseiladapted title to Plinth wording102016-08-15 18:46:51DrahtseilScreenshot GNU-DIP92016-04-14 14:22:41PhilippeBaretAdded accurate How to create a DNS name with GnuDIP82016-04-10 07:15:47PhilippeBaretAdded bottom navigation link72016-01-11 06:28:36PhilippeBaretCorrection62015-12-15 18:48:25PhilippeBaretAdded definition title to Dynamic DNS page52015-09-13 15:02:37SunilMohanAdapaDemote headings one level for inclusion into manual42015-09-13 13:14:41SunilMohanAdapaMove DynamicDNS page to manual32015-08-13 13:03:13SunilMohanAdapaAdd more introduction and re-organize.22015-08-09 21:38:52DanielSteglich12015-08-09 21:23:48DanielSteglich
Dynamic DNS Client
What is Dynamic DNS?In order to reach a server on the Internet, the server needs to have permanent address also known as the static IP address. Many Internet service providers don't provide home users with a static IP address or they charge more providing a static IP address. Instead they provide the home user with an IP address that changes every time the user connects to the Internet. Clients wishing to contact the server will have difficulty reaching the server. Dynamic DNS service providers assist in working around a problem. First they provide you with a domain name, such as 'myhost.example.org'. Then they associate your IP address, whenever it changes, with this domain name. Then anyone intending to reach the server will be to contact the server using the domain name 'myhost.example.org' which always points to the latest IP address of the server. 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.
GnuDIP vs. Update URLThere 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. If a service provided using update URL is not properly secured using HTTPS, your credentials may be visible to an adversary. Once an adversary gains your credentials, they will be able to replay your request your server and hijack your domain. On the other hand, the GnuDIP protocol will only transport a salted MD5 value of your password, in a way that is secure against replay attacks.
Using the GnuDIP protocolRegister an account with any Dynamic DNS service provider. A free service provided by the FreedomBox community is available at . In FreedomBox UI, enable the Dynamic DNS Service. Select GnuDIP as Service type, enter your Dynamic DNS service provider address (for example, gnudip.datasystems24.net) into GnuDIP Server Address field. Dynamic DNS Settings Fill Domain Name, Username, Password information given by your provider into the corresponding fields.
Using an Update URLThis feature is implemented because the most popular Dynamic DNS providers are using Update URLs mechanism. Register an account with a Dynamic DNS service provider providing their service using Update URL mechanism. Some example providers are listed in the configuration page itself. In FreedomBox UI, enable the Dynamic DNS service. Select other Update URL as Service type, enter the update URL given by your provider into Update URL field. If you browse the update URL with your Internet browser and a warning message about untrusted certificate appears, then enable accept all SSL certificates. WARNING: your credentials may be readable here because man-in-the-middle attacks are possible! Consider choosing a better service provider instead. If you browse the update URL with your Internet browser and the username/password box appears, enable use HTTP basic authentication checkbox and provide the Username and Password. If the update URL contains your current IP address, replace the IP address with the string <Ip>.
Checking If It WorksMake sure that external services you have enabled such as /jwchat, /roundcube and /ikiwiki are available on your domain address. Go to the Status page, make sure that the NAT type is detected correctly. If your FreedomBox is behind a NAT device, this should be detected over there (Text: Behind NAT). If your FreedomBox has a public IP address assigned, the text should be "Direct connection to the Internet". Check that the last update status is not failed.
Recap: How to create a DNS name with GnuDIPto delete or to replace the old text Access to GnuIP login page (answer Yes to all pop ups) Click on "Self Register" Fill the registration form (Username and domain will form the public IP address [username.domain]) Take note of the username/hostname and password that will be used on the FreedomBox app. Save and return to the GnuDIP login page to verify your username, domain and password (enter the datas, click login). Login output should display your new domain name along with your current public IP address (this is a unique address provided by your router for all your local devices). Leave the GnuDIP interface and open the Dynamic DNS Client app page in your FreedomBox. Click on "Set Up" in the top menu. Activate Dynamic DNS Choose GnuDIP service. Add server address (gnudip.datasystems24.net) Add your fresh domain name (username.domain, ie [username].freedombox.rocks) Add your fresh username (the one used in your new IP address) and password Add your GnuDIP password Fill the option with (try this url in your browser, you will figure out immediately) Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Firewall.raw.xml b/doc/manual/en/Firewall.raw.xml index 425b11b24..f04bc1de7 100644 --- a/doc/manual/en/Firewall.raw.xml +++ b/doc/manual/en/Firewall.raw.xml @@ -1,4 +1,4 @@ -
FreedomBox/Manual/Firewall292020-05-03 18:56:52JamesValleroyremove link to source file, no longer exists282020-05-03 18:56:08JamesValleroyrename plinth -> freedombox272020-04-12 15:56:21JamesValleroyadd links back to top level pages262019-10-21 14:58:15fioddorMinor correction252018-03-11 03:12:12JosephNuthalapatiFix oversized image242017-03-31 20:25:36DrahtseilScreenshot Firewall232017-01-08 02:18:51JamesValleroyadd minetest222017-01-08 02:17:46JamesValleroyfix table spacing212017-01-08 02:16:47JamesValleroyadd repro202017-01-08 02:10:57JamesValleroyadd mumble192017-01-08 02:08:58JamesValleroyadd quassel182017-01-08 01:55:02JamesValleroyreorder to match Plinth Firewall page172017-01-07 21:07:25JamesValleroyupdate managed by plinth162017-01-07 20:54:21JamesValleroyupdate statuses shown in plinth152017-01-07 20:51:16JamesValleroyupdated services enabled by default142017-01-07 20:49:50JamesValleroyfix table spacing132017-01-07 20:47:32JamesValleroyjwchat replaced with jsxc122017-01-07 20:45:27JamesValleroyremove owncloud from ports list112016-01-13 23:19:49JamesValleroyport -> service102015-12-15 00:51:46JamesValleroyfew corrections92015-09-16 11:06:29SunilMohanAdapaUpdate an oudated link82015-09-16 08:18:17SunilMohanAdapaRemove unnecessary automatic links72015-09-13 15:06:40SunilMohanAdapaModify structure for inclusion into manual62015-09-12 11:19:31SunilMohanAdapaMove the firewall page to Manual paths52015-09-12 09:37:40SunilMohanAdapaMove networking related information to Networks page, cleanup42015-02-13 04:53:16SunilMohanAdapaInclude FreedomBox portal in footer32014-05-08 08:02:39SunilMohanAdapaAdd section on internet connection sharing and minor corrections22014-05-08 07:49:29PaulWiselink to the plinth source12014-05-08 07:36:15SunilMohanAdapaNew page documenting firewall operation and default port status
FirewallFirewall is a network security system that controls the incoming and outgoing network traffic. Keeping a firewall enabled and properly configured reduces risk of security threat from the Internet. The operation of the firewall in FreedomBox web interface is automatic. When you enable a service it is automatically permitted in the firewall and when you disable a service it is automatically disabled in the firewall. For services which are enabled by default on FreedomBox, firewall ports are also enabled by default during the first run process. Firewall Firewall management in FreedomBox is done using FirewallD.
InterfacesEach interface is needs to be assigned to one (and only one) zone. Whatever rules are in effect for a zone, those rules start to apply for that interface. For example, if HTTP traffic is allowed in a particular zone, then web requests will be accepted on all the addresses configured for all the interfaces assigned to that zone. There are primarily two firewall zones used. The internal zone is meant for services that are provided to all machines on the local network. This may include services such as streaming media and simple file sharing. The external zone is meant for services that are provided publicly on the Internet. This may include services such as blog, website, email web client etc. For details on how network interfaces are configured by default, see the Networks section.
Ports/ServicesThe following table attempts to document the ports, services and their default statuses in FreedomBox. If you find this page outdated, see the Firewall status page in FreedomBox interface. ServicePort ExternalEnabled by defaultStatus shown in FreedomBoxManaged by FreedomBox Minetest 30000/udp {*} {X} (./) (./) XMPP Client 5222/tcp {*} {X} (./) (./) XMPP Server 5269/tcp {*} {X} (./) (./) XMPP Bosh 5280/tcp {*} {X} (./) (./) NTP 123/udp {o} (./) (./) (./) FreedomBox Web Interface (Plinth) 443/tcp {*} (./) (./) {X} Quassel 4242/tcp {*} {X} (./) (./) SIP 5060/tcp {*} {X} (./) (./) SIP 5060/udp {*} {X} (./) (./) SIP-TLS 5061/tcp {*} {X} (./) (./) SIP-TLS 5061/udp {*} {X} (./) (./) RTP 1024-65535/udp {*} {X} (./) (./) SSH 22/tcp {*} (./) (./) {X} mDNS 5353/udp {o} (./) (./) (./) Tor (Socks) 9050/tcp {o} {X} (./) (./) Obfsproxy <random>/tcp {*} {X} (./) (./) OpenVPN 1194/udp {*} {X} (./) (./) Mumble 64378/tcp {*} {X} (./) (./) Mumble 64378/udp {*} {X} (./) (./) Privoxy 8118/tcp {o} {X} (./) (./) JSXC 80/tcp {*} {X} {X} {X} JSXC 443/tcp {*} {X} {X} {X} DNS 53/tcp {o} {X} {X} {X} DNS 53/udp {o} {X} {X} {X} DHCP 67/udp {o} (./) {X} {X} Bootp 67/tcp {o} {X} {X} {X} Bootp 67/udp {o} {X} {X} {X} Bootp 68/tcp {o} {X} {X} {X} Bootp 68/udp {o} {X} {X} {X} LDAP 389/tcp {o} {X} {X} {X} LDAPS 636/tcp {o} {X} {X} {X}
Manual operationSee FirewallD documentation for more information on the basic concepts and comprehensive documentation.
Enable/disable firewallTo disable firewall or with systemd To re-enable firewall or with systemd
Modifying services/portsYou can manually add or remove a service from a zone. To see list of services enabled: --list-services]]>Example: To see list of ports enabled: --list-ports]]>Example: To remove a service from a zone: --remove-service= +
FreedomBox/Manual/Firewall322020-05-24 08:58:20fioddorMinor clarification312020-05-24 04:43:27SunilMohanAdapaAdd advanced firewall operations section referring to Cockpit302020-05-23 20:42:15JamesValleroyadd TableOfContents292020-05-03 18:56:52JamesValleroyremove link to source file, no longer exists282020-05-03 18:56:08JamesValleroyrename plinth -> freedombox272020-04-12 15:56:21JamesValleroyadd links back to top level pages262019-10-21 14:58:15fioddorMinor correction252018-03-11 03:12:12JosephNuthalapatiFix oversized image242017-03-31 20:25:36DrahtseilScreenshot Firewall232017-01-08 02:18:51JamesValleroyadd minetest222017-01-08 02:17:46JamesValleroyfix table spacing212017-01-08 02:16:47JamesValleroyadd repro202017-01-08 02:10:57JamesValleroyadd mumble192017-01-08 02:08:58JamesValleroyadd quassel182017-01-08 01:55:02JamesValleroyreorder to match Plinth Firewall page172017-01-07 21:07:25JamesValleroyupdate managed by plinth162017-01-07 20:54:21JamesValleroyupdate statuses shown in plinth152017-01-07 20:51:16JamesValleroyupdated services enabled by default142017-01-07 20:49:50JamesValleroyfix table spacing132017-01-07 20:47:32JamesValleroyjwchat replaced with jsxc122017-01-07 20:45:27JamesValleroyremove owncloud from ports list112016-01-13 23:19:49JamesValleroyport -> service102015-12-15 00:51:46JamesValleroyfew corrections92015-09-16 11:06:29SunilMohanAdapaUpdate an oudated link82015-09-16 08:18:17SunilMohanAdapaRemove unnecessary automatic links72015-09-13 15:06:40SunilMohanAdapaModify structure for inclusion into manual62015-09-12 11:19:31SunilMohanAdapaMove the firewall page to Manual paths52015-09-12 09:37:40SunilMohanAdapaMove networking related information to Networks page, cleanup42015-02-13 04:53:16SunilMohanAdapaInclude FreedomBox portal in footer32014-05-08 08:02:39SunilMohanAdapaAdd section on internet connection sharing and minor corrections22014-05-08 07:49:29PaulWiselink to the plinth source12014-05-08 07:36:15SunilMohanAdapaNew page documenting firewall operation and default port status
FirewallFirewall is a network security system that controls the incoming and outgoing network traffic. Keeping a firewall enabled and properly configured reduces risk of security threat from the Internet. The operation of the firewall in FreedomBox web interface is automatic. When you enable a service it is automatically permitted in the firewall and when you disable a service it is automatically disabled in the firewall. For services which are enabled by default on FreedomBox, firewall ports are also enabled by default during the first run process. Firewall Firewall management in FreedomBox is done using FirewallD.
InterfacesEach interface is needs to be assigned to one (and only one) zone. If an interface is not assigned any zone, it is automatically assigned external zone. Whatever rules are in effect for a zone, those rules start to apply for that interface. For example, if HTTP traffic is allowed in a particular zone, then web requests will be accepted on all the addresses configured for all the interfaces assigned to that zone. There are primarily two firewall zones used. The internal zone is meant for services that are provided to all machines on the local network. This may include services such as streaming media and simple file sharing. The external zone is meant for services that are provided publicly on the Internet. This may include services such as blog, website, email web client etc. For details on how network interfaces are configured by default, see the Networks section.
Opening Custom PortsCockpit app provides advanced management of firewall. Both FreedomBox and Cockpit operate over firewalld and are hence compatible with each other. In particular, Cockpit can be used to open custom services or ports on FreedomBox. This is useful if you are manually running your own services in addition to the services provided by FreedomBox on the same machine. firewalld-cockpit.png
FreedomBox Ports/ServicesThe following table attempts to document the ports, services and their default statuses in FreedomBox. If you find this page outdated, see the Firewall status page in FreedomBox interface. ServicePort ExternalEnabled by defaultStatus shown in FreedomBoxManaged by FreedomBox Minetest 30000/udp {*} {X} (./) (./) XMPP Client 5222/tcp {*} {X} (./) (./) XMPP Server 5269/tcp {*} {X} (./) (./) XMPP Bosh 5280/tcp {*} {X} (./) (./) NTP 123/udp {o} (./) (./) (./) FreedomBox Web Interface (Plinth) 443/tcp {*} (./) (./) {X} Quassel 4242/tcp {*} {X} (./) (./) SIP 5060/tcp {*} {X} (./) (./) SIP 5060/udp {*} {X} (./) (./) SIP-TLS 5061/tcp {*} {X} (./) (./) SIP-TLS 5061/udp {*} {X} (./) (./) RTP 1024-65535/udp {*} {X} (./) (./) SSH 22/tcp {*} (./) (./) {X} mDNS 5353/udp {o} (./) (./) (./) Tor (Socks) 9050/tcp {o} {X} (./) (./) Obfsproxy <random>/tcp {*} {X} (./) (./) OpenVPN 1194/udp {*} {X} (./) (./) Mumble 64378/tcp {*} {X} (./) (./) Mumble 64378/udp {*} {X} (./) (./) Privoxy 8118/tcp {o} {X} (./) (./) JSXC 80/tcp {*} {X} {X} {X} JSXC 443/tcp {*} {X} {X} {X} DNS 53/tcp {o} {X} {X} {X} DNS 53/udp {o} {X} {X} {X} DHCP 67/udp {o} (./) {X} {X} Bootp 67/tcp {o} {X} {X} {X} Bootp 67/udp {o} {X} {X} {X} Bootp 68/tcp {o} {X} {X} {X} Bootp 68/udp {o} {X} {X} {X} LDAP 389/tcp {o} {X} {X} {X} LDAPS 636/tcp {o} {X} {X} {X}
Manual operationSee FirewallD documentation for more information on the basic concepts and comprehensive documentation.
Enable/disable firewallTo disable firewall or with systemd To re-enable firewall or with systemd
Modifying services/portsYou can manually add or remove a service from a zone. To see list of services enabled: --list-services]]>Example: To see list of ports enabled: --list-ports]]>Example: To remove a service from a zone: --remove-service= firewall-cmd --permanent --zone= --remove-service=]]>Example: To remove a port from a zone: / firewall-cmd --permanent --zone=internal --remove-port=/]]>Example: --remove-interface=]]>Example: To add an interface to a zone: --add-interface= firewall-cmd --permanent --zone= --add-interface=]]>Example: Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +firewall-cmd --permanent --zone=internal --add-interface=eth0]]>
Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/GitWeb.raw.xml b/doc/manual/en/GitWeb.raw.xml index 7501971c2..a9b16582f 100644 --- a/doc/manual/en/GitWeb.raw.xml +++ b/doc/manual/en/GitWeb.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/GitWeb72020-01-29 06:48:44fioddorInhibit autolink and stress to avoid using admin accounts.62020-01-27 12:42:43VeikoAasa52020-01-27 09:50:21VeikoAasa42019-12-16 23:25:10JamesValleroyadd standard manual page footer32019-12-15 19:38:46DrahtseilCopied description from plinth, managing, access22019-12-14 13:44:36JosephNuthalapatiAdd section: HTTP basic auth12019-12-14 13:14:15JosephNuthalapatiCreate GitWeb page with a stub.
Simple Git Hosting (GitWeb)Git is a distributed version-control system for tracking changes in source code during software development. GitWeb provides a web interface to Git repositories. You can browse history and content of source code, use search to find relevant commits and code. You can also clone repositories and upload code changes with a command-line Git client or with multiple available graphical clients. And you can share your code with people around the world. To learn more on how to use Git visit Git tutorial. Available since version: 19.19
Managing the repositoriesAfter installation of GitWeb, a new repository can be created. It can be marked as private to limit access.
AccessGitWeb can be accessed after installation e.g. by the web client through
HTTP basic authGitWeb on FreedomBox currently supports HTTP remotes only. To avoid having to enter the password each time you pull/push to the repository, you can edit your remote to include the credentials. Example: Your username and password will be encrypted. Someone monitoring the network traffic will notice the domain name only. Note: If using this method, your password will be stored in plain text in the local repository's .git/config file. For this reason, you should create a FreedomBox user who has only access to the gitweb and never use an admin account.
MirroringThough your repositories are primarily hosted on your own FreedomBox, you can configure a repository on another Git hosting system like GitLab as a mirror. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/GitWeb92020-05-30 18:07:40SunilMohanAdapaUpdate the title to emphasize app name over its generic name82020-05-23 19:55:40JamesValleroyadd TableOfContents72020-01-29 06:48:44fioddorInhibit autolink and stress to avoid using admin accounts.62020-01-27 12:42:43VeikoAasa52020-01-27 09:50:21VeikoAasa42019-12-16 23:25:10JamesValleroyadd standard manual page footer32019-12-15 19:38:46DrahtseilCopied description from plinth, managing, access22019-12-14 13:44:36JosephNuthalapatiAdd section: HTTP basic auth12019-12-14 13:14:15JosephNuthalapatiCreate GitWeb page with a stub.
GitWeb (Simple Git Hosting)Git is a distributed version-control system for tracking changes in source code during software development. GitWeb provides a web interface to Git repositories. You can browse history and content of source code, use search to find relevant commits and code. You can also clone repositories and upload code changes with a command-line Git client or with multiple available graphical clients. And you can share your code with people around the world. To learn more on how to use Git visit Git tutorial. Available since version: 19.19
Managing the repositoriesAfter installation of GitWeb, a new repository can be created. It can be marked as private to limit access.
AccessGitWeb can be accessed after installation e.g. by the web client through
HTTP basic authGitWeb on FreedomBox currently supports HTTP remotes only. To avoid having to enter the password each time you pull/push to the repository, you can edit your remote to include the credentials. Example: Your username and password will be encrypted. Someone monitoring the network traffic will notice the domain name only. Note: If using this method, your password will be stored in plain text in the local repository's .git/config file. For this reason, you should create a FreedomBox user who has only access to the gitweb and never use an admin account.
MirroringThough your repositories are primarily hosted on your own FreedomBox, you can configure a repository on another Git hosting system like GitLab as a mirror. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/I2P.raw.xml b/doc/manual/en/I2P.raw.xml index 8497a773f..4199755c9 100644 --- a/doc/manual/en/I2P.raw.xml +++ b/doc/manual/en/I2P.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/I2P12019-04-30 00:40:36SunilMohanAdapaInitial page for I2P application in FreedomBox
Anonymity Network (I2P)
About I2PThe Invisible Internet Project is an anonymous network layer intended to protect communication from censorship and surveillance. I2P provides anonymity by sending encrypted traffic through a volunteer-run network distributed around the world. Find more information about I2P on their project homepage.
Services OfferedThe following services are offered via I2P in FreedomBox by default. Additional services may be available when enabled from I2P router console that can be launched from FreedomBox web interface. Anonymous Internet browsing: I2P can be used to browse Internet anonymously. For this, configure your browser (preferable a Tor Browser) to connect to I2P proxy. This can be done by setting HTTP proxy and HTTPS proxy to freedombox.local (or your FreedomBox's local IP address) and ports to 4444 and 4445 respectively. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. Reaching eepsites: I2P network can host websites that can remain anonymous. These are called eepsites and end with .i2p in their domain name. For example, is the website for I2P project in the I2P network. eepsites are not reachable using a regular browser via regular Internet connection. To browse eepsites, your browser needs to be configured to use HTTP, HTTPS proxies as described above. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. Anonymous torrent downloads: I2PSnark, an application for anonymously downloading and sharing files over the BitTorrent network is available in I2P and enabled by default in FreedomBox. This application is controlled via a web interface that can be launched from 'Anonymous torrents' section of I2P app in FreedomBox web interface or from the I2P router console interface. Only logged-in users belonging to 'Manage I2P application' group can use this service. IRC network: I2P network contains an IRC network called Irc2P. This network hosts the I2P project's official IRC channel among other channels. This service is enabled by default in FreedomBox. To use it, open your favourite IRC client. Then configure it to connect to host freedombox.local (or your FreedomBox's local IP address) with port number 6668. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. I2P router console: This is the central management interface for I2P. It shows the current status of I2P, bandwidth statistics and allows modifying various configuration settings. You can tune your participation in the I2P network and use/edit a list of your favourite I2P sites (eepsites). Only logged-in users belonging to 'Manage I2P application' group can use this service. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
\ No newline at end of file +
FreedomBox/Manual/I2P32020-05-30 18:17:33SunilMohanAdapaUpdate the title to emphasize app name over its generic name22020-05-23 19:59:34JamesValleroyadd TableOfContents12019-04-30 00:40:36SunilMohanAdapaInitial page for I2P application in FreedomBox
I2P (Anonymity Network)
About I2PThe Invisible Internet Project is an anonymous network layer intended to protect communication from censorship and surveillance. I2P provides anonymity by sending encrypted traffic through a volunteer-run network distributed around the world. Find more information about I2P on their project homepage.
Services OfferedThe following services are offered via I2P in FreedomBox by default. Additional services may be available when enabled from I2P router console that can be launched from FreedomBox web interface. Anonymous Internet browsing: I2P can be used to browse Internet anonymously. For this, configure your browser (preferable a Tor Browser) to connect to I2P proxy. This can be done by setting HTTP proxy and HTTPS proxy to freedombox.local (or your FreedomBox's local IP address) and ports to 4444 and 4445 respectively. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. Reaching eepsites: I2P network can host websites that can remain anonymous. These are called eepsites and end with .i2p in their domain name. For example, is the website for I2P project in the I2P network. eepsites are not reachable using a regular browser via regular Internet connection. To browse eepsites, your browser needs to be configured to use HTTP, HTTPS proxies as described above. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. Anonymous torrent downloads: I2PSnark, an application for anonymously downloading and sharing files over the BitTorrent network is available in I2P and enabled by default in FreedomBox. This application is controlled via a web interface that can be launched from 'Anonymous torrents' section of I2P app in FreedomBox web interface or from the I2P router console interface. Only logged-in users belonging to 'Manage I2P application' group can use this service. IRC network: I2P network contains an IRC network called Irc2P. This network hosts the I2P project's official IRC channel among other channels. This service is enabled by default in FreedomBox. To use it, open your favourite IRC client. Then configure it to connect to host freedombox.local (or your FreedomBox's local IP address) with port number 6668. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. I2P router console: This is the central management interface for I2P. It shows the current status of I2P, bandwidth statistics and allows modifying various configuration settings. You can tune your participation in the I2P network and use/edit a list of your favourite I2P sites (eepsites). Only logged-in users belonging to 'Manage I2P application' group can use this service. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
\ No newline at end of file diff --git a/doc/manual/en/Ikiwiki.raw.xml b/doc/manual/en/Ikiwiki.raw.xml index fa6fcf71c..e71ebdbc9 100644 --- a/doc/manual/en/Ikiwiki.raw.xml +++ b/doc/manual/en/Ikiwiki.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Ikiwiki92016-12-26 19:18:01JamesValleroyadd screenshots82016-09-01 19:15:54Drahtseiladapted title to Plinth wording72016-05-26 17:19:45JamesValleroynew section on adding users as wiki admins62016-04-13 01:10:28PhilippeBaretAdded blog to quick start entry in Ikiwiki Manual52016-04-13 01:00:22PhilippeBaretAdded a "Quick Start" entry in Ikiwiki manual42016-04-10 07:21:53PhilippeBaretAdded bottom navigation link32015-12-15 19:54:35PhilippeBaretAdded Ikiwiki definition22015-11-29 19:13:55PhilippeBaretadded ## BEGIN_INCLUDE12015-09-13 17:06:14JamesValleroyadd ikiwiki page for manual
Wiki and Blog (Ikiwiki)
What is Ikiwiki?Ikiwiki converts wiki pages into HTML pages suitable for publishing on a website. It provides particularly blogging, podcasting, calendars and a large selection of plugins.
Quick StartAfter the app installation on your box administration interface: Go to "Create" section and create a wiki or a blog Go back to "Configure" section and click on /ikiwiki link Click on your new wiki or blog name under "Parent directory" Enjoy your new publication page.
Creating a wiki or blogYou can create a wiki or blog to be hosted on your FreedomBox through the Wiki & Blog (Ikiwiki) page in Plinth. The first time you visit this page, it will ask to install packages required by Ikiwiki. After the package install has completed, select the Create tab. You can select the type to be Wiki or Blog. Also type in a name for the wiki or blog, and the username and password for the wiki's/blog's admin account. Then click Update setup and you will see the wiki/blog added to your list. Note that each wiki/blog has its own admin account. ikiwiki: Create
Accessing your wiki or blogFrom the Wiki & Blog (Ikiwiki) page, select the Manage tab and you will see a list of your wikis and blogs. Click a name to navigate to that wiki or blog. ikiwiki: Manage From here, if you click Edit or Preferences, you will be taken to a login page. To log in with the admin account that you created before, select the Other tab, enter the username and password, and click Login.
User login through SSOBesides the wiki/blog admin, other FreedomBox users can be given access to login and edit wikis and blogs. However, they will not have all the same permissions as the wiki admin. They can add or edit pages, but cannot change the wiki's configuration. To add a wiki user, go to the Users and Groups page in Plinth (under System configuration, the gear icon at the top right corner of the page). Create or modify a user, and add them to the wiki group. (Users in the admin group will also have wiki access.) To login as a FreedomBox user, go to the wiki/blog's login page and select the Other tab. Then click the "Login with HTTP auth" button. The browser will show a popup dialog where you can enter the username and password of the FreedomBox user.
Adding FreedomBox users as wiki adminsLogin to the wiki, using the admin account that was specified when the wiki was created. Click "Preferences", then "Setup". Under "main", in the "users who are wiki admins", add the name of a user on the FreedomBox. (Optional) Under "auth plugin: passwordauth", uncheck the "enable passwordauth?" option. (Note: This will disable the old admin account login. Only SSO login using HTTP auth will be possible.) Click "Save Setup". Click "Preferences", then "Logout". Login as the new admin user using "Login with HTTP auth". Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Ikiwiki122020-05-30 18:17:11SunilMohanAdapaUpdate the title to emphasize app name over its generic name112020-05-23 19:59:05JamesValleroyadd TableOfContents102020-05-23 17:06:50JamesValleroyrename plinth -> freedombox92016-12-26 19:18:01JamesValleroyadd screenshots82016-09-01 19:15:54Drahtseiladapted title to Plinth wording72016-05-26 17:19:45JamesValleroynew section on adding users as wiki admins62016-04-13 01:10:28PhilippeBaretAdded blog to quick start entry in Ikiwiki Manual52016-04-13 01:00:22PhilippeBaretAdded a "Quick Start" entry in Ikiwiki manual42016-04-10 07:21:53PhilippeBaretAdded bottom navigation link32015-12-15 19:54:35PhilippeBaretAdded Ikiwiki definition22015-11-29 19:13:55PhilippeBaretadded ## BEGIN_INCLUDE12015-09-13 17:06:14JamesValleroyadd ikiwiki page for manual
Ikiwiki (Wiki and Blog)
What is Ikiwiki?Ikiwiki converts wiki pages into HTML pages suitable for publishing on a website. It provides particularly blogging, podcasting, calendars and a large selection of plugins.
Quick StartAfter the app installation on your box administration interface: Go to "Create" section and create a wiki or a blog Go back to "Configure" section and click on /ikiwiki link Click on your new wiki or blog name under "Parent directory" Enjoy your new publication page.
Creating a wiki or blogYou can create a wiki or blog to be hosted on your FreedomBox through the Wiki & Blog (Ikiwiki) page in FreedomBox. The first time you visit this page, it will ask to install packages required by Ikiwiki. After the package install has completed, select the Create tab. You can select the type to be Wiki or Blog. Also type in a name for the wiki or blog, and the username and password for the wiki's/blog's admin account. Then click Update setup and you will see the wiki/blog added to your list. Note that each wiki/blog has its own admin account. ikiwiki: Create
Accessing your wiki or blogFrom the Wiki & Blog (Ikiwiki) page, select the Manage tab and you will see a list of your wikis and blogs. Click a name to navigate to that wiki or blog. ikiwiki: Manage From here, if you click Edit or Preferences, you will be taken to a login page. To log in with the admin account that you created before, select the Other tab, enter the username and password, and click Login.
User login through SSOBesides the wiki/blog admin, other FreedomBox users can be given access to login and edit wikis and blogs. However, they will not have all the same permissions as the wiki admin. They can add or edit pages, but cannot change the wiki's configuration. To add a wiki user, go to the Users and Groups page in FreedomBox (under System configuration, the gear icon at the top right corner of the page). Create or modify a user, and add them to the wiki group. (Users in the admin group will also have wiki access.) To login as a FreedomBox user, go to the wiki/blog's login page and select the Other tab. Then click the "Login with HTTP auth" button. The browser will show a popup dialog where you can enter the username and password of the FreedomBox user.
Adding FreedomBox users as wiki adminsLogin to the wiki, using the admin account that was specified when the wiki was created. Click "Preferences", then "Setup". Under "main", in the "users who are wiki admins", add the name of a user on the FreedomBox. (Optional) Under "auth plugin: passwordauth", uncheck the "enable passwordauth?" option. (Note: This will disable the old admin account login. Only SSO login using HTTP auth will be possible.) Click "Save Setup". Click "Preferences", then "Logout". Login as the new admin user using "Login with HTTP auth". Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Infinoted.raw.xml b/doc/manual/en/Infinoted.raw.xml index caae3b25b..57a545c4b 100644 --- a/doc/manual/en/Infinoted.raw.xml +++ b/doc/manual/en/Infinoted.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Infinoted12017-01-21 17:23:17JamesValleroycreate page for infinoted
Gobby Server (infinoted)infinoted is a server for Gobby, a collaborative text editor. To use it, download Gobby, desktop client and install it. Then start Gobby and select "Connect to Server" and enter your FreedomBox's domain name.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for infinoted: TCP 6523 Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Infinoted32020-05-30 18:02:02SunilMohanAdapaUpdate the title to emphasize app name over its generic name22020-05-23 19:53:56JamesValleroyadd TableOfContents12017-01-21 17:23:17JamesValleroycreate page for infinoted
infinoted (Gobby Server)infinoted is a server for Gobby, a collaborative text editor. To use it, download Gobby, desktop client and install it. Then start Gobby and select "Connect to Server" and enter your FreedomBox's domain name.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for infinoted: TCP 6523 Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/LetsEncrypt.raw.xml b/doc/manual/en/LetsEncrypt.raw.xml index c3d8391c8..b46b0760b 100644 --- a/doc/manual/en/LetsEncrypt.raw.xml +++ b/doc/manual/en/LetsEncrypt.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/LetsEncrypt102019-11-01 00:51:44JosephNuthalapatiFix attachment inlining92019-02-26 03:21:08JamesValleroyspelling82018-03-11 03:16:47JosephNuthalapati72017-01-19 00:18:41JamesValleroyreplace quote character62017-01-07 19:48:45JamesValleroyadd port forwarding info52017-01-07 18:21:14JamesValleroyclarify step42016-08-21 19:00:07Drahtseil32016-08-21 18:59:20DrahtseilScreencast of the setting up22016-08-21 17:57:07Drahtseilscreenshots12016-08-21 17:43:20DrahtseilCreated Let's Encypt
Certificates (Let's Encrypt)A digital certificate allows users of a web service to verify the identity of the service and to securely communicate with it. FreedomBox can automatically obtain and setup digital certificates for each available domain. It does so by proving itself to be the owner of a domain to Let's Encrypt, a certificate authority (CA). Let's Encrypt is a free, automated, and open certificate authority, run for the public's benefit by the Internet Security Research Group (ISRG). Please read and agree with the Let's Encrypt Subscriber Agreement before using this service.
Why using CertificatesThe communication with your FreedomBox can be secured so that it is not possible to intercept the content of the web pages viewed and about the content exchanged.
How to setupIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports: TCP 80 (http) TCP 443 (https) Make the domain name known: In Configure insert your domain name, e.g. MyWebName.com Let's Encrypt Verify the domain name was accepted Check that it is enabled in Name Services Let's Encrypt Name Services Go to the Certificates (Let's Encrypt) page, and complete the module install if needed. Then click the "Obtain" button for your domain name. After some minutes a valid certificate is available Let's Encrypt Verify in your browser by checking https://MyWebName.com Let's Encrypt Certificate Screencast: Let's Encrypt
UsingThe certificate is valid for 3 months. It is renewed automatically and can also be re-obtained or revoked manually. With running diagnostics the certificate can also be verified. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/LetsEncrypt122020-05-30 18:20:55SunilMohanAdapaUpdate the title to emphasize app name over its generic name112020-05-23 20:42:47JamesValleroyadd TableOfContents102019-11-01 00:51:44JosephNuthalapatiFix attachment inlining92019-02-26 03:21:08JamesValleroyspelling82018-03-11 03:16:47JosephNuthalapati72017-01-19 00:18:41JamesValleroyreplace quote character62017-01-07 19:48:45JamesValleroyadd port forwarding info52017-01-07 18:21:14JamesValleroyclarify step42016-08-21 19:00:07Drahtseil32016-08-21 18:59:20DrahtseilScreencast of the setting up22016-08-21 17:57:07Drahtseilscreenshots12016-08-21 17:43:20DrahtseilCreated Let's Encypt
Let's Encrypt (Certificates)A digital certificate allows users of a web service to verify the identity of the service and to securely communicate with it. FreedomBox can automatically obtain and setup digital certificates for each available domain. It does so by proving itself to be the owner of a domain to Let's Encrypt, a certificate authority (CA). Let's Encrypt is a free, automated, and open certificate authority, run for the public's benefit by the Internet Security Research Group (ISRG). Please read and agree with the Let's Encrypt Subscriber Agreement before using this service.
Why using CertificatesThe communication with your FreedomBox can be secured so that it is not possible to intercept the content of the web pages viewed and about the content exchanged.
How to setupIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports: TCP 80 (http) TCP 443 (https) Make the domain name known: In Configure insert your domain name, e.g. MyWebName.com Let's Encrypt Verify the domain name was accepted Check that it is enabled in Name Services Let's Encrypt Name Services Go to the Certificates (Let's Encrypt) page, and complete the module install if needed. Then click the "Obtain" button for your domain name. After some minutes a valid certificate is available Let's Encrypt Verify in your browser by checking https://MyWebName.com Let's Encrypt Certificate Screencast: Let's Encrypt
UsingThe certificate is valid for 3 months. It is renewed automatically and can also be re-obtained or revoked manually. With running diagnostics the certificate can also be verified. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/MLDonkey.raw.xml b/doc/manual/en/MLDonkey.raw.xml index ded93fb86..9c4d0a27d 100644 --- a/doc/manual/en/MLDonkey.raw.xml +++ b/doc/manual/en/MLDonkey.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/MLDonkey122019-02-08 06:29:35SunilMohanAdapaUpdate more information about clients112019-02-06 13:52:06jcromero102019-02-02 21:16:52jcromero92019-01-23 21:18:05jcromero82019-01-23 18:34:25jcromero72019-01-23 18:30:54jcromero62019-01-23 18:19:19SunilMohanAdapaEscape from linking52019-01-23 18:18:47SunilMohanAdapaWrite MLdonkey as MLDonkey42019-01-23 18:17:54SunilMohanAdapaWrite MLdonkey as MLDonkey and other minor fixes32019-01-23 17:37:32jcromero22019-01-23 13:37:48jcromero12019-01-23 13:31:23jcromero
File Sharing (MLDonkey)
What is MLDonkey?MLDonkey is an open-source, multi-protocol, peer-to-peer file sharing application that runs as a back-end server application on many platforms. It can be controlled through a user interface provided by one of many separate front-ends, including a Web interface, telnet interface and over a dozen native client programs. Originally a Linux client for the eDonkey protocol, it now runs on many flavors of Unix-like, OS X, Microsoft Windows and MorphOS and supports numerous peer-to-peer protocols including ED2K (and Kademlia and Overnet), BitTorrent, DC++ and more. Read more about MLDonkey at the MLDonkey Project Wiki Available since: version 0.48.0
ScreenshotMLDonkey Web Interface
Using MLDonkey Web InterfaceAfter installing MLDonkey, its web interface can be accessed from FreedomBox at https://<your freedombox>/mldonkey. Users belonging to the ed2k and admin groups can access this web interface.
Using Desktop/Mobile InterfaceMany desktop and mobile applications can be used to control MLDonkey. MLDonkey server will always be running on FreedomBox. It will download files (or upload them) and store them on FreedomBox even when your local machine is not running or connected to MLDonkey on FreedomBox. Only users of admin group can access MLDonkey on FreedomBox using desktop or mobile clients. This is due to restrictions on which group of users have SSH access into FreedomBox. Create an admin user or use an existing admin user. On your desktop machine, open a terminal and run the following command. It is recommended that you configure and use SSH keys instead of passwords for the this step. Start the GUI application and then connect it to MLDonkey as if MLDonkey is running on the local desktop machine. After you are done, terminate the SSH command by pressing Control-C. See MLDonkey documentation for SSH Tunnel for more information. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/MLDonkey142020-05-30 18:00:14SunilMohanAdapaUpdate the title to emphasize app name over its generic name132020-05-23 19:52:41JamesValleroyadd TableOfContents122019-02-08 06:29:35SunilMohanAdapaUpdate more information about clients112019-02-06 13:52:06jcromero102019-02-02 21:16:52jcromero92019-01-23 21:18:05jcromero82019-01-23 18:34:25jcromero72019-01-23 18:30:54jcromero62019-01-23 18:19:19SunilMohanAdapaEscape from linking52019-01-23 18:18:47SunilMohanAdapaWrite MLdonkey as MLDonkey42019-01-23 18:17:54SunilMohanAdapaWrite MLdonkey as MLDonkey and other minor fixes32019-01-23 17:37:32jcromero22019-01-23 13:37:48jcromero12019-01-23 13:31:23jcromero
MLDonkey (Peer-to-peer File Sharing)
What is MLDonkey?MLDonkey is an open-source, multi-protocol, peer-to-peer file sharing application that runs as a back-end server application on many platforms. It can be controlled through a user interface provided by one of many separate front-ends, including a Web interface, telnet interface and over a dozen native client programs. Originally a Linux client for the eDonkey protocol, it now runs on many flavors of Unix-like, OS X, Microsoft Windows and MorphOS and supports numerous peer-to-peer protocols including ED2K (and Kademlia and Overnet), BitTorrent, DC++ and more. Read more about MLDonkey at the MLDonkey Project Wiki Available since: version 0.48.0
ScreenshotMLDonkey Web Interface
Using MLDonkey Web InterfaceAfter installing MLDonkey, its web interface can be accessed from FreedomBox at https://<your freedombox>/mldonkey. Users belonging to the ed2k and admin groups can access this web interface.
Using Desktop/Mobile InterfaceMany desktop and mobile applications can be used to control MLDonkey. MLDonkey server will always be running on FreedomBox. It will download files (or upload them) and store them on FreedomBox even when your local machine is not running or connected to MLDonkey on FreedomBox. Only users of admin group can access MLDonkey on FreedomBox using desktop or mobile clients. This is due to restrictions on which group of users have SSH access into FreedomBox. Create an admin user or use an existing admin user. On your desktop machine, open a terminal and run the following command. It is recommended that you configure and use SSH keys instead of passwords for the this step. Start the GUI application and then connect it to MLDonkey as if MLDonkey is running on the local desktop machine. After you are done, terminate the SSH command by pressing Control-C. See MLDonkey documentation for SSH Tunnel for more information. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/MatrixSynapse.raw.xml b/doc/manual/en/MatrixSynapse.raw.xml index 990f270a5..d13104874 100644 --- a/doc/manual/en/MatrixSynapse.raw.xml +++ b/doc/manual/en/MatrixSynapse.raw.xml @@ -1,7 +1,7 @@ -
FreedomBox/Manual/MatrixSynapse172020-03-21 20:17:34DrahtseilClearer explanation of users activated. Add port forwarding162020-01-03 23:07:19JamesValleroyminor spelling fix152020-01-03 12:47:36fioddorMinor correction142020-01-03 12:46:45fioddorMinor clarifications132019-12-27 15:42:46chkmue122019-10-07 23:01:22JamesValleroyfix spelling112019-09-25 18:31:37SunilMohanAdapaAdd section for advanced administration commands102019-03-01 17:53:22JosephNuthalapatiEscape FreedomBox hyperlinks92019-02-27 21:16:58JosephNuthalapatiMention IRC as an alternative for large Matrix rooms82019-02-13 09:09:45JosephNuthalapatiRemove pop-culture references. Add notes about large rooms and memory usage.72019-01-14 20:16:04DrahtseilSystem requirements62018-03-02 12:06:08JosephNuthalapati52018-03-02 10:44:12JosephNuthalapatiNaming was inconsistent42017-06-27 05:13:41JosephNuthalapati32017-03-24 06:42:49SunilMohanAdapaUpdate for explaining more features etc.22017-03-23 06:36:05rahulde12017-03-23 06:33:43rahulde
Chat Server (Matrix Synapse)
What is Matrix?Matrix is an open standard for interoperable, decentralized, real-time communication over IP. Synapse is the reference implementation of a Matrix server. It can be used to setup instant messaging on FreedomBox to host large chat rooms, end-to-end encrypted communication and audio/video calls. Matrix Synapse is a federated application where chat rooms can exist on any server and users from any server in the federated network can join them. Learn more about Matrix. Available since: version 0.14.0
How to access your Matrix Synapse server?We recommend the Riot client to access the Matrix Synapse server. You can download Riot for desktops. Mobile applications for Android and iOS are available from their respective app stores.
Setting up Matrix Synapse on your FreedomBoxTo enable Matrix, first navigate to the Chat Server (Matrix Synapse) page and install it. Matrix needs a valid domain name to be configured. After installation, you will be asked to configure it. You will be able to select a domain from a drop down menu of available domains. Domains are configured using System -> Configure page. After configuring a domain, you will see that the service is running. The service will be accessible on the configured FreedomBox domain. Currently, you will not be able to change the domain once is it configured. Your router has to be configured to forward port 8448. All the registered users of your FreedomBox will have their Matrix IDs as @username:domain. If public registration is enabled, also your chosen client can be used to register a user account.
Federating with other Matrix instancesYou will be able to interact with any other person running another Matrix instance. This is done by simply starting a conversation with them using their matrix ID which is of the format @their-username:their-domain. You can also join rooms which are in another server and have audio/video calls with contacts on other server.
Memory usageThe Synapse reference server implemented in Python is known to be quite RAM hungry, especially when loading large rooms with thousands of members like #matrix:matrix.org. It is recommended to avoid joining such rooms if your FreedomBox device only has 1 GiB RAM or less. Rooms with up to a hundred members should be safe to join. The Matrix team is working on a new implementation of the Matrix server written in Go called Dendrite which might perform better in low-memory environments. Some large public rooms in the Matrix network are also available as IRC channels (e.g. #freedombox:matrix.org is also available as #freedombox on irc.debian.org). It is better to use IRC instead of Matrix for such large rooms. You can join the IRC channels using Quassel.
Advanced usageIf you wish to create a large number of users on your Matrix Synapse server, use the following commands on a remote shell as root user: /etc/matrix-synapse/conf.d/registration_shared_secret.yaml +
FreedomBox/Manual/MatrixSynapse192020-05-30 17:56:34SunilMohanAdapaUpdate the title to emphasize app name over its generic name182020-05-23 19:50:39JamesValleroyadd TableOfContents172020-03-21 20:17:34DrahtseilClearer explanation of users activated. Add port forwarding162020-01-03 23:07:19JamesValleroyminor spelling fix152020-01-03 12:47:36fioddorMinor correction142020-01-03 12:46:45fioddorMinor clarifications132019-12-27 15:42:46chkmue122019-10-07 23:01:22JamesValleroyfix spelling112019-09-25 18:31:37SunilMohanAdapaAdd section for advanced administration commands102019-03-01 17:53:22JosephNuthalapatiEscape FreedomBox hyperlinks92019-02-27 21:16:58JosephNuthalapatiMention IRC as an alternative for large Matrix rooms82019-02-13 09:09:45JosephNuthalapatiRemove pop-culture references. Add notes about large rooms and memory usage.72019-01-14 20:16:04DrahtseilSystem requirements62018-03-02 12:06:08JosephNuthalapati52018-03-02 10:44:12JosephNuthalapatiNaming was inconsistent42017-06-27 05:13:41JosephNuthalapati32017-03-24 06:42:49SunilMohanAdapaUpdate for explaining more features etc.22017-03-23 06:36:05rahulde12017-03-23 06:33:43rahulde
Matrix Synapse (Chat Server)
What is Matrix?Matrix is an open standard for interoperable, decentralized, real-time communication over IP. Synapse is the reference implementation of a Matrix server. It can be used to setup instant messaging on FreedomBox to host large chat rooms, end-to-end encrypted communication and audio/video calls. Matrix Synapse is a federated application where chat rooms can exist on any server and users from any server in the federated network can join them. Learn more about Matrix. Available since: version 0.14.0
How to access your Matrix Synapse server?We recommend the Riot client to access the Matrix Synapse server. You can download Riot for desktops. Mobile applications for Android and iOS are available from their respective app stores.
Setting up Matrix Synapse on your FreedomBoxTo enable Matrix, first navigate to the Chat Server (Matrix Synapse) page and install it. Matrix needs a valid domain name to be configured. After installation, you will be asked to configure it. You will be able to select a domain from a drop down menu of available domains. Domains are configured using System -> Configure page. After configuring a domain, you will see that the service is running. The service will be accessible on the configured FreedomBox domain. Currently, you will not be able to change the domain once is it configured. Your router has to be configured to forward port 8448. All the registered users of your FreedomBox will have their Matrix IDs as @username:domain. If public registration is enabled, also your chosen client can be used to register a user account.
Federating with other Matrix instancesYou will be able to interact with any other person running another Matrix instance. This is done by simply starting a conversation with them using their matrix ID which is of the format @their-username:their-domain. You can also join rooms which are in another server and have audio/video calls with contacts on other server.
Memory usageThe Synapse reference server implemented in Python is known to be quite RAM hungry, especially when loading large rooms with thousands of members like #matrix:matrix.org. It is recommended to avoid joining such rooms if your FreedomBox device only has 1 GiB RAM or less. Rooms with up to a hundred members should be safe to join. The Matrix team is working on a new implementation of the Matrix server written in Go called Dendrite which might perform better in low-memory environments. Some large public rooms in the Matrix network are also available as IRC channels (e.g. #freedombox:matrix.org is also available as #freedombox on irc.debian.org). It is better to use IRC instead of Matrix for such large rooms. You can join the IRC channels using Quassel.
Advanced usageIf you wish to create a large number of users on your Matrix Synapse server, use the following commands on a remote shell as root user: /etc/matrix-synapse/conf.d/registration_shared_secret.yaml chmod 600 /etc/matrix-synapse/conf.d/registration_shared_secret.yaml chown matrix-synapse:nogroup /etc/matrix-synapse/conf.d/registration_shared_secret.yaml systemctl restart matrix-synapse register_new_matrix_user -c /etc/matrix-synapse/conf.d/registration_shared_secret.yaml]]>If you wish to see the list of users registered in Matrix Synapse, the following as root user: If you wish to create a community in Matrix Synapse, a Matrix user with server admin privileges is needed. In order to grant such privileges to username run the following commands as root user: Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +echo "UPDATE users SET admin=1 WHERE name='@username:domainname'" | sudo sqlite3 /var/lib/matrix-synapse/homeserver.db ]]>
Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/MediaWiki.raw.xml b/doc/manual/en/MediaWiki.raw.xml index 900fcc3ed..924d811fa 100644 --- a/doc/manual/en/MediaWiki.raw.xml +++ b/doc/manual/en/MediaWiki.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/MediaWiki142020-04-12 16:05:09JamesValleroyadd links back to top level pages132020-01-24 11:40:30JosephNuthalapatiAdd screenshot of editor toolbar122020-01-24 11:38:30JosephNuthalapatiMention the default wiki editor in "Editing Wiki content"112020-01-21 08:09:53fioddorCustomization section moved at the end because the others are more generic.102020-01-18 09:41:15JosephNuthalapatiAdd customization section92018-08-28 09:42:01JosephNuthalapatiRemove internal links to MediaWiki82018-08-27 23:58:16JamesValleroytry to close last section72018-08-27 23:43:48JamesValleroyadd consistent newlines after headings62018-08-27 23:41:37JamesValleroyspelling52018-08-21 07:33:32JosephNuthalapati42018-08-21 07:32:43JosephNuthalapatiUpdate wiki to include new features32018-01-31 06:02:30SunilMohanAdapaAdd footer and category22018-01-17 10:26:45JosephNuthalapatiFix headings12018-01-13 04:01:22JosephNuthalapatiNew wiki entry for MediaWiki on FreedomBox
Wiki (MediaWiki)
About MediaWikiMediaWiki is the software that powers the Wikimedia suite of wikis. Read more about MediaWiki on Wikipedia Available since: version 0.20.0
MediaWiki on FreedomBoxMediaWiki on FreedomBox is configured to be publicly readable and privately editable. Only logged in users can make edits to the wiki. This configuration prevents spam and vandalism on the wiki.
User managementUsers can be created by the MediaWiki administrator (user "admin") only. The "admin" user can also be used to reset passwords of MediaWiki users. The administrator password, if forgotten can be reset anytime from the MediaWiki app page in web interface.
Use casesMediaWiki is quite versatile and can be put to many creative uses. It also comes with a lot of plugins and themes and is highly customizable.
Personal Knowledge RepositoryMediaWiki on FreedomBox can be your own personal knowledge repository. Since MediaWiki has good multimedia support, you can write notes, store images, create checklists, store references and bookmarks etc. in an organized manner. You can store the knowledge of a lifetime in your MediaWiki instance.
Community WikiA community of users can use MediaWiki as their common repository of knowledge and reference material. It can used as a college notice board, documentation server for a small company, common notebook for study groups or as a fan wiki like wikia.
Personal Wiki-based WebsiteSeveral websites on the internet are simply MediaWiki instances. MediaWiki on FreedomBox is read-only to visitors. Hence, it can be adapted to serve as your personal website and/or blog. MediaWiki content is easy to export and can be later moved to use another blog engine.
Editing Wiki ContentThe MediaWiki installation on FreedomBox ships with a basic editor with a toolbar for common options like Bold, Italics etc. Click on the Advanced section for more options like Headings, bullet lists etc. mediawiki-toolbar.png
Visual EditorMediaWiki's new Visual Editor gives a WYSIWYG user interface to creating wiki pages. This is still a Beta feature and is not provided by default with MediaWiki. A workaround is to use write your content using the Visual Editor in Wikipedia's Sandbox, switching to source editing mode and copying the content into your wiki.
Other FormatsYou don't have to necessarily learn the MediaWiki formatting language. You can write in your favorite format (Markdown, Org-mode, LaTeX etc.) and convert it to the MediaWiki format using Pandoc.
Image UploadsImage uploads have been enabled since FreedomBox version 0.36.0. You can also directly use images from Wikimedia Commons using a feature called Instant Commons.
Customization
SkinsMediaWiki's default skin is usually Vector. The default skin set by FreedomBox is Timeless. Vector is a skin best-suited for viewing on desktop browsers. It is not suitable for mobile screen sizes. Wikimedia sites host a separate mobile site. It is not worth hosting a separate mobile site for small MediaWiki installations like those on FreedomBox. Using a mobile-friendly skin like Timeless is a cheaper way of solving the problem. Administrators can choose a default skin from the app configuration. Users of the site also have the choice of viewing it with a different skin. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/MediaWiki162020-05-30 18:12:57SunilMohanAdapaUpdate the title to emphasize app name over its generic name152020-05-23 19:58:35JamesValleroyadd TableOfContents142020-04-12 16:05:09JamesValleroyadd links back to top level pages132020-01-24 11:40:30JosephNuthalapatiAdd screenshot of editor toolbar122020-01-24 11:38:30JosephNuthalapatiMention the default wiki editor in "Editing Wiki content"112020-01-21 08:09:53fioddorCustomization section moved at the end because the others are more generic.102020-01-18 09:41:15JosephNuthalapatiAdd customization section92018-08-28 09:42:01JosephNuthalapatiRemove internal links to MediaWiki82018-08-27 23:58:16JamesValleroytry to close last section72018-08-27 23:43:48JamesValleroyadd consistent newlines after headings62018-08-27 23:41:37JamesValleroyspelling52018-08-21 07:33:32JosephNuthalapati42018-08-21 07:32:43JosephNuthalapatiUpdate wiki to include new features32018-01-31 06:02:30SunilMohanAdapaAdd footer and category22018-01-17 10:26:45JosephNuthalapatiFix headings12018-01-13 04:01:22JosephNuthalapatiNew wiki entry for MediaWiki on FreedomBox
MediaWiki (Wiki)
About MediaWikiMediaWiki is the software that powers the Wikimedia suite of wikis. Read more about MediaWiki on Wikipedia Available since: version 0.20.0
MediaWiki on FreedomBoxMediaWiki on FreedomBox is configured to be publicly readable and privately editable. Only logged in users can make edits to the wiki. This configuration prevents spam and vandalism on the wiki.
User managementUsers can be created by the MediaWiki administrator (user "admin") only. The "admin" user can also be used to reset passwords of MediaWiki users. The administrator password, if forgotten can be reset anytime from the MediaWiki app page in web interface.
Use casesMediaWiki is quite versatile and can be put to many creative uses. It also comes with a lot of plugins and themes and is highly customizable.
Personal Knowledge RepositoryMediaWiki on FreedomBox can be your own personal knowledge repository. Since MediaWiki has good multimedia support, you can write notes, store images, create checklists, store references and bookmarks etc. in an organized manner. You can store the knowledge of a lifetime in your MediaWiki instance.
Community WikiA community of users can use MediaWiki as their common repository of knowledge and reference material. It can used as a college notice board, documentation server for a small company, common notebook for study groups or as a fan wiki like wikia.
Personal Wiki-based WebsiteSeveral websites on the internet are simply MediaWiki instances. MediaWiki on FreedomBox is read-only to visitors. Hence, it can be adapted to serve as your personal website and/or blog. MediaWiki content is easy to export and can be later moved to use another blog engine.
Editing Wiki ContentThe MediaWiki installation on FreedomBox ships with a basic editor with a toolbar for common options like Bold, Italics etc. Click on the Advanced section for more options like Headings, bullet lists etc. mediawiki-toolbar.png
Visual EditorMediaWiki's new Visual Editor gives a WYSIWYG user interface to creating wiki pages. This is still a Beta feature and is not provided by default with MediaWiki. A workaround is to use write your content using the Visual Editor in Wikipedia's Sandbox, switching to source editing mode and copying the content into your wiki.
Other FormatsYou don't have to necessarily learn the MediaWiki formatting language. You can write in your favorite format (Markdown, Org-mode, LaTeX etc.) and convert it to the MediaWiki format using Pandoc.
Image UploadsImage uploads have been enabled since FreedomBox version 0.36.0. You can also directly use images from Wikimedia Commons using a feature called Instant Commons.
Customization
SkinsMediaWiki's default skin is usually Vector. The default skin set by FreedomBox is Timeless. Vector is a skin best-suited for viewing on desktop browsers. It is not suitable for mobile screen sizes. Wikimedia sites host a separate mobile site. It is not worth hosting a separate mobile site for small MediaWiki installations like those on FreedomBox. Using a mobile-friendly skin like Timeless is a cheaper way of solving the problem. Administrators can choose a default skin from the app configuration. Users of the site also have the choice of viewing it with a different skin. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Minetest.raw.xml b/doc/manual/en/Minetest.raw.xml index eeebc08bd..aedfa519f 100644 --- a/doc/manual/en/Minetest.raw.xml +++ b/doc/manual/en/Minetest.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Minetest42020-05-03 18:37:00JamesValleroyuse https link32017-01-02 13:29:19JamesValleroyfix list22017-01-02 13:26:03JamesValleroyadd port forwarding info12016-09-04 10:20:44Drahtseilstub created
Block Sandbox (Minetest)Minetest is a multiplayer infinite-world block sandbox. This module enables the Minetest server to be run on this FreedomBox, on the default port (30000). To connect to the server, a Minetest client is needed.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Minetest: UDP 30000 Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Minetest62020-05-30 17:54:28SunilMohanAdapaUpdate the title to emphasize app name over its generic name52020-05-23 19:49:18JamesValleroyadd TableOfContents42020-05-03 18:37:00JamesValleroyuse https link32017-01-02 13:29:19JamesValleroyfix list22017-01-02 13:26:03JamesValleroyadd port forwarding info12016-09-04 10:20:44Drahtseilstub created
Minetest (Block Sandbox)Minetest is a multiplayer infinite-world block sandbox. This module enables the Minetest server to be run on this FreedomBox, on the default port (30000). To connect to the server, a Minetest client is needed.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Minetest: UDP 30000 Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/MiniDLNA.raw.xml b/doc/manual/en/MiniDLNA.raw.xml index 899e050b9..a69b4e63b 100644 --- a/doc/manual/en/MiniDLNA.raw.xml +++ b/doc/manual/en/MiniDLNA.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/MiniDLNA22019-11-21 20:18:10NektariosKatakis12019-11-20 16:49:59NektariosKatakis
MiniDLNAMiniDLNA is a media server with the aim to be compliant with DLNA/UPnP clients.
What is UPnP/DLNA?Universal plug & play is a set of networking protocols that allow devices within a network such as PCs, TVs, printers etc. to seamlessly discover each other and establish communication for data sharing. It is zero configuration protocol and requires only a media server and a media player that are compliant with the protocol. DLNA is derived from UPnP as a form of standardizing media interoperability. It forms a standard/certification which many consumer electronics conform to.
Setting up MiniDLNA on your FreedomBox.To install/enable the media server you need to navigate at MiniDLNA page and enable it. The application is intended to be available in the internal (home) network and therefore it requires a network interface configured for internal traffic. After installation a web page becomes available on . It includes information for how many files the server is detecting, how many connections exist etc. This is very useful if plugging external disks with media to check if the new media files are detected properly. If that is not happening, disabling and enabling the server will fix it.
File systems for external drives.If using an external drive that is used also from a Windows system the preferred filesystem should be NTFS. NTFS will keep Linux file permissions and UTF8 encoding for file names. This is useful if file names are in your language.
External links Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/MiniDLNA82020-05-30 18:05:07SunilMohanAdapaUpdate the title to emphasize app name over its generic name72020-05-27 00:16:26SunilMohanAdapaAdd section on supported file formats62020-05-26 22:31:38SunilMohanAdapaMinor styling52020-05-26 22:29:28SunilMohanAdapaAdd information about how to use in various devices/media players42020-05-26 04:51:58SunilMohanAdapaAdd note about not being available on OpenVPN32020-05-23 19:54:42JamesValleroyadd TableOfContents22019-11-21 20:18:10NektariosKatakis12019-11-20 16:49:59NektariosKatakis
MiniDLNA (Simple Media Server)MiniDLNA is a media server with the aim to be compliant with DLNA/UPnP clients. Note: This service is available only on networks configured as "internal" zone. It is not available when connected via OpenVPN.
What is UPnP/DLNA?Universal plug & play is a set of networking protocols that allow devices within a network such as PCs, TVs, printers etc. to seamlessly discover each other and establish communication for data sharing. It is zero configuration protocol and requires only a media server and a media player that are compliant with the protocol. DLNA is derived from UPnP as a form of standardizing media interoperability. It forms a standard/certification which many consumer electronics conform to.
Setting up MiniDLNA on your FreedomBoxTo install/enable the media server you need to navigate at MiniDLNA page and enable it. The application is intended to be available in the internal (home) network and therefore it requires a network interface configured for internal traffic. After installation a web page becomes available on . It includes information for how many files the server is detecting, how many connections exist etc. This is very useful if plugging external disks with media to check if the new media files are detected properly. If that is not happening, disabling and enabling the server will fix it.
Using MiniDLNA to play media on your devicesAny DLNA compliant device or media player should be able to automatically detect, browse and play media from MiniDLNA on FreedomBox. The following devices and media players have been tested: GNOME Videos: Videos is the default media player on the popular GNU/Linux desktop environment GNOME. Open Videos, switch to 'Channels'. You should see a channel named 'freedombox: minidlna'. You will be able to browse and play media from it. VLC media player: VLC is a very popular media player for GNU/Linux, Android, Windows and macOS. Open VLC and click on 'View -> Playlist'. In the playlist sidebar that appears, select 'Universal Plug'n'Play'. You should see an item named 'freedombox: minidlna'. You should be able to browse and play media from it. Kodi: Kodi is a popular media centre software with user interface designed for Televisions. Open Kodi, goto 'System -> Service settings -> UPnP/DLNA' and 'Enable UPnP support'. Then visit 'Home -> Videos -> Files -> Add videos... -> Browse -> UPnP devices'. You should see 'freedombox: minidlna'. Select it and choose 'OK'. Then choose 'OK in the 'Add video source' dialog. From now on, you should see 'freedombox: minidlna' in 'Videos -> Files' section. You should be able to browse and play media from it. See Kodi documentation for more information. Roku: Roku is an appliance connected to a TV for playing Internet streaming services. Many TVs also have Roku built into them. In Roku interface, find a channel called 'Roku Media Player' and open it. You should see an item called 'freedombox: minidlna'. You should be able to browse and play media from it. Rhythmbox: Rhythmbox is the default audio player on the popular GNU/Linux desktop environment GNOME. Open Rhythmbox and ensure that the side pane is open by clicking on 'Application menu -> View -> Side Pane'. In the side pane you should see 'freedombox:minidlna' under the 'Shared' section. You should be able to browse and play audio files from it. Video files will not show up.
Supported media formatsMiniDLNA supports a wide variety of video and audio file formats. Video: Files ending with .avi, .mp4, .mkv, .mpg, .mpeg, .wmv, .m4v, .flv, .mov, .3gp, etc. Audio: Files ending with .mp3, .ogg, .flac, .wav, .pcm, .wma, .fla, .aac, etc. Image: Files ending with .jpg, .jpeg Playlist: Files ending with .m3u, .pls Captions: Files ending with .srt, .smi Notably, it does not support the following file extensions. Renaming the file to a known extension seems to work in most cases. Video: Files ending with .webm In addition to file format support from MiniDLNA, your media player or device needs to support the audio/video codecs with which the media has been encoded. MiniDLNA does not have the ability to translate files into a codec understood by the player. If you face problems with media playback, use the VLC player to find the codecs used in the media and the check your device or media player documentation on whether the codecs are supported.
File systems for external drivesIf using an external drive that is used also from a Windows system the preferred filesystem should be NTFS. NTFS will keep Linux file permissions and UTF8 encoding for file names. This is useful if file names are in your language.
External links Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Monkeysphere.raw.xml b/doc/manual/en/Monkeysphere.raw.xml index b60e2a413..255d7fa65 100644 --- a/doc/manual/en/Monkeysphere.raw.xml +++ b/doc/manual/en/Monkeysphere.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Monkeysphere12016-09-04 10:12:10Drahtseilstub created
MonkeysphereWith Monkeysphere, an OpenPGP key can be generated for each configured domain serving SSH. The OpenPGP public key can then be uploaded to the OpenPGP keyservers. Users connecting to this machine through SSH can verify that they are connecting to the correct host. For users to trust the key, at least one person (usually the machine owner) must sign the key using the regular OpenPGP key signing process. See the Monkeysphere SSH documentation for more details. Monkeysphere can also generate an OpenPGP key for each Secure Web Server (HTTPS) certificate installed on this machine. The OpenPGP public key can then be uploaded to the OpenPGP keyservers. Users accessing the web server through HTTPS can verify that they are connecting to the correct host. To validate the certificate, the user will need to install some software that is available on the Monkeysphere website. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Monkeysphere12016-09-04 10:12:10Drahtseilstub created
MonkeysphereWith Monkeysphere, an OpenPGP key can be generated for each configured domain serving SSH. The OpenPGP public key can then be uploaded to the OpenPGP keyservers. Users connecting to this machine through SSH can verify that they are connecting to the correct host. For users to trust the key, at least one person (usually the machine owner) must sign the key using the regular OpenPGP key signing process. See the Monkeysphere SSH documentation for more details. Monkeysphere can also generate an OpenPGP key for each Secure Web Server (HTTPS) certificate installed on this machine. The OpenPGP public key can then be uploaded to the OpenPGP keyservers. Users accessing the web server through HTTPS can verify that they are connecting to the correct host. To validate the certificate, the user will need to install some software that is available on the Monkeysphere website. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Mumble.raw.xml b/doc/manual/en/Mumble.raw.xml index 9b849a777..19a5e1f2e 100644 --- a/doc/manual/en/Mumble.raw.xml +++ b/doc/manual/en/Mumble.raw.xml @@ -1,2 +1,2 @@ -
FreedomBox/Manual/Mumble92019-11-07 03:25:36SunilMohanAdapaUpdate super user section82019-11-07 02:51:23SunilMohanAdapaMinor formatting72019-11-07 02:50:58SunilMohanAdapaAdded section about SuperUser account62017-01-02 13:28:53JamesValleroyadd port forwarding info52016-12-31 04:04:56JamesValleroyadd basic usage info42016-09-01 19:14:55Drahtseiladapted title to Plinth wording32016-04-10 07:20:42PhilippeBaretAdded bottom navigation link22015-12-15 20:51:58PhilippeBaret12015-12-15 20:06:18PhilippeBaretAdded Mumble page and definition.
Voice Chat (Mumble)
What is Mumble?Mumble is a voice chat software. Primarily intended for use while gaming, it is suitable for simple talking with high audio quality, noise suppression, encrypted communication, public/private-key authentication by default, and "wizards" to configure your microphone for instance. A user can be marked as a "priority speaker" within a channel.
Using MumbleFreedomBox includes the Mumble server. Clients are available for desktop and mobile platforms. Users can download one of these clients and connect to the server.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Mumble: TCP 64738 UDP 64738
Managing PermissionsA super user in Mumble has the ability to create administrator accounts who can in turn manage groups and channel permissions. This can be done after logging in with the username "SuperUser" using the super user password. See Mumble Guide for information on how to do this.. FreedomBox currently does not offer a UI to get or set the super user password for Mumble. A super user password is automatically generated during Mumble setup. To get the password, login to the terminal as admin user using Cockpit , Secure Shell or the console. Then, to read the super user password that was automatically generated during Mumble installation run the following command: You should see output such as: 2019-11-06 02:47:41.313 1 => Password for 'SuperUser' set to 'noo8Dahwiesh']]>Alternatively, you can set a new password as follows: Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Mumble112020-05-30 18:10:11SunilMohanAdapaUpdate the title to emphasize app name over its generic name102020-05-23 19:57:23JamesValleroyadd TableOfContents92019-11-07 03:25:36SunilMohanAdapaUpdate super user section82019-11-07 02:51:23SunilMohanAdapaMinor formatting72019-11-07 02:50:58SunilMohanAdapaAdded section about SuperUser account62017-01-02 13:28:53JamesValleroyadd port forwarding info52016-12-31 04:04:56JamesValleroyadd basic usage info42016-09-01 19:14:55Drahtseiladapted title to Plinth wording32016-04-10 07:20:42PhilippeBaretAdded bottom navigation link22015-12-15 20:51:58PhilippeBaret12015-12-15 20:06:18PhilippeBaretAdded Mumble page and definition.
Mumble (Voice Chat)
What is Mumble?Mumble is a voice chat software. Primarily intended for use while gaming, it is suitable for simple talking with high audio quality, noise suppression, encrypted communication, public/private-key authentication by default, and "wizards" to configure your microphone for instance. A user can be marked as a "priority speaker" within a channel.
Using MumbleFreedomBox includes the Mumble server. Clients are available for desktop and mobile platforms. Users can download one of these clients and connect to the server.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Mumble: TCP 64738 UDP 64738
Managing PermissionsA super user in Mumble has the ability to create administrator accounts who can in turn manage groups and channel permissions. This can be done after logging in with the username "SuperUser" using the super user password. See Mumble Guide for information on how to do this.. FreedomBox currently does not offer a UI to get or set the super user password for Mumble. A super user password is automatically generated during Mumble setup. To get the password, login to the terminal as admin user using Cockpit , Secure Shell or the console. Then, to read the super user password that was automatically generated during Mumble installation run the following command: You should see output such as: 2019-11-06 02:47:41.313 1 => Password for 'SuperUser' set to 'noo8Dahwiesh']]>Alternatively, you can set a new password as follows: Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/NameServices.raw.xml b/doc/manual/en/NameServices.raw.xml index f0336ca96..3f904010c 100644 --- a/doc/manual/en/NameServices.raw.xml +++ b/doc/manual/en/NameServices.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/NameServices42019-11-11 16:58:04JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service32016-12-31 04:18:51JamesValleroyreword22016-08-21 17:16:56Drahtseil12016-08-21 17:16:41DrahtseilCreated NameServices
Name ServicesName Services provides an overview of ways the box can be reached from the public Internet: domain name, Tor Onion Service, and Pagekite. For each type of name, it is shown whether the HTTP, HTTPS, and SSH services are enabled or disabled for incoming connections through the given name. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/NameServices42019-11-11 16:58:04JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service32016-12-31 04:18:51JamesValleroyreword22016-08-21 17:16:56Drahtseil12016-08-21 17:16:41DrahtseilCreated NameServices
Name ServicesName Services provides an overview of ways the box can be reached from the public Internet: domain name, Tor Onion Service, and Pagekite. For each type of name, it is shown whether the HTTP, HTTPS, and SSH services are enabled or disabled for incoming connections through the given name. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Networks.raw.xml b/doc/manual/en/Networks.raw.xml index 95c99224a..5452989e7 100644 --- a/doc/manual/en/Networks.raw.xml +++ b/doc/manual/en/Networks.raw.xml @@ -1,5 +1,5 @@ -
FreedomBox/Manual/Networks102020-04-12 16:05:59JamesValleroyadd links back to top level pages92019-06-21 17:52:50SunilMohanAdapaAdd information about Wi-Fi routers causing problem with privacy feature82017-03-31 20:04:48DrahtseilScreenshot Network Single72017-03-02 16:26:27AaronFerrucciCorrected a few typos62016-09-02 05:31:28SunilMohanAdapaAdd information about configuring BATMAN-Adv Mesh network52016-03-06 20:43:34PhilippeBaretText correction42015-09-13 15:04:43SunilMohanAdapaDemote headings one level for inclusion into manual32015-09-12 11:23:58SunilMohanAdapaUpdate link to renamed Firewall page22015-09-12 10:04:19SunilMohanAdapaAdd information about Internet connection sharing12015-09-12 09:24:59SunilMohanAdapaNew page for FreedomBox manual on networking
NetworksThis section describes how networking is setup by default in FreedomBox and how you can customize it. See also the Firewall section for more information on how firewall works.
Default setupIn a fresh image of FreedomBox, network is not configured at all. When the image is written to an SD card and the device boots, configuration is done. During first boot, FreedomBox setup package detects the networks interfaces and tries to automatically configure them so that FreedomBox is available for further configuration via the web interface from another machine without the need to connect a monitor. Automatic configuration also tries to make FreedomBox useful, out of the box, for the most important scenarios FreedomBox is used for. There are two scenarios it handles: when is a single ethernet interface and when there are multiple ethernet interfaces.
Single ethernet interfaceWhen there is only single ethernet interface available on the hardware device, there is not much scope for it to play the role of a router. In this case, the device is assumed to be just another machine in the network. Accordingly, the only available interface is configured to be an internal interface in automatic configuration mode. This means that it connects to the Internet using the configuration provided by a router in the network and also makes all (internal and external) of its services available to all the clients on this network. network_single.png
Multiple ethernet interfaceWhen there are multiple ethernet interfaces available on the hardware device, the device can act as a router. The interfaces are then configured to perform this function. The first network interface is configured to be an WAN or external interface in automatic configuration mode. This means that it connects to the Internet using network configuration provided by the Internet Service Provider (ISP). Only services that are meant to be provided across the entire Internet (external services) will be exposed on this interface. You must plug your Internet connection into the port of this ethernet interface. If you wish to continue to have your existing router manage the Internet connection for you, then plug a connection from your router to the port on this interface. The remaining network interfaces are configured for the clients of a router. They are configured as LAN or internal interfaces in shared configuration mode. This means that all the services (both external and internal) services are provided to who ever connects on this interface. Further, the shared mode means that clients will be able to receive details of automatic network connection on this interface. Specifically, DHCP configuration and DNS servers are provided on this interface. The Internet connection available to the device using the first network interface will be shared with clients using this interface. This all means that you can connect your computers to this network interface and they will get automatically configured and will be able to access the Internet via the FreedomBox. Currently, it is not very clear which interface will be come the WAN interface (and the remaining being LAN interfaces) although the assignment process is deterministic. So, it take a bit of trail and error to figure out which one is which. In future, for each device, this will be well documented.
Wi-Fi configurationAll Wi-Fi interfaces are configured to be LAN or internal interfaces in shared configuration mode. They are also configured to become Wi-Fi access points with following details. Name of the access point will be FreedomBox plus the name of the interface (to handle the case where there are multiple of them). Password for connecting to the interface will be freedombox123.
Internet Connection SharingAlthough the primary duty of FreedomBox is to provide decentralized services, it can also act like a home router. Hence, in most cases, FreedomBox connects to the Internet and provides other machines in the network the ability to use that Internet connection. FreedomBox can do this in two ways: using a shared mode connection or using an internal connection. When an interface is set in shared mode, you may connect your machine directly to it. This is either by plugging in an ethernet cable from this interface to your machine or by connecting to a Wi-Fi access point. This case is the simplest to use, as FreedomBox automatically provides your machine with the necessary network configuration. Your machine will automatically connect to FreedomBox provided network and will be able to connect to the Internet given that FreedomBox can itself connect to the Internet. Sometimes the above setup may not be possible because the hardware device may have only one network interface or for other reasons. Even in this case, your machine can still connect to the Internet via FreedomBox. For this to work, make sure that the network interface that your machine is connecting to is in internal mode. Then, connect your machine to network in which FreedomBox is present. After this, in your machine's network configuration, set FreedomBox's IP address as the gateway. FreedomBox will then accept your network traffic from your machine and send it over to the Internet. This works because network interfaces in internal mode are configured to masquerade packets from local machines to the Internet and receive packets from Internet and forward them back to local machines.
CustomizationThe above default configuration may not be fit for your setup. You can customize the configuration to suit your needs from the Networks area in the 'setup' section of the FreedomBox web interface.
PPPoE connectionsIf your ISP does not provide automatic network configuration via DHCP and requires you to connection via PPPoE. To configure PPPoE, remove any network connection existing on an interface and add a PPPoE connection. Here, optionally, provide the account username and password given by your ISP and activate the connection.
Connect to Internet via Wi-FiBy default Wi-Fi devices attached during first boot will be configured as access points. They can be configured as regular Wi-Fi devices instead to connection to a local network or an existing Wi-Fi router. To do this, click on the Wi-Fi connection to edit it. Change the mode to Infrastructure instead of Access Point mode and IPv4 Addressing Method to Automatic (DHCP) instead of Shared mode. Then the SSID provided will mean the Wi-Fi network name you wish to connect to and passphrase will be the used to while making the connection.
Problems with Privacy FeatureNetworkManager used by FreedomBox to connect to the Wi-Fi networks has a privacy feature that uses a different identity when scanning for networks and when actually connecting to the Wi-Fi access point. Unfortunately, this causes problems with some routers that reject connections from such devices. Your connection won't successfully activate and disconnect after trying to activate. If you have control over the router's behaviour, you could also turn off the feature causing problem. Otherwise, the solution is to connect with a remote shell using SSH or Cockpit, editing a file /etc/NetworkManager/NetworkManager.conf and adding the line wifi.scan-rand-mac-address=no in the [device] section. This turns off the privacy feature. Edit a file: Add the following: Then reboot the machine.
Adding a new network deviceWhen a new network device is added, network manager will automatically configure it. In most cases this will not work to your liking. Delete the automatic configuration created on the interface and create a new network connection. Select your newly added network interface in the add connection page. Then set firewall zone to internal and external appropriately. You can configure the interface to connect to a network or provide network configuration to whatever machine connects to it. Similarly, if it is a Wi-Fi interface, you can configure it to become a Wi-FI access point or to connect to an existing access points in the network.
Configuring a mesh networkFreedomBox has rudimentary support for participating in BATMAN-Adv based mesh networks. It is possible to either join an existing network in your area or create a new mesh network and share your Internet connection with the rest of the nodes that join the network. Currently, two connections have to be created and activated manually to join or create a mesh network.
Joining a mesh networkTo join an existing mesh network in your area, first consult the organizers and get information about the mesh network. Create a new connection, then select the connection type as Wi-Fi. In the following dialog, provide the following values: Field NameExample ValueExplanation Connection Name Mesh Join - BATMAN The name must end with 'BATMAN' (uppercase) Physical Interface wlan0 The Wi-Fi device you wish to use for joining the mesh network Firewall Zone External Since you don't wish that participants in mesh network to use internal services of FreedomBox SSID ch1.freifunk.net As provided to you by the operators of the mesh network. You should see this as a network in Nearby Wi-Fi Networks Mode Ad-hoc Because this is a peer-to-peer network Frequency Band 2.4Ghz As provided to you by the operators of the mesh network Channel 1 As provided to you by the operators of the mesh network BSSID 12:CA:FF:EE:BA:BE As provided to you by the operators of the mesh network Authentication Open Leave this as open, unless you know your mesh network needs it be otherwise Passphrase Leave empty unless you know your mesh network requires one IPv4 Addressing Method Disabled We don't want to request IP configuration information yet Save the connection. Join the mesh network by activating this newly created connection. Create a second new connection, then select the connection type as Generic. In the following dialog, provide this following values: Field NameExample ValueExplanation Connection Name Mesh Connect Any name to identify this connection Physical Interface bat0 This interface will only show up after you successfully activate the connection in first step Firewall Zone External Since you don't wish that participants in mesh network to use internal services of FreedomBox IPv4 Addressing Method Auto Mesh networks usually have a DHCP server somewhere that provide your machine with IP configuration. If not, consult the operator and configure IP address setting accordingly with Manual method Save the connection. Configure your machine for participation in the network by activating this connection. Currently, this connection has to be manually activated every time you need to join the network. In future, FreedomBox will do this automatically. You will now be able reach other nodes in the network. You will also be able to connect to the Internet via the mesh network if there is an Internet connection point somewhere in mesh as setup by the operators.
Creating a mesh networkTo create your own mesh network and share your Internet connection with the rest of the nodes in the network: Follow the instructions as provided above in step 1 of Joining a mesh network but choose and fix upon your own valid values for SSID (a name for you mesh network), Frequency Band (usually 2.4Ghz), Channel (1 to 11 in 2.4Ghz band) and BSSID (a hex value like 12:CA:DE:AD:BE:EF). Create this connection and activate it. Follow the instructions as provided above in step 2 of Joining a mesh network but select IPv4 Addressing Method as Shared. This will provide automatic IP configuration to other nodes in the network as well as share the Internet connection on your machine (achieved using a second Wi-Fi interface, using Ethernet, etc.) with other nodes in the mesh network. Spread the word about your mesh network to your neighbors and let them know the parameters you have provided when creating the network. When other nodes connect to this mesh network, they have to follow steps in Joining a mesh network but use the values for SSID, Frequency Band and Channel that you have chosen when you created the mesh network.
Manual Network OperationFreedomBox automatically configures networks by default and provides a simplified interface to customize the configuration to specific needs. In most cases, manual operation is not necessary. The following steps describe how to manually operate network configuration in the event that a user finds FreedomBox interface to insufficient for task at hand or to diagnose a problem that FreedomBox does not identify. On the command line interface: For text based user interface for configuring network connections: To see the list of available network devices: To see the list of configured connections: To see the current status of a connection: ']]>To see the current firewall zone assigned to a network interface: ' | grep zone]]>or
FreedomBox/Manual/Networks122020-05-24 01:48:46SunilMohanAdapaAdd advanced network operations section referring to Cockpit112020-05-23 20:43:32JamesValleroyadd TableOfContents102020-04-12 16:05:59JamesValleroyadd links back to top level pages92019-06-21 17:52:50SunilMohanAdapaAdd information about Wi-Fi routers causing problem with privacy feature82017-03-31 20:04:48DrahtseilScreenshot Network Single72017-03-02 16:26:27AaronFerrucciCorrected a few typos62016-09-02 05:31:28SunilMohanAdapaAdd information about configuring BATMAN-Adv Mesh network52016-03-06 20:43:34PhilippeBaretText correction42015-09-13 15:04:43SunilMohanAdapaDemote headings one level for inclusion into manual32015-09-12 11:23:58SunilMohanAdapaUpdate link to renamed Firewall page22015-09-12 10:04:19SunilMohanAdapaAdd information about Internet connection sharing12015-09-12 09:24:59SunilMohanAdapaNew page for FreedomBox manual on networking
NetworksThis section describes how networking is setup by default in FreedomBox and how you can customize it. See also the Firewall section for more information on how firewall works.
Default setupIn a fresh image of FreedomBox, network is not configured at all. When the image is written to an SD card and the device boots, configuration is done. During first boot, FreedomBox setup package detects the networks interfaces and tries to automatically configure them so that FreedomBox is available for further configuration via the web interface from another machine without the need to connect a monitor. Automatic configuration also tries to make FreedomBox useful, out of the box, for the most important scenarios FreedomBox is used for. There are two scenarios it handles: when is a single ethernet interface and when there are multiple ethernet interfaces.
Single ethernet interfaceWhen there is only single ethernet interface available on the hardware device, there is not much scope for it to play the role of a router. In this case, the device is assumed to be just another machine in the network. Accordingly, the only available interface is configured to be an internal interface in automatic configuration mode. This means that it connects to the Internet using the configuration provided by a router in the network and also makes all (internal and external) of its services available to all the clients on this network. network_single.png
Multiple ethernet interfaceWhen there are multiple ethernet interfaces available on the hardware device, the device can act as a router. The interfaces are then configured to perform this function. The first network interface is configured to be an WAN or external interface in automatic configuration mode. This means that it connects to the Internet using network configuration provided by the Internet Service Provider (ISP). Only services that are meant to be provided across the entire Internet (external services) will be exposed on this interface. You must plug your Internet connection into the port of this ethernet interface. If you wish to continue to have your existing router manage the Internet connection for you, then plug a connection from your router to the port on this interface. The remaining network interfaces are configured for the clients of a router. They are configured as LAN or internal interfaces in shared configuration mode. This means that all the services (both external and internal) services are provided to who ever connects on this interface. Further, the shared mode means that clients will be able to receive details of automatic network connection on this interface. Specifically, DHCP configuration and DNS servers are provided on this interface. The Internet connection available to the device using the first network interface will be shared with clients using this interface. This all means that you can connect your computers to this network interface and they will get automatically configured and will be able to access the Internet via the FreedomBox. Currently, it is not very clear which interface will be come the WAN interface (and the remaining being LAN interfaces) although the assignment process is deterministic. So, it take a bit of trail and error to figure out which one is which. In future, for each device, this will be well documented.
Wi-Fi configurationAll Wi-Fi interfaces are configured to be LAN or internal interfaces in shared configuration mode. They are also configured to become Wi-Fi access points with following details. Name of the access point will be FreedomBox plus the name of the interface (to handle the case where there are multiple of them). Password for connecting to the interface will be freedombox123.
Internet Connection SharingAlthough the primary duty of FreedomBox is to provide decentralized services, it can also act like a home router. Hence, in most cases, FreedomBox connects to the Internet and provides other machines in the network the ability to use that Internet connection. FreedomBox can do this in two ways: using a shared mode connection or using an internal connection. When an interface is set in shared mode, you may connect your machine directly to it. This is either by plugging in an ethernet cable from this interface to your machine or by connecting to a Wi-Fi access point. This case is the simplest to use, as FreedomBox automatically provides your machine with the necessary network configuration. Your machine will automatically connect to FreedomBox provided network and will be able to connect to the Internet given that FreedomBox can itself connect to the Internet. Sometimes the above setup may not be possible because the hardware device may have only one network interface or for other reasons. Even in this case, your machine can still connect to the Internet via FreedomBox. For this to work, make sure that the network interface that your machine is connecting to is in internal mode. Then, connect your machine to network in which FreedomBox is present. After this, in your machine's network configuration, set FreedomBox's IP address as the gateway. FreedomBox will then accept your network traffic from your machine and send it over to the Internet. This works because network interfaces in internal mode are configured to masquerade packets from local machines to the Internet and receive packets from Internet and forward them back to local machines.
CustomizationThe above default configuration may not be fit for your setup. You can customize the configuration to suit your needs from the Networks area in the 'setup' section of the FreedomBox web interface.
PPPoE connectionsIf your ISP does not provide automatic network configuration via DHCP and requires you to connection via PPPoE. To configure PPPoE, remove any network connection existing on an interface and add a PPPoE connection. Here, optionally, provide the account username and password given by your ISP and activate the connection.
Connect to Internet via Wi-FiBy default Wi-Fi devices attached during first boot will be configured as access points. They can be configured as regular Wi-Fi devices instead to connection to a local network or an existing Wi-Fi router. To do this, click on the Wi-Fi connection to edit it. Change the mode to Infrastructure instead of Access Point mode and IPv4 Addressing Method to Automatic (DHCP) instead of Shared mode. Then the SSID provided will mean the Wi-Fi network name you wish to connect to and passphrase will be the used to while making the connection.
Problems with Privacy FeatureNetworkManager used by FreedomBox to connect to the Wi-Fi networks has a privacy feature that uses a different identity when scanning for networks and when actually connecting to the Wi-Fi access point. Unfortunately, this causes problems with some routers that reject connections from such devices. Your connection won't successfully activate and disconnect after trying to activate. If you have control over the router's behaviour, you could also turn off the feature causing problem. Otherwise, the solution is to connect with a remote shell using SSH or Cockpit, editing a file /etc/NetworkManager/NetworkManager.conf and adding the line wifi.scan-rand-mac-address=no in the [device] section. This turns off the privacy feature. Edit a file: Add the following: Then reboot the machine.
Adding a new network deviceWhen a new network device is added, network manager will automatically configure it. In most cases this will not work to your liking. Delete the automatic configuration created on the interface and create a new network connection. Select your newly added network interface in the add connection page. Then set firewall zone to internal and external appropriately. You can configure the interface to connect to a network or provide network configuration to whatever machine connects to it. Similarly, if it is a Wi-Fi interface, you can configure it to become a Wi-FI access point or to connect to an existing access points in the network.
Configuring a mesh networkFreedomBox has rudimentary support for participating in BATMAN-Adv based mesh networks. It is possible to either join an existing network in your area or create a new mesh network and share your Internet connection with the rest of the nodes that join the network. Currently, two connections have to be created and activated manually to join or create a mesh network.
Joining a mesh networkTo join an existing mesh network in your area, first consult the organizers and get information about the mesh network. Create a new connection, then select the connection type as Wi-Fi. In the following dialog, provide the following values: Field NameExample ValueExplanation Connection Name Mesh Join - BATMAN The name must end with 'BATMAN' (uppercase) Physical Interface wlan0 The Wi-Fi device you wish to use for joining the mesh network Firewall Zone External Since you don't wish that participants in mesh network to use internal services of FreedomBox SSID ch1.freifunk.net As provided to you by the operators of the mesh network. You should see this as a network in Nearby Wi-Fi Networks Mode Ad-hoc Because this is a peer-to-peer network Frequency Band 2.4Ghz As provided to you by the operators of the mesh network Channel 1 As provided to you by the operators of the mesh network BSSID 12:CA:FF:EE:BA:BE As provided to you by the operators of the mesh network Authentication Open Leave this as open, unless you know your mesh network needs it be otherwise Passphrase Leave empty unless you know your mesh network requires one IPv4 Addressing Method Disabled We don't want to request IP configuration information yet Save the connection. Join the mesh network by activating this newly created connection. Create a second new connection, then select the connection type as Generic. In the following dialog, provide this following values: Field NameExample ValueExplanation Connection Name Mesh Connect Any name to identify this connection Physical Interface bat0 This interface will only show up after you successfully activate the connection in first step Firewall Zone External Since you don't wish that participants in mesh network to use internal services of FreedomBox IPv4 Addressing Method Auto Mesh networks usually have a DHCP server somewhere that provide your machine with IP configuration. If not, consult the operator and configure IP address setting accordingly with Manual method Save the connection. Configure your machine for participation in the network by activating this connection. Currently, this connection has to be manually activated every time you need to join the network. In future, FreedomBox will do this automatically. You will now be able reach other nodes in the network. You will also be able to connect to the Internet via the mesh network if there is an Internet connection point somewhere in mesh as setup by the operators.
Creating a mesh networkTo create your own mesh network and share your Internet connection with the rest of the nodes in the network: Follow the instructions as provided above in step 1 of Joining a mesh network but choose and fix upon your own valid values for SSID (a name for you mesh network), Frequency Band (usually 2.4Ghz), Channel (1 to 11 in 2.4Ghz band) and BSSID (a hex value like 12:CA:DE:AD:BE:EF). Create this connection and activate it. Follow the instructions as provided above in step 2 of Joining a mesh network but select IPv4 Addressing Method as Shared. This will provide automatic IP configuration to other nodes in the network as well as share the Internet connection on your machine (achieved using a second Wi-Fi interface, using Ethernet, etc.) with other nodes in the mesh network. Spread the word about your mesh network to your neighbors and let them know the parameters you have provided when creating the network. When other nodes connect to this mesh network, they have to follow steps in Joining a mesh network but use the values for SSID, Frequency Band and Channel that you have chosen when you created the mesh network.
Advanced Network OperationsCockpit provides many advanced networking features over those offered by FreedomBox. Both FreedomBox and Cockpit operate over Network Manager and are hence compatible with each other. Some of the functions provided by Cockpit include: Set the maximum transmission unit (MTU) for a network connection Change the hardware address (MAC address) of a network interface Add more DNS servers and configure routing of a network connection Creating bonded devices for highly available network interfaces Creating bridge devices to join network interfaces for aggregating separate networks Manage VLAN for creating virtual partitions in the physical network networks-cockpit.png
Manual Network OperationFreedomBox automatically configures networks by default and provides a simplified interface to customize the configuration to specific needs. In most cases, manual operation is not necessary. The following steps describe how to manually operate network configuration in the event that a user finds FreedomBox interface to insufficient for task at hand or to diagnose a problem that FreedomBox does not identify. On the command line interface: For text based user interface for configuring network connections: To see the list of available network devices: To see the list of configured connections: To see the current status of a connection: ']]>To see the current firewall zone assigned to a network interface: ' | grep zone]]>or To create a new network connection: " ifname "" type ethernet nmcli con modify "" connection.autoconnect TRUE -nmcli con modify "" connection.zone internal]]>To change the firewall zone for a connection: " connection.zone ""]]>For more information on how to use nmcli command, see its man page. Also for a full list of configuration settings and type of connections accepted by Network Manager see: To see the current status of the firewall and manually operate it, see the Firewall section. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +nmcli con modify "" connection.zone internal]]>
To change the firewall zone for a connection: " connection.zone ""]]>For more information on how to use nmcli command, see its man page. Also for a full list of configuration settings and type of connections accepted by Network Manager see: To see the current status of the firewall and manually operate it, see the Firewall section. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/OpenVPN.raw.xml b/doc/manual/en/OpenVPN.raw.xml index ecbfd15bb..3b1e397b2 100644 --- a/doc/manual/en/OpenVPN.raw.xml +++ b/doc/manual/en/OpenVPN.raw.xml @@ -1,4 +1,4 @@ -
FreedomBox/Manual/OpenVPN162019-11-18 22:55:39JamesValleroyadd instructions for Network Manager152019-09-16 09:38:50fioddorMinor layout correction142019-05-10 23:08:07JamesValleroyuse standard text for port forwarding132019-03-01 01:28:15SunilMohanAdapaAdd instructions for connecting using mobile client122019-03-01 00:48:12SunilMohanAdapaAdd information about browsing Internet112019-03-01 00:37:30SunilMohanAdapaUpdate information about dealing with profile files102019-02-28 09:38:45JosephNuthalapatiUpdate image and set width92018-11-15 11:47:34JosephNuthalapatiAdd documentation on how to connect to VPN from Debian and check the connection. Update external link82016-12-31 04:01:13JamesValleroyclarify install vs setup72016-09-09 15:37:55SunilMohanAdapaMinor indentation fix with screenshot62016-09-01 19:14:03Drahtseiladapted title to Plinth wording52016-08-14 19:39:09JanCostermansadded screenshot and setting up sections42016-04-10 07:16:50PhilippeBaretAdded bottom navigation link32015-12-16 00:32:58PhilippeBaretText finishing22015-12-16 00:28:34PhilippeBaretAdded definition for OpenVPN12015-12-15 23:58:42PhilippeBaretAdded first content [OpenVPN page to Apps manual]
Virtual Private Network (OpenVPN)
What is OpenVPN?OpenVPN provides to your FreedomBox a virtual private network service. You can use this software for remote access, site-to-site VPNs and Wi-Fi security. OpenVPN includes support for dynamic IP addresses and NAT.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for OpenVPN: UDP 1194
Setting upIn Plinth apps menu, select Virtual Private Network (OpenVPN) and click Install. After the module is installed, there is an additional setup step that may take a long time to complete. Click "Start setup" to begin. OpenVPN service page Wait for the setup to finish. This could take a while. Once the setup of the OpenVPN server is complete, you can download your profile. This will download a file called <USER>.ovpn, where <USER> is the name of a FreedomBox user. Each FreedomBox user will be able to download a different profile. Users who are not administrators can download the profile from home page after login. The ovpn file contains all the information a vpn client needs to connect to the server. The downloaded profile contains the domain name of the FreedomBox that the client should connect to. This is picked up from the domain configured in 'Config' section of 'System' page. In case your domain is not configured properly, you may need to change this value after downloading the profile. If your OpenVPN client allows it, you can do this after importing the OpenVPN profile. Otherwise, you can edit the .ovpn profile file in a text editor and change the 'remote' line to contain the WAN IP address or hostname of your FreedomBox as follows.
FreedomBox/Manual/OpenVPN202020-05-30 18:09:40SunilMohanAdapaUpdate the title to emphasize app name over its generic name192020-05-26 05:08:38SunilMohanAdapaAdd note about internal services that work and don't work182020-05-23 19:57:01JamesValleroyadd TableOfContents172020-05-23 17:05:41JamesValleroyrename plinth -> freedombox162019-11-18 22:55:39JamesValleroyadd instructions for Network Manager152019-09-16 09:38:50fioddorMinor layout correction142019-05-10 23:08:07JamesValleroyuse standard text for port forwarding132019-03-01 01:28:15SunilMohanAdapaAdd instructions for connecting using mobile client122019-03-01 00:48:12SunilMohanAdapaAdd information about browsing Internet112019-03-01 00:37:30SunilMohanAdapaUpdate information about dealing with profile files102019-02-28 09:38:45JosephNuthalapatiUpdate image and set width92018-11-15 11:47:34JosephNuthalapatiAdd documentation on how to connect to VPN from Debian and check the connection. Update external link82016-12-31 04:01:13JamesValleroyclarify install vs setup72016-09-09 15:37:55SunilMohanAdapaMinor indentation fix with screenshot62016-09-01 19:14:03Drahtseiladapted title to Plinth wording52016-08-14 19:39:09JanCostermansadded screenshot and setting up sections42016-04-10 07:16:50PhilippeBaretAdded bottom navigation link32015-12-16 00:32:58PhilippeBaretText finishing22015-12-16 00:28:34PhilippeBaretAdded definition for OpenVPN12015-12-15 23:58:42PhilippeBaretAdded first content [OpenVPN page to Apps manual]
OpenVPN (Virtual Private Network)
What is OpenVPN?OpenVPN provides to your FreedomBox a virtual private network service. You can use this software for remote access, site-to-site VPNs and Wi-Fi security. OpenVPN includes support for dynamic IP addresses and NAT.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for OpenVPN: UDP 1194
Setting upIn FreedomBox apps menu, select Virtual Private Network (OpenVPN) and click Install. After the module is installed, there is an additional setup step that may take a long time to complete. Click "Start setup" to begin. OpenVPN service page Wait for the setup to finish. This could take a while. Once the setup of the OpenVPN server is complete, you can download your profile. This will download a file called <USER>.ovpn, where <USER> is the name of a FreedomBox user. Each FreedomBox user will be able to download a different profile. Users who are not administrators can download the profile from home page after login. The ovpn file contains all the information a vpn client needs to connect to the server. The downloaded profile contains the domain name of the FreedomBox that the client should connect to. This is picked up from the domain configured in 'Config' section of 'System' page. In case your domain is not configured properly, you may need to change this value after downloading the profile. If your OpenVPN client allows it, you can do this after importing the OpenVPN profile. Otherwise, you can edit the .ovpn profile file in a text editor and change the 'remote' line to contain the WAN IP address or hostname of your FreedomBox as follows.
Browsing Internet after connecting to VPNAfter connecting to the VPN, the client device will be able to browse the Internet without any further configuration. However, a pre-condition for this to work is that you need to have at least one Internet connected network interface which is part of the 'External' firewall zone. Use the networks configuration page to edit the firewall zone for the device's network interfaces.
Usage
On Android/LineageOSVisit FreedomBox home page. Login with your user account. From home page, download the OpenVPN profile. The file will be named username.ovpn. OpenVPN Download Profile Download an OpenVPN client such as OpenVPN for Android. F-Droid repository is recommended. In the app, select import profile. OpenVPN App In the select profile dialog, choose the username.opvn file you have just downloaded. Provide a name for the connection and save the profile. OpenVPN import profile Newly created profile will show up. If necessary, edit the profile and set the domain name of your FreedomBox as the server address. OpenVPN profile created OpenVPN edit domain name Connect by tapping on the profile. OpenVPN connect OpenVPN connected When done, disconnect by tapping on the profile. OpenVPN disconnect
On DebianInstall an OpenVPN client for your system Open the ovpn file with the OpenVPN client. .ovpn]]>If you use Network Manager, you can create a new connection by importing the file: .ovpn]]>
Checking if you are connected
On DebianTry to ping the FreedomBox or other devices on the local network. Running the command ip addr should show a tun0 connection. The command traceroute freedombox.org should show you the ip address of the VPN server as the first hop.
External Links Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +$ sudo nmcli connection import type openvpn file /path/to/.ovpn]]>
Checking if you are connected
On DebianTry to ping the FreedomBox or other devices on the local network. Running the command ip addr should show a tun0 connection. The command traceroute freedombox.org should show you the ip address of the VPN server as the first hop.
Accessing internal servicesAfter connecting to OpenVPN, you will be able to access FreedomBox services that are only meant to be accessed on internal networks. This is in addition to being able to access external services. This can be done by using the IP address 10.91.0.1 as the host name for these services. The following services are known to work: Privoxy, Tor Socks, Shadowsocks, I2P Proxy and Samba. Some services are known not to work at this time: Avahi, Bind and MiniDLNA.
External Links Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/PageKite.raw.xml b/doc/manual/en/PageKite.raw.xml index e430abd81..52a0ec92b 100644 --- a/doc/manual/en/PageKite.raw.xml +++ b/doc/manual/en/PageKite.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/PageKite122017-01-07 20:37:22JamesValleroyadd info on getting certificate112017-01-07 20:21:47JamesValleroyadd instructions102017-01-07 20:14:44JamesValleroyclarify how pagekite works92016-09-01 19:19:45Drahtseiladapted title to Plinth wording82016-04-10 07:13:20PhilippeBaretAdded navigation link72015-12-15 20:50:09PhilippeBaretCorrection62015-12-15 19:28:57PhilippeBaretAdded more definition52015-12-15 19:19:27PhilippeBaretAdded pagekite extended definition42015-09-13 14:58:24SunilMohanAdapaAdd headings for inclusion into manual32015-09-13 13:18:15SunilMohanAdapaMove PageKite page to manual22015-02-13 05:01:10SunilMohanAdapaInclude FreedomBox portal in footer12012-09-14 07:37:02planetlarg
Public Visibility (PageKite)
What is PageKite?PageKite makes local websites and services publicly accessible immediately without creating yourself a public IP address. It does this by tunneling protocols such as HTTPS or SSH through firewalls and NAT. Using PageKite requires an account on a PageKite relay service. One such service is . A PageKite relay service will allow you to create kites. Kites are similar to domain names, but with different advantages and drawbacks. A kite can have a number of configured services. PageKite is known to work with HTTP, HTTPS, and SSH, and may work with some other services, but not all.
Using PageKiteCreate an account on a PageKite relay service. Add a kite to your account. Note your kite name and kite secret. In Plinth, go to the "Configure PageKite" tab on the Public Visibility (PageKite) page. Check the "Enable PageKite" box, then enter your kite name and kite secret. Click "Save settings". On the "Standard Services" tab, you can enable HTTP and HTTPS (recommended) and SSH (optional). HTTP is needed to obtain the Let's Encrypt certificate. You can disable it later. On the Certificates (Let's Encrypt) page, you can obtain a Let's Encrypt certificate for your kite name. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/PageKite152020-05-30 18:21:26SunilMohanAdapaUpdate the title to emphasize app name over its generic name142020-05-23 20:44:53JamesValleroyadd TableOfContents132020-05-23 17:09:08JamesValleroyrename plinth -> freedombox122017-01-07 20:37:22JamesValleroyadd info on getting certificate112017-01-07 20:21:47JamesValleroyadd instructions102017-01-07 20:14:44JamesValleroyclarify how pagekite works92016-09-01 19:19:45Drahtseiladapted title to Plinth wording82016-04-10 07:13:20PhilippeBaretAdded navigation link72015-12-15 20:50:09PhilippeBaretCorrection62015-12-15 19:28:57PhilippeBaretAdded more definition52015-12-15 19:19:27PhilippeBaretAdded pagekite extended definition42015-09-13 14:58:24SunilMohanAdapaAdd headings for inclusion into manual32015-09-13 13:18:15SunilMohanAdapaMove PageKite page to manual22015-02-13 05:01:10SunilMohanAdapaInclude FreedomBox portal in footer12012-09-14 07:37:02planetlarg
PageKite (Public Visibility)
What is PageKite?PageKite makes local websites and services publicly accessible immediately without creating yourself a public IP address. It does this by tunneling protocols such as HTTPS or SSH through firewalls and NAT. Using PageKite requires an account on a PageKite relay service. One such service is . A PageKite relay service will allow you to create kites. Kites are similar to domain names, but with different advantages and drawbacks. A kite can have a number of configured services. PageKite is known to work with HTTP, HTTPS, and SSH, and may work with some other services, but not all.
Using PageKiteCreate an account on a PageKite relay service. Add a kite to your account. Note your kite name and kite secret. In FreedomBox, go to the "Configure PageKite" tab on the Public Visibility (PageKite) page. Check the "Enable PageKite" box, then enter your kite name and kite secret. Click "Save settings". On the "Standard Services" tab, you can enable HTTP and HTTPS (recommended) and SSH (optional). HTTP is needed to obtain the Let's Encrypt certificate. You can disable it later. On the Certificates (Let's Encrypt) page, you can obtain a Let's Encrypt certificate for your kite name. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Performance.raw.xml b/doc/manual/en/Performance.raw.xml index 726f98563..8bad80ef5 100644 --- a/doc/manual/en/Performance.raw.xml +++ b/doc/manual/en/Performance.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Performance102020-05-12 04:51:34SunilMohanAdapaCockpit allows viewing upto 1 year at a time92020-05-12 04:40:54SunilMohanAdapaRename the image, minor formatting82020-05-12 04:39:38SunilMohanAdapaAdd the version availability and minor changes72020-05-08 06:41:27FredLeMeurup to 2 weeks62020-05-08 06:32:56FredLeMeurExplain why performance monitoring is needed.52020-05-05 12:39:58FredLeMeurzoom out button42020-05-04 08:31:15FredLeMeurWIP:performance: introduce Performance Co-Pilot (cockpit-pcp) in ‘System’32020-05-04 08:28:10FredLeMeur22020-05-04 08:07:58FredLeMeurwith "END_INCLUDE"12020-05-04 08:01:29FredLeMeurinit page
Performance (cockpit-pcp)Performance app allows you to collect, store and view information about utilization of the hardware. This can gives you basic insights into usage patterns and whether the hardware is overloaded by users and services. Performance metrics are collected by Performance Co-Pilot and can be viewed using the Cockpit app. Performance app is available in FreedomBox since version 20.9. When this system app is installed and enabled, cockpit's graphs shows the past (up to one year at a time). performance-one-week.png Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Performance112020-05-30 18:19:38SunilMohanAdapaUpdate the title to emphasize app name over its generic name102020-05-12 04:51:34SunilMohanAdapaCockpit allows viewing upto 1 year at a time92020-05-12 04:40:54SunilMohanAdapaRename the image, minor formatting82020-05-12 04:39:38SunilMohanAdapaAdd the version availability and minor changes72020-05-08 06:41:27FredLeMeurup to 2 weeks62020-05-08 06:32:56FredLeMeurExplain why performance monitoring is needed.52020-05-05 12:39:58FredLeMeurzoom out button42020-05-04 08:31:15FredLeMeurWIP:performance: introduce Performance Co-Pilot (cockpit-pcp) in ‘System’32020-05-04 08:28:10FredLeMeur22020-05-04 08:07:58FredLeMeurwith "END_INCLUDE"12020-05-04 08:01:29FredLeMeurinit page
Performance (System Monitoring)Performance app allows you to collect, store and view information about utilization of the hardware. This can gives you basic insights into usage patterns and whether the hardware is overloaded by users and services. Performance metrics are collected by Performance Co-Pilot and can be viewed using the Cockpit app. Performance app is available in FreedomBox since version 20.9. When this system app is installed and enabled, cockpit's graphs shows the past (up to one year at a time). performance-one-week.png Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Power.raw.xml b/doc/manual/en/Power.raw.xml index 9714196b9..32f2d2027 100644 --- a/doc/manual/en/Power.raw.xml +++ b/doc/manual/en/Power.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Power32019-02-28 16:33:32JosephNuthalapatiRestart and shut down options in user menu22017-01-07 20:38:36JamesValleroynote confirmation12016-08-21 09:29:59DrahtseilCreated Power
PowerPower provides an easy way to restart or shut down FreedomBox. After you select "Restart" or "Shut Down", you will be asked to confirm. "Restart" and "Shut Down" options can also be reached from the user dropdown menu on the top right. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Power32019-02-28 16:33:32JosephNuthalapatiRestart and shut down options in user menu22017-01-07 20:38:36JamesValleroynote confirmation12016-08-21 09:29:59DrahtseilCreated Power
PowerPower provides an easy way to restart or shut down FreedomBox. After you select "Restart" or "Shut Down", you will be asked to confirm. "Restart" and "Shut Down" options can also be reached from the user dropdown menu on the top right. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Privoxy.raw.xml b/doc/manual/en/Privoxy.raw.xml index bb30d43df..1041f6ae3 100644 --- a/doc/manual/en/Privoxy.raw.xml +++ b/doc/manual/en/Privoxy.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Privoxy132020-05-03 18:51:16JamesValleroyuse https link for Quickstart122020-05-03 18:49:54JamesValleroyuse https link for FAQ112019-09-16 12:07:52fioddorMinor correction102018-03-11 03:09:16JosephNuthalapatiFix oversized images92016-09-09 15:39:20SunilMohanAdapaMinor indentation fix with screenshots82016-09-09 15:31:16SunilMohanAdapaPromote the visibility of the screencast72016-08-09 19:09:55Drahtseilconfiguration for advanced users62016-08-06 20:02:42DrahtseilScreencast of the setting up52016-08-06 17:57:33Drahtseilscreenshots42016-08-01 19:38:35DrahtseilVery basic restructuring as preparation for more work to be done.32016-04-10 07:24:20PhilippeBaretAdded bottom navigation link22015-12-15 20:54:14PhilippeBaretAdded link to Privoxy FAQ12015-12-15 20:22:00PhilippeBaretAdded Privoxy page and definition
Web Proxy (Privoxy)A web proxy acts as a filter for incoming and outgoing web traffic. Thus, you can instruct any computer in your network to pass internet traffic through the proxy to remove unwanted ads and tracking mechanisms. Privoxy is a software for security, privacy, and accurate control over the web. It provides a much more powerful web proxy (and anonymity on the web) than what your browser can offer. Privoxy "is a proxy that is primarily focused on privacy enhancement, ad and junk elimination and freeing the user from restrictions placed on his activities" (source: Privoxy FAQ).
ScreencastWatch the screencast on how to setup and use Privoxy in FreedomBox.
Setting upIn Plinth install Web Proxy (Privoxy) Privoxy Installation Adapt your browser proxy settings to your FreedomBox hostname (or IP address) with port 8118. Please note that Privoxy can only proxy HTTP and HTTPS traffic. It will not work with FTP or other protocols. Privoxy Browser Settings Go to page or . If Privoxy is installed properly, you will be able to configure it in detail; if not you will see an error message. If you are using a laptop that occasionally has to connect through other routers than yours with the FreedomBox and Privoxy, you may want to install a proxy switch add-on that allows you to easily turn the proxy on or off.
Advanced UsersThe default installation should provide a reasonable starting point for most. There will undoubtedly be occasions where you will want to adjust the configuration, that can be dealt with as the need arises. While using Privoxy, you can see its configuration details and documentation at or . To enable changing these configurations, you first have to change the value of enable-edit-actions in /etc/privoxy/config to 1. Before doing so, read carefully the manual, especially: Access to the editor can not be controlled separately by "ACLs" or HTTP authentication, so that everybody who can access Privoxy can modify its configuration for all users. This option is not recommended for environments with untrusted users. Note that malicious client side code (e.g Java) is also capable of using the actions editor and you shouldn't enable this options unless you understand the consequences and are sure your browser is configured correctly. Now you find an EDIT button on the configuration screen in http://config.privoxy.org/. The Quickstart is a good starting point to read on how to define own blocking and filtering rules. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Privoxy162020-05-30 18:11:34SunilMohanAdapaUpdate the title to emphasize app name over its generic name152020-05-23 19:58:09JamesValleroyadd TableOfContents142020-05-23 17:06:11JamesValleroyrename plinth -> freedombox132020-05-03 18:51:16JamesValleroyuse https link for Quickstart122020-05-03 18:49:54JamesValleroyuse https link for FAQ112019-09-16 12:07:52fioddorMinor correction102018-03-11 03:09:16JosephNuthalapatiFix oversized images92016-09-09 15:39:20SunilMohanAdapaMinor indentation fix with screenshots82016-09-09 15:31:16SunilMohanAdapaPromote the visibility of the screencast72016-08-09 19:09:55Drahtseilconfiguration for advanced users62016-08-06 20:02:42DrahtseilScreencast of the setting up52016-08-06 17:57:33Drahtseilscreenshots42016-08-01 19:38:35DrahtseilVery basic restructuring as preparation for more work to be done.32016-04-10 07:24:20PhilippeBaretAdded bottom navigation link22015-12-15 20:54:14PhilippeBaretAdded link to Privoxy FAQ12015-12-15 20:22:00PhilippeBaretAdded Privoxy page and definition
Privoxy (Web Proxy)A web proxy acts as a filter for incoming and outgoing web traffic. Thus, you can instruct any computer in your network to pass internet traffic through the proxy to remove unwanted ads and tracking mechanisms. Privoxy is a software for security, privacy, and accurate control over the web. It provides a much more powerful web proxy (and anonymity on the web) than what your browser can offer. Privoxy "is a proxy that is primarily focused on privacy enhancement, ad and junk elimination and freeing the user from restrictions placed on his activities" (source: Privoxy FAQ).
ScreencastWatch the screencast on how to setup and use Privoxy in FreedomBox.
Setting upIn FreedomBox, install Web Proxy (Privoxy) Privoxy Installation Adapt your browser proxy settings to your FreedomBox hostname (or IP address) with port 8118. Please note that Privoxy can only proxy HTTP and HTTPS traffic. It will not work with FTP or other protocols. Privoxy Browser Settings Go to page or . If Privoxy is installed properly, you will be able to configure it in detail; if not you will see an error message. If you are using a laptop that occasionally has to connect through other routers than yours with the FreedomBox and Privoxy, you may want to install a proxy switch add-on that allows you to easily turn the proxy on or off.
Advanced UsersThe default installation should provide a reasonable starting point for most. There will undoubtedly be occasions where you will want to adjust the configuration, that can be dealt with as the need arises. While using Privoxy, you can see its configuration details and documentation at or . To enable changing these configurations, you first have to change the value of enable-edit-actions in /etc/privoxy/config to 1. Before doing so, read carefully the manual, especially: Access to the editor can not be controlled separately by "ACLs" or HTTP authentication, so that everybody who can access Privoxy can modify its configuration for all users. This option is not recommended for environments with untrusted users. Note that malicious client side code (e.g Java) is also capable of using the actions editor and you shouldn't enable this options unless you understand the consequences and are sure your browser is configured correctly. Now you find an EDIT button on the configuration screen in http://config.privoxy.org/. The Quickstart is a good starting point to read on how to define own blocking and filtering rules. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Quassel.raw.xml b/doc/manual/en/Quassel.raw.xml index b2a4cc1e2..895ca4b05 100644 --- a/doc/manual/en/Quassel.raw.xml +++ b/doc/manual/en/Quassel.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Quassel102020-05-11 23:23:12fioddorExample screenshot in english (previous in german)92020-05-11 23:16:16fioddorPlinth renamed to FreedomBox's web interface,as in the rest of user documentation82020-05-03 18:48:31JamesValleroyupdate quasseldroid links72019-05-10 23:05:32JamesValleroyuse standard text for port forwarding62019-02-27 21:34:38JosephNuthalapatiGrammar corrections and clarification about port forwarding52018-10-04 02:01:15SunilMohanAdapaAdd screenshots to the Quassel Client section42018-10-04 01:26:35SunilMohanAdapaRefactor information on how to connect to core using desktop client32018-03-11 03:00:04JosephNuthalapatiFix oversized image22016-08-18 17:30:28Drahtseilwording, screen-shots12016-08-17 20:09:38Drahtseilpage creation; not sure about the configuration of quassel-client (too long ago); screenshots to follow
IRC Client (Quassel)Quassel is an IRC application that is split into two parts, a "core" and a "client". This allows the core to remain connected to IRC servers, and to continue receiving messages, even when the client is disconnected. FreedomBox can run the Quassel core service keeping you always online and one or more Quassel clients from a desktop or a mobile device can be used to connect and disconnect from it.
Why run Quassel?Many discussions about FreedomBox are being done on the IRC-Channel irc://irc.debian.org/freedombox. If your FreedomBox is running Quassel, it will collect all discussions while you are away, such as responses to your questions. Remember, the FreedomBox project is a worldwide project with people from nearly every time zone. You use your client to connect to the Quassel core to read and respond whenever you have time and are available.
How to setup Quassel?Within FreedomBox's web interface select Applications go to IRC Client (Quassel) and install the application and make sure it is enabled Quassel Installation now your Quassel core is running
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Quassel: TCP 4242 Example configuration in router: Quassel_PortForwarding_en_v01.png
ClientsClients to connect to Quassel from your desktop and mobile devices are available.
DesktopIn a Debian system, you can e.g. use quassel-client. The following steps describe how to connect Quassel Client with Quassel Core running on a FreedomBox. The first time you do this connection, Quassel Core will be initialized too. Launch Quassel Client. You will be greeted with a wizard to Connect to Core. Connect to Core Click the Add button to launch Add Core Account dialog. Add Core Account Fill any value in the Account Name field. Fill proper DNS hostname of your FreedomBox in Hostname filed. Port field must have the value 4242. Provide the username and password of the account you wish to create to connect to the Quassel Core in the User and Password fields. Choose Remember if don't wish to be prompted for a password every time you launch Quassel client. After pressing OK in the Add Core Account dialog, you should see the core account in the Connect to Core dialog. Connect to Core Select the newly created core account and select OK to connect to it. If this is the first time you are connecting to this core. You will see an Untrusted Security Certificate warning and need to accept the server certificate. Untrusted Security Certificate Select Continue. Then you will be asked if you wish to accept the certificate permanently. Select Forever. Untrusted Security Certificate If this Quassel Core has not been connected to before, you will then see a Core Configuration Wizard. Select Next. Core Configuration Wizard In the Create Admin User page, enter the username and password you have used earlier to create the core connection. Select Remember password to remember this password for future sessions. Click Next. Create Admin User Page In the Select Storage Backend page, select SQLite and click Commit. Select Storage Backend The core configuration is then complete and you will see a Quassel IRC wizard to configure your IRC connections. Click Next. Welcome Wizard In Setup Identity page next, provide a name and multiple nicknames. This is how you present yourself to other users on IRC. It is not necessary to give your real world name. Multiple nicknames are useful as fallback nicknames when the first nickname can't be used for some reason. After providing the information click Next. Setup Identity In Setup Network Connection page next, provide a network name of your choice. Next provide a list of servers to which Quassel Core should connect to in order to join this IRC network (such as irc.debian.org:6667). Setup Network Connection Select the server in the servers list and click Edit. In the Server Info dialog, set the port 6697 (consult your network's documentation for actual list of servers and their secure ports) and click Use SSL. Click OK. This is to ensure that communication between your FreedomBox and the IRC network server is encrypted. Server Info Server Info SSL Back in the Setup Network Connection dialog, provide a list of IRC channels (such as #freedombox) to join upon connecting to the network. Click Save & Connect. Setup Network Connection You should connect to the network and see the list of channels you have joined on the All Chats pane on the left of the Quassel Client main window. Quassel Main Window Select a channel and start seeing messages from others in the channel and send your own messages.
AndroidFor Android devices you may use e.g. Quasseldroid from F-Droid enter core, username etc. as above Quasseldroid.png By the way, the German verb quasseln means talking a lot, to jabber. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Quassel122020-05-30 18:02:30SunilMohanAdapaUpdate the title to emphasize app name over its generic name112020-05-23 19:54:18JamesValleroyadd TableOfContents102020-05-11 23:23:12fioddorExample screenshot in english (previous in german)92020-05-11 23:16:16fioddorPlinth renamed to FreedomBox's web interface,as in the rest of user documentation82020-05-03 18:48:31JamesValleroyupdate quasseldroid links72019-05-10 23:05:32JamesValleroyuse standard text for port forwarding62019-02-27 21:34:38JosephNuthalapatiGrammar corrections and clarification about port forwarding52018-10-04 02:01:15SunilMohanAdapaAdd screenshots to the Quassel Client section42018-10-04 01:26:35SunilMohanAdapaRefactor information on how to connect to core using desktop client32018-03-11 03:00:04JosephNuthalapatiFix oversized image22016-08-18 17:30:28Drahtseilwording, screen-shots12016-08-17 20:09:38Drahtseilpage creation; not sure about the configuration of quassel-client (too long ago); screenshots to follow
Quassel (IRC Client)Quassel is an IRC application that is split into two parts, a "core" and a "client". This allows the core to remain connected to IRC servers, and to continue receiving messages, even when the client is disconnected. FreedomBox can run the Quassel core service keeping you always online and one or more Quassel clients from a desktop or a mobile device can be used to connect and disconnect from it.
Why run Quassel?Many discussions about FreedomBox are being done on the IRC-Channel irc://irc.debian.org/freedombox. If your FreedomBox is running Quassel, it will collect all discussions while you are away, such as responses to your questions. Remember, the FreedomBox project is a worldwide project with people from nearly every time zone. You use your client to connect to the Quassel core to read and respond whenever you have time and are available.
How to setup Quassel?Within FreedomBox's web interface select Applications go to IRC Client (Quassel) and install the application and make sure it is enabled Quassel Installation now your Quassel core is running
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Quassel: TCP 4242 Example configuration in router: Quassel_PortForwarding_en_v01.png
ClientsClients to connect to Quassel from your desktop and mobile devices are available.
DesktopIn a Debian system, you can e.g. use quassel-client. The following steps describe how to connect Quassel Client with Quassel Core running on a FreedomBox. The first time you do this connection, Quassel Core will be initialized too. Launch Quassel Client. You will be greeted with a wizard to Connect to Core. Connect to Core Click the Add button to launch Add Core Account dialog. Add Core Account Fill any value in the Account Name field. Fill proper DNS hostname of your FreedomBox in Hostname filed. Port field must have the value 4242. Provide the username and password of the account you wish to create to connect to the Quassel Core in the User and Password fields. Choose Remember if don't wish to be prompted for a password every time you launch Quassel client. After pressing OK in the Add Core Account dialog, you should see the core account in the Connect to Core dialog. Connect to Core Select the newly created core account and select OK to connect to it. If this is the first time you are connecting to this core. You will see an Untrusted Security Certificate warning and need to accept the server certificate. Untrusted Security Certificate Select Continue. Then you will be asked if you wish to accept the certificate permanently. Select Forever. Untrusted Security Certificate If this Quassel Core has not been connected to before, you will then see a Core Configuration Wizard. Select Next. Core Configuration Wizard In the Create Admin User page, enter the username and password you have used earlier to create the core connection. Select Remember password to remember this password for future sessions. Click Next. Create Admin User Page In the Select Storage Backend page, select SQLite and click Commit. Select Storage Backend The core configuration is then complete and you will see a Quassel IRC wizard to configure your IRC connections. Click Next. Welcome Wizard In Setup Identity page next, provide a name and multiple nicknames. This is how you present yourself to other users on IRC. It is not necessary to give your real world name. Multiple nicknames are useful as fallback nicknames when the first nickname can't be used for some reason. After providing the information click Next. Setup Identity In Setup Network Connection page next, provide a network name of your choice. Next provide a list of servers to which Quassel Core should connect to in order to join this IRC network (such as irc.debian.org:6667). Setup Network Connection Select the server in the servers list and click Edit. In the Server Info dialog, set the port 6697 (consult your network's documentation for actual list of servers and their secure ports) and click Use SSL. Click OK. This is to ensure that communication between your FreedomBox and the IRC network server is encrypted. Server Info Server Info SSL Back in the Setup Network Connection dialog, provide a list of IRC channels (such as #freedombox) to join upon connecting to the network. Click Save & Connect. Setup Network Connection You should connect to the network and see the list of channels you have joined on the All Chats pane on the left of the Quassel Client main window. Quassel Main Window Select a channel and start seeing messages from others in the channel and send your own messages.
AndroidFor Android devices you may use e.g. Quasseldroid from F-Droid enter core, username etc. as above Quasseldroid.png By the way, the German verb quasseln means talking a lot, to jabber. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Radicale.raw.xml b/doc/manual/en/Radicale.raw.xml index b20d08c61..0466d8cfd 100644 --- a/doc/manual/en/Radicale.raw.xml +++ b/doc/manual/en/Radicale.raw.xml @@ -1,4 +1,4 @@ -
FreedomBox/Manual/Radicale542020-05-15 11:11:34JamesValleroyrename plinth -> freedombox532020-05-15 11:10:13JamesValleroysuppress wikiword links522020-05-03 18:43:27JamesValleroyupdate links to supported clients in radicale docs512019-08-11 20:39:37SunilMohanAdapaMinro fixes to workaround for bug502019-08-11 20:32:14SunilMohanAdapaAdd information about bug in radicale492019-05-22 20:58:26David JonesAdded instructions for syncronizing calendars over Tor in Thunderbird.482019-04-04 15:49:32JosephNuthalapatiMention a gotcha about a trailing slash in radicale URL472019-03-01 11:29:01JamesValleroyadd screenshot of web interface462019-03-01 04:01:20JamesValleroyadd instructions on using web interface452019-03-01 03:50:42JamesValleroyupdate setup instructions442019-03-01 03:48:19JamesValleroyrename Plinth -> FreedomBox Service (Plinth)432019-02-27 00:07:37SunilMohanAdapaUpdate incorrect reference to collections-root422019-02-26 20:24:11SunilMohanAdapaMinor update412019-02-26 20:20:18SunilMohanAdapaFix instructions for radicale 2.x manual migration402019-02-21 18:48:01SunilMohanAdapaRemove 'not tested' notice392019-02-21 03:38:31SunilMohanAdapaAdd information about radicale 2.x migration382019-02-10 23:10:19JamesValleroyonly need domain name for DAVx5372019-02-10 23:09:14JamesValleroyrename DAVdroid -> DAVx5362019-02-10 22:59:07JamesValleroyradicale is now in testing352018-09-29 11:28:56JamesValleroyUse calendar-name in CalDAV url342018-07-10 18:04:49BartNotelaers332018-06-17 16:36:11JosephNuthalapatiAdd a missing instruction on how to synchronize using DAVdroid322018-06-01 10:48:04JosephNuthalapatiUpdate DAVdroid account setup with screenshots312018-01-03 08:54:14JosephNuthalapatiUpdate broken link - radicale clients302017-08-06 23:06:11JohannesKeyserupdated dead link to radicale client page, and added warning about misleading URL info292016-12-31 02:28:01JamesValleroystyle changes282016-09-09 15:36:28SunilMohanAdapaMinor indentation fix with screenshot272016-09-09 14:43:07SunilMohanAdapaMinor fix to adjust screenshot262016-09-01 19:11:38Drahtseiladapted title to Plinth wording252016-08-31 17:26:23Drahtseilupdated screenshot242016-08-31 17:24:42DrahtseilAccess rights232016-08-01 16:32:28Drahtseil222016-08-01 16:28:29Drahtseilscreenshots212016-08-01 16:18:30DrahtseilEvolution tutorial to use Calendar instead of Contacts (just happen to have that screenshot)202016-07-31 18:21:39DrahtseilAndroid, advanced user, screenshots still to follow192016-07-31 16:54:46Drahtseil182016-05-18 12:40:51SunilMohanAdapaReduce item nesting to < 4 due to problems in generating FreedomBox Manual172016-04-27 03:35:17StacyCockrumformatting162016-04-27 03:24:18StacyCockrumEditing and added instructions for Evolution Calendar.152016-04-26 06:11:34PhilippeBaretEditing142016-04-25 11:43:17StacyCockrum132016-04-25 11:36:30StacyCockrumI'm not sure if this is the right place to put this kind of information. I thought it would be helpful for a person to know some specifics around the settings. Pls advise if it should go somewhere e122016-04-16 01:38:12PhilippeBaretAdded Why Radical app content112016-04-16 01:36:07PhilippeBaretCorrection102016-04-15 14:58:18StacyCockrum2nd bullet under "How to setup...?" Is it true that a new calendar/address book is created for each client or perhaps the clients need to be configured to access the calendar/address books?92016-04-15 14:53:50StacyCockrumStruggled with the last sentence of the first bullet under "How to setup Radicale?". When the Radicale server is launched does CalDAV become a function of the server or is a CalDAV server?82016-04-11 09:04:25PhilippeBaretCorrection72016-04-11 09:02:38PhilippeBaretCorrection proper terms: CalDAV and CardDAV62016-04-11 09:01:11PhilippeBaretAdded Why running Radicale section52016-04-11 08:53:27PhilippeBaretCorrection42016-04-11 08:48:16PhilippeBaretAdded how to setup Radical server and clients in FreedomBox Manual32016-04-10 07:12:39PhilippeBaretAdded manual link22016-04-10 07:09:27PhilippeBaretAdded Radicale definition on FreedomBox manual12016-04-10 06:40:28PhilippeBaretAdded first content to Radicale manual page
Calendar and Addressbook (Radicale)With Radicale, you can synchronize your personal calendars, ToDo lists, and addressbooks with your various computers, tablets, and smartphones, and share them with friends, without letting third parties know your personal schedule or contacts.
Why should I run Radicale?Using Radicale, you can get rid of centralized services like Google Calendar or Apple Calendar (iCloud) data mining your events and social connections.
How to setup Radicale?First, the Radicale server needs to be activated on your box. Within FreedomBox Service (Plinth) select Apps go to Radicale (Calendar and Addressbook) and install the application. After the installation is complete, make sure the application is marked "enabled" in the FreedomBox interface. Enabling the application launches the Radicale CalDAV/CardDAV server. define the access rights: Only the owner of a calendar/addressbook can view or make changes Any user can view any calendar/addressbook, but only the owner can make changes Any user can view or make changes to any calendar/addressbook Note, that only users with a FreedomBox login can access Radicale. Radicale-Plinth.png If you want to share a calendar with only some users, the simplest approach is to create an additional user-name for these users and to share that user-name and password with them. Radicale provides a basic web interface, which only supports creating new calendars and addressbooks. To add events or contacts, an external supported client application is needed. radicale_web.png Creating addressbook/calendar using the web interface Visit https://IP-address-or-domain-for-your-server/radicale/ Log in with your FreedomBox account Select "Create new addressbook or calendar" Provide a title and select the type Optionally, provide a description or select a color Click "Create" The page will show the URL for your newly created addressbook or calendar Now open your client application to create new calendar and address books that will use your FreedomBox and Radicale server. The Radicale website provides an overview of supported clients, but do not use the URLs described there; FreedomBox uses another setup, follow this manual. Below are the steps for two examples: Example of setup with Evolution client: Calendar Create a new calendar For "Type," select "CalDAV" When "CalDAV" is selected, additional options will appear in the dialogue window. URL: https://IP-address-or-domain-for-your-server/radicale/user/calendar-name.ics/. Items in italics need to be changed to match your settings. note the trailing / in the path, it is important. Enable "Use a secure connection." Name the calendar Radicale-Evolution-Docu.png TODO/Tasks list: Adding a TODO/Tasks list is basically the same as a calendar. Contacts Follow the same steps described above and replace CalDAV with WebDAV. The extension of the address book will be .vcf.
Synchronizing over TorIn FreedomBox, setting up a calendar with Radicale over Tor is the same as over the clear net. Here is a short summary: When logged in to FreedomBox interface over Tor, click on Radicale, and at the prompt provide your FreedomBox user name and password. In the Radicale web interface, log in using your FreedomBox user name and password. Click on "Create new address book or calendar", provide a title, select a type, and click "Create". Save the URL, e.g., https://ONION-ADDRESS-FOR-YOUR-SERVER.onion/radicale/USERNAME/CALENDAR-CODE/. Items in italics need to be changed to match your settings. These instructions are for Thunderbird/Lightning. Note that you will need to be connected to Tor with the Tor Browser Bundle. Open Thunderbird, install the Torbirdy add-on, and restart Thunderbird. (This may not be necessary.) In the Lightning interface, under Calendar/Home in the left panel right click with the mouse and select "New calendar". Select the location of your calendar as "On the Network". Select CalDAV and for the location copy the URL, e.g., https://ONION-ADDRESS-FOR-YOUR-SERVER.onion/radicale/USERNAME/CALENDAR-CODE/. Items in italics need to be changed to match your settings. Provide a name, etc. Click "Next". Your calendar is now syncing with your FreedomBox over Tor. If you have not generated a certificate for your FreedomBox with "Let's Encrypt", you may need to select "Confirm Security Exception" when prompted.
Synchronizing with your Android phoneThere are various Apps that allow integration with the Radicale server. This example uses DAVx5, which is available e.g. on F-Droid. If you intend to use ToDo-Lists as well, the compatible app OpenTasks has to be installed first. Follow these steps for setting up your account with the Radicale server running on your FreedomBox. Install DAVx5 Create a new account on DAVx5 by clicking on the floating + button. Select the second option as shown in the first figure below and enter the base url as (don't miss the / at the end). DAVx5 will be able to discover both CalDAV and WebDAV accounts for the user. Follow this video from DAVx5 FAQ to learn how to migrate your existing contacts to Radicale. Synchronizing contacts Click on the hamburger menus of CalDAV and CardDAV and select either "Refresh ..." in case of existing accounts or "Create ..." in case of new accounts (see the second screenshot below). Check the checkboxes for the address books and calendars you want to synchronize and click on the sync button in the header. (see the third screenshot below) DAVx5 account setup DAVx5 refresh DAVx5 account sync
Advanced Users
Sharing resourcesAbove was shown an easy way to create a resource for a group of people by creating a dedicated account for all. Here will be described an alternative method where two users User1 and User2 are granted access to a calendar. This requires SSH-access to the FreedomBox. create a file /etc/radicale/rights
FreedomBox/Manual/Radicale582020-05-30 17:55:19SunilMohanAdapaUpdate the title to emphasize app name over its generic name572020-05-23 19:49:39JamesValleroyadd TableOfContents562020-05-23 17:01:25JamesValleroyremove (Plinth)552020-05-22 01:21:31JamesValleroyfix matching bracket542020-05-15 11:11:34JamesValleroyrename plinth -> freedombox532020-05-15 11:10:13JamesValleroysuppress wikiword links522020-05-03 18:43:27JamesValleroyupdate links to supported clients in radicale docs512019-08-11 20:39:37SunilMohanAdapaMinro fixes to workaround for bug502019-08-11 20:32:14SunilMohanAdapaAdd information about bug in radicale492019-05-22 20:58:26David JonesAdded instructions for syncronizing calendars over Tor in Thunderbird.482019-04-04 15:49:32JosephNuthalapatiMention a gotcha about a trailing slash in radicale URL472019-03-01 11:29:01JamesValleroyadd screenshot of web interface462019-03-01 04:01:20JamesValleroyadd instructions on using web interface452019-03-01 03:50:42JamesValleroyupdate setup instructions442019-03-01 03:48:19JamesValleroyrename Plinth -> FreedomBox Service (Plinth)432019-02-27 00:07:37SunilMohanAdapaUpdate incorrect reference to collections-root422019-02-26 20:24:11SunilMohanAdapaMinor update412019-02-26 20:20:18SunilMohanAdapaFix instructions for radicale 2.x manual migration402019-02-21 18:48:01SunilMohanAdapaRemove 'not tested' notice392019-02-21 03:38:31SunilMohanAdapaAdd information about radicale 2.x migration382019-02-10 23:10:19JamesValleroyonly need domain name for DAVx5372019-02-10 23:09:14JamesValleroyrename DAVdroid -> DAVx5362019-02-10 22:59:07JamesValleroyradicale is now in testing352018-09-29 11:28:56JamesValleroyUse calendar-name in CalDAV url342018-07-10 18:04:49BartNotelaers332018-06-17 16:36:11JosephNuthalapatiAdd a missing instruction on how to synchronize using DAVdroid322018-06-01 10:48:04JosephNuthalapatiUpdate DAVdroid account setup with screenshots312018-01-03 08:54:14JosephNuthalapatiUpdate broken link - radicale clients302017-08-06 23:06:11JohannesKeyserupdated dead link to radicale client page, and added warning about misleading URL info292016-12-31 02:28:01JamesValleroystyle changes282016-09-09 15:36:28SunilMohanAdapaMinor indentation fix with screenshot272016-09-09 14:43:07SunilMohanAdapaMinor fix to adjust screenshot262016-09-01 19:11:38Drahtseiladapted title to Plinth wording252016-08-31 17:26:23Drahtseilupdated screenshot242016-08-31 17:24:42DrahtseilAccess rights232016-08-01 16:32:28Drahtseil222016-08-01 16:28:29Drahtseilscreenshots212016-08-01 16:18:30DrahtseilEvolution tutorial to use Calendar instead of Contacts (just happen to have that screenshot)202016-07-31 18:21:39DrahtseilAndroid, advanced user, screenshots still to follow192016-07-31 16:54:46Drahtseil182016-05-18 12:40:51SunilMohanAdapaReduce item nesting to < 4 due to problems in generating FreedomBox Manual172016-04-27 03:35:17StacyCockrumformatting162016-04-27 03:24:18StacyCockrumEditing and added instructions for Evolution Calendar.152016-04-26 06:11:34PhilippeBaretEditing142016-04-25 11:43:17StacyCockrum132016-04-25 11:36:30StacyCockrumI'm not sure if this is the right place to put this kind of information. I thought it would be helpful for a person to know some specifics around the settings. Pls advise if it should go somewhere e122016-04-16 01:38:12PhilippeBaretAdded Why Radical app content112016-04-16 01:36:07PhilippeBaretCorrection102016-04-15 14:58:18StacyCockrum2nd bullet under "How to setup...?" Is it true that a new calendar/address book is created for each client or perhaps the clients need to be configured to access the calendar/address books?92016-04-15 14:53:50StacyCockrumStruggled with the last sentence of the first bullet under "How to setup Radicale?". When the Radicale server is launched does CalDAV become a function of the server or is a CalDAV server?82016-04-11 09:04:25PhilippeBaretCorrection72016-04-11 09:02:38PhilippeBaretCorrection proper terms: CalDAV and CardDAV62016-04-11 09:01:11PhilippeBaretAdded Why running Radicale section52016-04-11 08:53:27PhilippeBaretCorrection42016-04-11 08:48:16PhilippeBaretAdded how to setup Radical server and clients in FreedomBox Manual32016-04-10 07:12:39PhilippeBaretAdded manual link22016-04-10 07:09:27PhilippeBaretAdded Radicale definition on FreedomBox manual12016-04-10 06:40:28PhilippeBaretAdded first content to Radicale manual page
Radicale (Calendar and Addressbook)With Radicale, you can synchronize your personal calendars, ToDo lists, and addressbooks with your various computers, tablets, and smartphones, and share them with friends, without letting third parties know your personal schedule or contacts.
Why should I run Radicale?Using Radicale, you can get rid of centralized services like Google Calendar or Apple Calendar (iCloud) data mining your events and social connections.
How to setup Radicale?First, the Radicale server needs to be activated on your box. Within FreedomBox Service: select Apps go to Radicale (Calendar and Addressbook) and install the application. After the installation is complete, make sure the application is marked "enabled" in the FreedomBox interface. Enabling the application launches the Radicale CalDAV/CardDAV server. define the access rights: Only the owner of a calendar/addressbook can view or make changes Any user can view any calendar/addressbook, but only the owner can make changes Any user can view or make changes to any calendar/addressbook Note, that only users with a FreedomBox login can access Radicale. Radicale-Plinth.png If you want to share a calendar with only some users, the simplest approach is to create an additional user-name for these users and to share that user-name and password with them. Radicale provides a basic web interface, which only supports creating new calendars and addressbooks. To add events or contacts, an external supported client application is needed. radicale_web.png Creating addressbook/calendar using the web interface Visit https://IP-address-or-domain-for-your-server/radicale/ Log in with your FreedomBox account Select "Create new addressbook or calendar" Provide a title and select the type Optionally, provide a description or select a color Click "Create" The page will show the URL for your newly created addressbook or calendar Now open your client application to create new calendar and address books that will use your FreedomBox and Radicale server. The Radicale website provides an overview of supported clients, but do not use the URLs described there; FreedomBox uses another setup, follow this manual. Below are the steps for two examples: Example of setup with Evolution client: Calendar Create a new calendar For "Type," select "CalDAV" When "CalDAV" is selected, additional options will appear in the dialogue window. URL: https://IP-address-or-domain-for-your-server/radicale/user/calendar-name.ics/. Items in italics need to be changed to match your settings. note the trailing / in the path, it is important. Enable "Use a secure connection." Name the calendar Radicale-Evolution-Docu.png TODO/Tasks list: Adding a TODO/Tasks list is basically the same as a calendar. Contacts Follow the same steps described above and replace CalDAV with WebDAV. The extension of the address book will be .vcf.
Synchronizing over TorIn FreedomBox, setting up a calendar with Radicale over Tor is the same as over the clear net. Here is a short summary: When logged in to FreedomBox interface over Tor, click on Radicale, and at the prompt provide your FreedomBox user name and password. In the Radicale web interface, log in using your FreedomBox user name and password. Click on "Create new address book or calendar", provide a title, select a type, and click "Create". Save the URL, e.g., https://ONION-ADDRESS-FOR-YOUR-SERVER.onion/radicale/USERNAME/CALENDAR-CODE/. Items in italics need to be changed to match your settings. These instructions are for Thunderbird/Lightning. Note that you will need to be connected to Tor with the Tor Browser Bundle. Open Thunderbird, install the Torbirdy add-on, and restart Thunderbird. (This may not be necessary.) In the Lightning interface, under Calendar/Home in the left panel right click with the mouse and select "New calendar". Select the location of your calendar as "On the Network". Select CalDAV and for the location copy the URL, e.g., https://ONION-ADDRESS-FOR-YOUR-SERVER.onion/radicale/USERNAME/CALENDAR-CODE/. Items in italics need to be changed to match your settings. Provide a name, etc. Click "Next". Your calendar is now syncing with your FreedomBox over Tor. If you have not generated a certificate for your FreedomBox with "Let's Encrypt", you may need to select "Confirm Security Exception" when prompted.
Synchronizing with your Android phoneThere are various Apps that allow integration with the Radicale server. This example uses DAVx5, which is available e.g. on F-Droid. If you intend to use ToDo-Lists as well, the compatible app OpenTasks has to be installed first. Follow these steps for setting up your account with the Radicale server running on your FreedomBox. Install DAVx5 Create a new account on DAVx5 by clicking on the floating + button. Select the second option as shown in the first figure below and enter the base url as (don't miss the / at the end). DAVx5 will be able to discover both CalDAV and WebDAV accounts for the user. Follow this video from DAVx5 FAQ to learn how to migrate your existing contacts to Radicale. Synchronizing contacts Click on the hamburger menus of CalDAV and CardDAV and select either "Refresh ..." in case of existing accounts or "Create ..." in case of new accounts (see the second screenshot below). Check the checkboxes for the address books and calendars you want to synchronize and click on the sync button in the header. (see the third screenshot below) DAVx5 account setup DAVx5 refresh DAVx5 account sync
Advanced Users
Sharing resourcesAbove was shown an easy way to create a resource for a group of people by creating a dedicated account for all. Here will be described an alternative method where two users User1 and User2 are granted access to a calendar. This requires SSH-access to the FreedomBox. create a file /etc/radicale/rights [friends_calendar] is just an identifier, can be any name. The [owner-write] section makes sure that owners have access to their own files edit file /etc/radicale/config and make the following changes in section [rights) [friends_calendar] is just an identifier, can be any name. The [owner-write] section makes sure that owners have access to their own files edit file /etc/radicale/config and make the following changes in section [rights] Restart the radicale server or the FreedomBox
Importing filesIf you are using a contacts file exported from another service or application, it should be copied to: /var/lib/radicale/collections/user/contact file name.vcf.
Migrating from Radicale Version 1.x to Version 2.xDuring the month of February 2019, radicale in Debian testing was upgraded from version 1.x to version 2.x. Version 2.x is a better version but is incompatible with data and configuration used with 1.x. Automatic upgrade mechanism in FreedomBox, handled by unattended-upgrades does not automatically upgrade radicale to version 2.x due to changes in configuration files. However, FreedomBox version 19.1, which is available on February 23rd, 2019 in testing will perform data and configuration migration to radicale version 2.x. Typical users require no action, this will happen automatically. If for some reason, you need to manually run apt dist-upgrade on your machine, then radicale will be upgraded to 2.x and then FreedomBox will not be able to perform its upgrade (due to upstream project deciding to remove migration tools in radicale 2.x version). To avoid this situation, the following process is recommended if you wish to perform an upgrade. Notes: python-radicale is an old package from radicale 1.x version that is still available in testing. This is a hack to use the --export-storage feature that is responsible for data migration. This feature is not available in radicale 2.x unfortunately. Files ending with .dpkg-dist will exist only if you have chosen 'Keep your currently-installed version' when prompted for configuration file override during radicale 2.x upgrade. The above process will overwrite the old configuration with new fresh configuration. No changes are necessary to the two configuration files unless you have changed the setting for sharing calendars. Note that during the migration, your data is safe in /var/lib/radicale/collections directory. New data will be created and used in /var/lib/radicale/collections/collections-root/ directory. The tar command takes a backup your configuration and data in /root/radicale_backup.tgz in case you do something goes wrong and you want to undo the changes.
Troubleshooting1. If you are using FreedomBox Pioneer Edition or installing FreedomBox on Debian Buster, then radicale may not be usable immediately after installation. This is due to a bug which has been fixed later. To overcome the problem, upgrade FreedomBox by clicking on 'Manual Update' from 'Updates' app. Otherwise, simply wait a day or two and let FreedomBox upgrade itself. After that install radicale. If radicale is already installed, disable and re-enable it after the update is completed. This will fix the problem and get radicale working properly. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +(After FreedomBox 19.1 is available, goto FreedomBox web interface and set your preference for calendar sharing again, if it is not the default option, as it will have been lost.)]]>
Notes: python-radicale is an old package from radicale 1.x version that is still available in testing. This is a hack to use the --export-storage feature that is responsible for data migration. This feature is not available in radicale 2.x unfortunately. Files ending with .dpkg-dist will exist only if you have chosen 'Keep your currently-installed version' when prompted for configuration file override during radicale 2.x upgrade. The above process will overwrite the old configuration with new fresh configuration. No changes are necessary to the two configuration files unless you have changed the setting for sharing calendars. Note that during the migration, your data is safe in /var/lib/radicale/collections directory. New data will be created and used in /var/lib/radicale/collections/collections-root/ directory. The tar command takes a backup your configuration and data in /root/radicale_backup.tgz in case you do something goes wrong and you want to undo the changes.
Troubleshooting1. If you are using FreedomBox Pioneer Edition or installing FreedomBox on Debian Buster, then radicale may not be usable immediately after installation. This is due to a bug which has been fixed later. To overcome the problem, upgrade FreedomBox by clicking on 'Manual Update' from 'Updates' app. Otherwise, simply wait a day or two and let FreedomBox upgrade itself. After that install radicale. If radicale is already installed, disable and re-enable it after the update is completed. This will fix the problem and get radicale working properly. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Repro.raw.xml b/doc/manual/en/Repro.raw.xml index 488a9a373..bb700eaae 100644 --- a/doc/manual/en/Repro.raw.xml +++ b/doc/manual/en/Repro.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Repro82019-02-26 23:26:49JamesValleroyremove content from manual72019-02-26 23:25:03JamesValleroyadd note about removal62017-01-02 13:43:51JamesValleroyadd port forwarding info52016-12-31 03:57:09JamesValleroyadd basic info42016-12-26 18:56:31JamesValleroyadd screenshots32016-05-27 17:24:23JamesValleroyadd footer22016-05-27 17:21:48JamesValleroyRenamed from 'FreedomBox/Manual/repro'.12016-05-15 19:03:02JamesValleroystart page
SIP Server (repro)App removed repro has been removed from Debian 10 (Buster), and therefore is no longer available in FreedomBox. repro is a server for SIP, a standard that enables Voice-over-IP calls. A desktop or mobile SIP client is required to use repro.
How to set up the SIP serverConfigure the domain at /repro/domains.html on the FreedomBox. Repro Domains Add users at /repro/addUser.html. Repro Users Disable and re-enable the repro application in Plinth.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for repro: TCP 5060 TCP 5061 UDP 5060 UDP 5061 Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Repro102020-05-30 18:08:11SunilMohanAdapaUpdate the title to emphasize app name over its generic name92020-05-23 19:56:15JamesValleroyadd TableOfContents82019-02-26 23:26:49JamesValleroyremove content from manual72019-02-26 23:25:03JamesValleroyadd note about removal62017-01-02 13:43:51JamesValleroyadd port forwarding info52016-12-31 03:57:09JamesValleroyadd basic info42016-12-26 18:56:31JamesValleroyadd screenshots32016-05-27 17:24:23JamesValleroyadd footer22016-05-27 17:21:48JamesValleroyRenamed from 'FreedomBox/Manual/repro'.12016-05-15 19:03:02JamesValleroystart page
repro (SIP Server)App removed repro has been removed from Debian 10 (Buster), and therefore is no longer available in FreedomBox. repro is a server for SIP, a standard that enables Voice-over-IP calls. A desktop or mobile SIP client is required to use repro.
How to set up the SIP serverConfigure the domain at /repro/domains.html on the FreedomBox. Repro Domains Add users at /repro/addUser.html. Repro Users Disable and re-enable the repro application in Plinth.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for repro: TCP 5060 TCP 5061 UDP 5060 UDP 5061 Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Roundcube.raw.xml b/doc/manual/en/Roundcube.raw.xml index 29a846540..3c387b5bc 100644 --- a/doc/manual/en/Roundcube.raw.xml +++ b/doc/manual/en/Roundcube.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Roundcube82019-03-13 21:13:00SunilMohanAdapaMinor formatting.72019-03-13 21:11:10SunilMohanAdapaAdd information about how to login to Roundcube62016-12-31 03:41:20JamesValleroyadd link52016-09-01 19:12:35Drahtseiladapted title to Plinth wording42016-04-10 07:25:23PhilippeBaretAdded bottom navigation link32015-12-15 19:04:22PhilippeBaretText finishing22015-12-15 19:03:29PhilippeBaretAdded ## END_INCLUDE12015-12-15 19:02:17PhilippeBaretAdded Rouncube page with definition
Email Client (Roundcube)
What is Roundcube?Roundcube is a browser-based multilingual email client with an application-like user interface. Roundcube is using the Internet Message Access Protocol (IMAP) to access e-mail on a remote mail server. It supports MIME to send files, and provides particularly address book, folder management, message searching and spell checking.
Using RoundcubeAfter Roundcube is installed, it can be accessed at https://<your freedombox>/roundcube. Enter your username and password. The username for many mail services will be the full email address such as exampleuser@example.org and not just the username like exampleuser. Enter the address of your email service's IMAP server address in the Server field. You can try providing your domain name here such as example.org for email address exampleuser@example.org and if this does not work, consult your email provider's documentation for the address of the IMAP server. Using encrypted connection to your IMAP server is strongly recommended. To do this, prepend 'imaps://' at the beginning of your IMAP server address. For example, imaps://imap.example.org. Logging into your IMAP server
Using Gmail with RoundcubeIf you wish to use Roundcube with your Gmail account, you need to first enable support for password based login in your Google account preferences. This is because Gmail won't allow applications to login with a password by default. To do this, visit Google Account preferences and enable Less Secure Apps. After this, login to Roundcube by providing your Gmail address as Username, your password and in the server field use imaps://imap.gmail.com. Logging into Gmail Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Roundcube102020-05-30 17:57:13SunilMohanAdapaUpdate the title to emphasize app name over its generic name92020-05-23 19:51:01JamesValleroyadd TableOfContents82019-03-13 21:13:00SunilMohanAdapaMinor formatting.72019-03-13 21:11:10SunilMohanAdapaAdd information about how to login to Roundcube62016-12-31 03:41:20JamesValleroyadd link52016-09-01 19:12:35Drahtseiladapted title to Plinth wording42016-04-10 07:25:23PhilippeBaretAdded bottom navigation link32015-12-15 19:04:22PhilippeBaretText finishing22015-12-15 19:03:29PhilippeBaretAdded ## END_INCLUDE12015-12-15 19:02:17PhilippeBaretAdded Rouncube page with definition
Roundcube (Email Client)
What is Roundcube?Roundcube is a browser-based multilingual email client with an application-like user interface. Roundcube is using the Internet Message Access Protocol (IMAP) to access e-mail on a remote mail server. It supports MIME to send files, and provides particularly address book, folder management, message searching and spell checking.
Using RoundcubeAfter Roundcube is installed, it can be accessed at https://<your freedombox>/roundcube. Enter your username and password. The username for many mail services will be the full email address such as exampleuser@example.org and not just the username like exampleuser. Enter the address of your email service's IMAP server address in the Server field. You can try providing your domain name here such as example.org for email address exampleuser@example.org and if this does not work, consult your email provider's documentation for the address of the IMAP server. Using encrypted connection to your IMAP server is strongly recommended. To do this, prepend 'imaps://' at the beginning of your IMAP server address. For example, imaps://imap.example.org. Logging into your IMAP server
Using Gmail with RoundcubeIf you wish to use Roundcube with your Gmail account, you need to first enable support for password based login in your Google account preferences. This is because Gmail won't allow applications to login with a password by default. To do this, visit Google Account preferences and enable Less Secure Apps. After this, login to Roundcube by providing your Gmail address as Username, your password and in the server field use imaps://imap.gmail.com. Logging into Gmail Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Samba.raw.xml b/doc/manual/en/Samba.raw.xml index 678325403..fde365051 100644 --- a/doc/manual/en/Samba.raw.xml +++ b/doc/manual/en/Samba.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Samba82020-05-18 23:18:48JamesValleroysimplify wording72020-05-12 02:24:02JosephNuthalapatiChange short description to Network File Storage62020-04-23 13:57:36NektariosKatakis52020-04-23 13:54:36NektariosKatakis42020-04-23 13:50:01NektariosKatakis32020-02-02 07:06:36JosephNuthalapatiAndroid Samba Client needs disk path as well22020-02-01 17:15:51JosephNuthalapatiAdd comparison with Syncthing12020-02-01 17:08:21JosephNuthalapatiFirst draft
Network File Storage (Samba)Samba lets you have shared folders over the local network that can be used from multiple computers running different operating systems. We refer to these shared folders as "shares". You can have a personal folder shared between your own devices (Home share), a folder shared with a trusted group (Group share) or one that is shared with every device on the network (Open share). Samba lets you to treat a share as if it's a local folder on your computer. However, shares are available only on the local network. To learn more about Samba, please refer to the user documentation on their wiki. Available since version: 19.22
Using SambaAfter installation, you can choose which disks to use for sharing. Enabled shares are accessible in the file manager on your computer at location \\freedombox (on Windows) or smb://freedombox.local (on Linux and Mac). There are three types of shares you can choose from: Open share - accessible to everyone in your local network. Group share - accessible only to FreedomBox users who are in the freedombox-share group. Home share - every user in the freedombox-share group can have their own private space.
On AndroidTo access Samba shares on an Android device, install "Android Samba Client" from F-Droid or Google Play. Enter smb://freedombox.local/<disk> as the share path in the app. Your shared folders should then be visible in the file manager app.
Integration with other appsTransmission app on FreedomBox provides a setting to allow downloads to be saved directly to a Samba share. If you want to make available files synchronized with Syncthing through Samba you need to make sure you synchronize in a Samba share folder. Additionally in order to make Syncthing shares available in Samba Open share or Group share you will need to ensure you click "Permissions > Ignore" button under the "Advanced" tab in folder you wish in the Syncthing web UI. This will ensure that the files will be writable through Samba.
Comparison with other apps
SyncthingSyncthing maintains a copy of the shared folder on each device that it is shared with. Samba maintains only one copy on your FreedomBox device. Syncthing can synchronize your shared folders between devices over the Internet. Samba shares are only available on the local network. Since Syncthing is primarily a synchronization solution, it has features like conflict resolution and versioning. Samba has only copy of the file, so it doesn't need such features. For example, if two people are editing a spreadsheet stored on a Samba share, the last one to save the file wins. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Samba112020-05-30 18:01:25SunilMohanAdapaUpdate the title to emphasize app name over its generic name102020-05-25 08:15:46SunilMohanAdapaAdd mention of VLC for Android92020-05-23 19:53:30JamesValleroyadd TableOfContents82020-05-18 23:18:48JamesValleroysimplify wording72020-05-12 02:24:02JosephNuthalapatiChange short description to Network File Storage62020-04-23 13:57:36NektariosKatakis52020-04-23 13:54:36NektariosKatakis42020-04-23 13:50:01NektariosKatakis32020-02-02 07:06:36JosephNuthalapatiAndroid Samba Client needs disk path as well22020-02-01 17:15:51JosephNuthalapatiAdd comparison with Syncthing12020-02-01 17:08:21JosephNuthalapatiFirst draft
Samba (Network File Storage)Samba lets you have shared folders over the local network that can be used from multiple computers running different operating systems. We refer to these shared folders as "shares". You can have a personal folder shared between your own devices (Home share), a folder shared with a trusted group (Group share) or one that is shared with every device on the network (Open share). Samba lets you to treat a share as if it's a local folder on your computer. However, shares are available only on the local network. To learn more about Samba, please refer to the user documentation on their wiki. Available since version: 19.22
Using SambaAfter installation, you can choose which disks to use for sharing. Enabled shares are accessible in the file manager on your computer at location \\freedombox (on Windows) or smb://freedombox.local (on Linux and Mac). There are three types of shares you can choose from: Open share - accessible to everyone in your local network. Group share - accessible only to FreedomBox users who are in the freedombox-share group. Home share - every user in the freedombox-share group can have their own private space.
On AndroidTo access Samba shares on an Android device, install "Android Samba Client" from F-Droid or Google Play. Enter smb://freedombox.local/<disk> as the share path in the app. Your shared folders should then be visible in the file manager app. Samba shares can also be used by VLC for Android which automatically discovers them.
Integration with other appsTransmission app on FreedomBox provides a setting to allow downloads to be saved directly to a Samba share. If you want to make available files synchronized with Syncthing through Samba you need to make sure you synchronize in a Samba share folder. Additionally in order to make Syncthing shares available in Samba Open share or Group share you will need to ensure you click "Permissions > Ignore" button under the "Advanced" tab in folder you wish in the Syncthing web UI. This will ensure that the files will be writable through Samba.
Comparison with other apps
SyncthingSyncthing maintains a copy of the shared folder on each device that it is shared with. Samba maintains only one copy on your FreedomBox device. Syncthing can synchronize your shared folders between devices over the Internet. Samba shares are only available on the local network. Since Syncthing is primarily a synchronization solution, it has features like conflict resolution and versioning. Samba has only copy of the file, so it doesn't need such features. For example, if two people are editing a spreadsheet stored on a Samba share, the last one to save the file wins. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Searx.raw.xml b/doc/manual/en/Searx.raw.xml index 229429389..4f8340234 100644 --- a/doc/manual/en/Searx.raw.xml +++ b/doc/manual/en/Searx.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Searx92020-04-12 16:07:28JamesValleroyadd links back to top level pages82019-05-22 17:08:56David JonesAdded information that SearX is accessible via Tor.72018-11-01 09:17:25JosephNuthalapatiAdd ToC62018-03-08 15:08:44JosephNuthalapatiAdd screenshot. Remove last 20 seconds from screencast to reduce size.52018-03-08 14:23:24JosephNuthalapatiAdd query param to make the video play within the browser42018-03-07 20:43:27Drahtseil32018-03-07 20:37:05DrahtseilScreencast of the installation and first steps22018-02-26 17:15:26JamesValleroyincluded in 0.2412018-02-22 12:12:50JosephNuthalapatisearx: Initial draft
Web Search (Searx)
About SearxSearx is a metasearch engine. A metasearch engine aggregates the results from various search engines and presents them in a unified interface. Read more about Searx on their official website. Available since: version 0.24.0
ScreenshotSearx Screenshot
ScreencastSearx installation and first steps (14 MB)
Why use Searx?
Personalization and Filter BubblesSearch engines have the ability to profile users and serve results most relevant to them, putting people into filter bubbles, thus distorting people's view of the world. Search engines have a financial incentive to serve interesting advertisements to their users, increasing their chances of clicking on the advertisements. A metasearch engine is a possible solution to this problem, as it aggregates results from multiple search engines thus bypassing personalization attempts by search engines. Searx avoids storing cookies from search engines as a means of preventing tracking and profiling by search engines.
Advertisement filteringSearx filters out advertisements from the search results before serving the results, thus increasing relevance the of your search results and saving you from distractions.
PrivacySearx uses HTTP POST instead of GET by default to send your search queries to the search engines, so that anyone snooping your traffic wouldn't be able to read your queries. The search queries wouldn't stored in browser history either. Note: Searx used from Chrome browser's omnibar would make GET requests instead of POST.
Searx on FreedomBoxSearx on FreedomBox uses Single Sign On. This means that you should be logged in into your FreedomBox in the browser that you're using Searx. SearX is easily accessible via Tor. Searx can be added as a search engine to the Firefox browser's search bar. See Firefox Help on this topic. Once Searx is added, you can also set it as your default search engine. Searx also offers search results in csv, json and rss formats, which can be used with scripts to automate some tasks. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Searx112020-05-30 18:12:17SunilMohanAdapaUpdate the title to emphasize app name over its generic name102020-05-23 19:40:54JamesValleroymove TableOfContents above BEGIN_INCLUDE92020-04-12 16:07:28JamesValleroyadd links back to top level pages82019-05-22 17:08:56David JonesAdded information that SearX is accessible via Tor.72018-11-01 09:17:25JosephNuthalapatiAdd ToC62018-03-08 15:08:44JosephNuthalapatiAdd screenshot. Remove last 20 seconds from screencast to reduce size.52018-03-08 14:23:24JosephNuthalapatiAdd query param to make the video play within the browser42018-03-07 20:43:27Drahtseil32018-03-07 20:37:05DrahtseilScreencast of the installation and first steps22018-02-26 17:15:26JamesValleroyincluded in 0.2412018-02-22 12:12:50JosephNuthalapatisearx: Initial draft
Searx (Web Search)
About SearxSearx is a metasearch engine. A metasearch engine aggregates the results from various search engines and presents them in a unified interface. Read more about Searx on their official website. Available since: version 0.24.0
ScreenshotSearx Screenshot
ScreencastSearx installation and first steps (14 MB)
Why use Searx?
Personalization and Filter BubblesSearch engines have the ability to profile users and serve results most relevant to them, putting people into filter bubbles, thus distorting people's view of the world. Search engines have a financial incentive to serve interesting advertisements to their users, increasing their chances of clicking on the advertisements. A metasearch engine is a possible solution to this problem, as it aggregates results from multiple search engines thus bypassing personalization attempts by search engines. Searx avoids storing cookies from search engines as a means of preventing tracking and profiling by search engines.
Advertisement filteringSearx filters out advertisements from the search results before serving the results, thus increasing relevance the of your search results and saving you from distractions.
PrivacySearx uses HTTP POST instead of GET by default to send your search queries to the search engines, so that anyone snooping your traffic wouldn't be able to read your queries. The search queries wouldn't stored in browser history either. Note: Searx used from Chrome browser's omnibar would make GET requests instead of POST.
Searx on FreedomBoxSearx on FreedomBox uses Single Sign On. This means that you should be logged in into your FreedomBox in the browser that you're using Searx. SearX is easily accessible via Tor. Searx can be added as a search engine to the Firefox browser's search bar. See Firefox Help on this topic. Once Searx is added, you can also set it as your default search engine. Searx also offers search results in csv, json and rss formats, which can be used with scripts to automate some tasks. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/SecureShell.raw.xml b/doc/manual/en/SecureShell.raw.xml index d0e74d12c..24fbceb0a 100644 --- a/doc/manual/en/SecureShell.raw.xml +++ b/doc/manual/en/SecureShell.raw.xml @@ -1,4 +1,4 @@ -
FreedomBox/Manual/SecureShell162020-04-12 16:07:49JamesValleroyadd links back to top level pages152020-04-04 20:22:52fioddorPlinth as FreedomBox's web interface142020-04-04 20:03:23fioddorPlinth as FreedomBox's web interface132019-11-11 17:01:45JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service122019-02-26 03:46:55JamesValleroyremove wiki links112018-01-30 07:55:33SunilMohanAdapaUpdate GitHub links with Salsa102017-03-06 23:17:08JamesValleroyadd note92016-10-13 21:49:06David JonesAdded infromation about connecting to the FBX using ssh over Tor82016-10-13 21:09:31David JonesAdded information about admin account for first log in to Plinth72016-09-05 09:42:36ElViroloRemoving my previous contribution, as info already present in original version.62016-09-05 09:39:05ElVirolo52016-09-05 09:26:15ElViroloAdded "Users created via Plinth" paragraph42015-12-21 19:42:10JamesValleroyupdate default account32015-12-21 19:33:56JamesValleroyfix outline level22015-12-15 19:31:18PhilippeBaretAdded definition title12015-09-16 16:22:37SunilMohanAdapaNew manual page for secure shell access
Secure Shell
What is Secure Shell?FreedomBox runs openssh-server server by default allowing remote logins from all interfaces. If your hardware device is connected to a monitor and a keyboard, you may login directly as well. Regular operation of FreedomBox does not require you to use the shell. However, some tasks or identifying a problem may require you to login to a shell.
Setting Up A User Account
Plinth First Log In: Admin AccountWhen creating an account in FreedomBox's web interface for the first time, this user will automatically have administrator capabilities. Admin users are able to log in using ssh (see Logging In below) and have superuser privileges via sudo.
Default User AccountNote: If you can access FreedomBox's web interface, then you don't need to do this. You can use the user account created in FreedomBox's web interface to connect to SSH. The pre-built FreedomBox images have a default user account called "fbx". However the password is not set for this account, so it will not be possible to log in with this account by default. There is a script included in the freedom-maker program, that will allow you to set the password for this account, if it is needed. To set a password for the "fbx" user: 1. Decompress the image file. 2. Get a copy of freedom-maker from . 3. Run sudo ./bin/passwd-in-image <image-file> fbx. 4. Copy the image file to SD card and boot device as normal. The "fbx" user also has superuser privileges via sudo.
Logging In
LocalTo login via SSH, to your FreedomBox: Replace fbx with the name of the user you wish to login as. freedombox should be replaced with the hostname or IP address of you FreedomBox device as found in the Quick Start process. fbx is the default user present on FreedomBox with superuser privileges. Any other user created using Plinth and belonging to the group admin will be able to login. The root account has no password set and will not be able to login. Access will be denied to all other users. fbx and users in admin group will also be able to login on the terminal directly. Other users will be denied access. If you repeatedly try to login as a user and fail, you will be blocked from logging in for some time. This is due to libpam-abl package that FreedomBox installs by default. To control this behavior consult libpam-abl documentation.
SSH over TorIf in Plinth you have enabled onion services via Tor, you can access your FreedomBox using ssh over Tor. On a GNU/Linux computer, install netcat-openbsd. Edit ~/.ssh/config to enable connections over Tor. Add the following:
FreedomBox/Manual/SecureShell192020-05-30 18:32:15SunilMohanAdapaMatch title with FreedomBox interface182020-05-23 20:45:18JamesValleroyadd TableOfContents172020-05-23 17:10:07JamesValleroyrename plinth -> freedombox162020-04-12 16:07:49JamesValleroyadd links back to top level pages152020-04-04 20:22:52fioddorPlinth as FreedomBox's web interface142020-04-04 20:03:23fioddorPlinth as FreedomBox's web interface132019-11-11 17:01:45JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service122019-02-26 03:46:55JamesValleroyremove wiki links112018-01-30 07:55:33SunilMohanAdapaUpdate GitHub links with Salsa102017-03-06 23:17:08JamesValleroyadd note92016-10-13 21:49:06David JonesAdded infromation about connecting to the FBX using ssh over Tor82016-10-13 21:09:31David JonesAdded information about admin account for first log in to Plinth72016-09-05 09:42:36ElViroloRemoving my previous contribution, as info already present in original version.62016-09-05 09:39:05ElVirolo52016-09-05 09:26:15ElViroloAdded "Users created via Plinth" paragraph42015-12-21 19:42:10JamesValleroyupdate default account32015-12-21 19:33:56JamesValleroyfix outline level22015-12-15 19:31:18PhilippeBaretAdded definition title12015-09-16 16:22:37SunilMohanAdapaNew manual page for secure shell access
Secure Shell (SSH) Sever
What is Secure Shell?FreedomBox runs openssh-server server by default allowing remote logins from all interfaces. If your hardware device is connected to a monitor and a keyboard, you may login directly as well. Regular operation of FreedomBox does not require you to use the shell. However, some tasks or identifying a problem may require you to login to a shell.
Setting Up A User Account
FreedomBox First Log In: Admin AccountWhen creating an account in FreedomBox's web interface for the first time, this user will automatically have administrator capabilities. Admin users are able to log in using ssh (see Logging In below) and have superuser privileges via sudo.
Default User AccountNote: If you can access FreedomBox's web interface, then you don't need to do this. You can use the user account created in FreedomBox's web interface to connect to SSH. The pre-built FreedomBox images have a default user account called "fbx". However the password is not set for this account, so it will not be possible to log in with this account by default. There is a script included in the freedom-maker program, that will allow you to set the password for this account, if it is needed. To set a password for the "fbx" user: 1. Decompress the image file. 2. Get a copy of freedom-maker from . 3. Run sudo ./bin/passwd-in-image <image-file> fbx. 4. Copy the image file to SD card and boot device as normal. The "fbx" user also has superuser privileges via sudo.
Logging In
LocalTo login via SSH, to your FreedomBox: Replace fbx with the name of the user you wish to login as. freedombox should be replaced with the hostname or IP address of you FreedomBox device as found in the Quick Start process. fbx is the default user present on FreedomBox with superuser privileges. Any other user created using FreedomBox and belonging to the group admin will be able to login. The root account has no password set and will not be able to login. Access will be denied to all other users. fbx and users in admin group will also be able to login on the terminal directly. Other users will be denied access. If you repeatedly try to login as a user and fail, you will be blocked from logging in for some time. This is due to libpam-abl package that FreedomBox installs by default. To control this behavior consult libpam-abl documentation.
SSH over TorIf in FreedomBox you have enabled onion services via Tor, you can access your FreedomBox using ssh over Tor. On a GNU/Linux computer, install netcat-openbsd. Edit ~/.ssh/config to enable connections over Tor. Add the following: Replace USERNAME with, e.g., an admin username (see above). Note that in some cases you may need to replace 9050 with 9150. Now to connect to the FreedomBox, open a terminal and type: Replace USERNAME with, e.g., an admin username, and ADDRESS with the onion service address for your FreedomBox.
Becoming SuperuserAfter logging in, if you want to become the superuser for performing administrative activities: Make a habit of logging in as root only when you need to. If you aren't logged in as root, you can't accidentally break everything.
Changing PasswordTo change the password of a user managed by FreedomBox's web interface, use the change password page. However, the fbx default user is not managed by FreedomBox's web interface and its password cannot be changed through it. To change password on the terminal, log in to your FreedomBox as the user whose password you want to change. Then, run the following command: This will ask you for your current password before giving you the opportunity to set a new one. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file + ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %p]]>
Replace USERNAME with, e.g., an admin username (see above). Note that in some cases you may need to replace 9050 with 9150. Now to connect to the FreedomBox, open a terminal and type: Replace USERNAME with, e.g., an admin username, and ADDRESS with the onion service address for your FreedomBox.
Becoming SuperuserAfter logging in, if you want to become the superuser for performing administrative activities: Make a habit of logging in as root only when you need to. If you aren't logged in as root, you can't accidentally break everything.
Changing PasswordTo change the password of a user managed by FreedomBox's web interface, use the change password page. However, the fbx default user is not managed by FreedomBox's web interface and its password cannot be changed through it. To change password on the terminal, log in to your FreedomBox as the user whose password you want to change. Then, run the following command: This will ask you for your current password before giving you the opportunity to set a new one. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Security.raw.xml b/doc/manual/en/Security.raw.xml index af10c46a0..ce205276c 100644 --- a/doc/manual/en/Security.raw.xml +++ b/doc/manual/en/Security.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Security32019-10-11 23:17:39SunilMohanAdapaClarify information regarding restricting console logins22016-08-31 17:40:56DrahtseilScreenshot12016-08-31 17:37:33Drahtseilcreation
SecurityWhen the Restrict console logins option is enabled, only users in the admin group will be able to log in via console, secure shell (SSH) or graphical login. When this option is disabled, any user with an account on FreedomBox will be able to log in. They may be able to access some services without further authorization. This option should only be disabled if all the users of the system are well trusted. If you wish to use your FreedomBox machine also as a desktop and allow non-admin users to login via GUI, this option must be disabled. You can define the list of users belonging to admin group in the Users section. Security.png Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Security32019-10-11 23:17:39SunilMohanAdapaClarify information regarding restricting console logins22016-08-31 17:40:56DrahtseilScreenshot12016-08-31 17:37:33Drahtseilcreation
SecurityWhen the Restrict console logins option is enabled, only users in the admin group will be able to log in via console, secure shell (SSH) or graphical login. When this option is disabled, any user with an account on FreedomBox will be able to log in. They may be able to access some services without further authorization. This option should only be disabled if all the users of the system are well trusted. If you wish to use your FreedomBox machine also as a desktop and allow non-admin users to login via GUI, this option must be disabled. You can define the list of users belonging to admin group in the Users section. Security.png Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/ServiceDiscovery.raw.xml b/doc/manual/en/ServiceDiscovery.raw.xml index cae82f54e..e8823810c 100644 --- a/doc/manual/en/ServiceDiscovery.raw.xml +++ b/doc/manual/en/ServiceDiscovery.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/ServiceDiscovery22017-01-02 13:17:40JamesValleroymention .local address12016-08-21 09:48:13DrahtseilCreated Service Discovery
Service DiscoveryService discovery allows other devices on the network to discover your FreedomBox and services running on it. If a client on the local network supports mDNS, it can find your FreedomBox at <hostname>.local (for example: freedombox.local). It also allows FreedomBox to discover other devices and services running on your local network. Service discovery is not essential and works only on internal networks. It may be disabled to improve security especially when connecting to a hostile local network. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/ServiceDiscovery22017-01-02 13:17:40JamesValleroymention .local address12016-08-21 09:48:13DrahtseilCreated Service Discovery
Service DiscoveryService discovery allows other devices on the network to discover your FreedomBox and services running on it. If a client on the local network supports mDNS, it can find your FreedomBox at <hostname>.local (for example: freedombox.local). It also allows FreedomBox to discover other devices and services running on your local network. Service discovery is not essential and works only on internal networks. It may be disabled to improve security especially when connecting to a hostile local network. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Shadowsocks.raw.xml b/doc/manual/en/Shadowsocks.raw.xml index d9af2e866..04e772845 100644 --- a/doc/manual/en/Shadowsocks.raw.xml +++ b/doc/manual/en/Shadowsocks.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Shadowsocks22019-05-10 22:54:33JamesValleroyremove wiki links12018-01-04 19:59:57David Jones
SOCKS5 proxy (Shadowsocks)
What is Shadowsocks?Shadowsocks is a lightweight and secure SOCKS5 proxy, designed to protect your Internet traffic. It can be used to bypass Internet filtering and censorship. Your FreedomBox can run a Shadowsocks client which can connect to a Shadowsocks server. It will also run a SOCKS5 proxy. Local devices can connect to this proxy, and their data will be encrypted and proxied through the Shadowsocks server. Note: Shadowsocks is available in FreedomBox starting with Plinth version 0.18.
Using the Shadowsocks client?The current implementation of Shadowsocks in FreedomBox only supports configuring FreedomBox as a Shadowsocks client. The current use case for Shadowsocks is as follows: Shadowsocks client (FreedomBox) is in a region where some parts of the Internet are blocked or censored. Shadowsocks server is in a different region, which doesn't have these blocks. The FreedomBox provides SOCKS proxy service on the local network for other devices to make use of its Shadowsocks connection. At a future date it will be possible to configure FreedomBox as Shadowsocks server.
Configuring your FreedomBox for the Shadowsocks clientTo enable Shadowsocks, first navigate to the Socks5 Proxy (Shadowsocks) page and install it. Server: the Shadowsocks server is not the FreedomBox IP or URL; rather, it will be another server or VPS that has been configured as a Shadowsocks server. There are also some public Shadowsocks servers listed on the web, but be aware that whoever operates the server can see where requests are going, and any non-encrypted data will be visible to them. To use Shadowsocks after setup, set the SOCKS5 proxy URL in your device, browser or application to Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Shadowsocks52020-05-30 18:09:03SunilMohanAdapaUpdate the title to emphasize app name over its generic name42020-05-23 19:56:36JamesValleroyadd TableOfContents32020-05-23 17:04:27JamesValleroyremove redundant reference to Plinth22019-05-10 22:54:33JamesValleroyremove wiki links12018-01-04 19:59:57David Jones
Shadowsocks (SOCKS5 proxy)
What is Shadowsocks?Shadowsocks is a lightweight and secure SOCKS5 proxy, designed to protect your Internet traffic. It can be used to bypass Internet filtering and censorship. Your FreedomBox can run a Shadowsocks client which can connect to a Shadowsocks server. It will also run a SOCKS5 proxy. Local devices can connect to this proxy, and their data will be encrypted and proxied through the Shadowsocks server. Note: Shadowsocks is available in FreedomBox starting with version 0.18.
Using the Shadowsocks client?The current implementation of Shadowsocks in FreedomBox only supports configuring FreedomBox as a Shadowsocks client. The current use case for Shadowsocks is as follows: Shadowsocks client (FreedomBox) is in a region where some parts of the Internet are blocked or censored. Shadowsocks server is in a different region, which doesn't have these blocks. The FreedomBox provides SOCKS proxy service on the local network for other devices to make use of its Shadowsocks connection. At a future date it will be possible to configure FreedomBox as Shadowsocks server.
Configuring your FreedomBox for the Shadowsocks clientTo enable Shadowsocks, first navigate to the Socks5 Proxy (Shadowsocks) page and install it. Server: the Shadowsocks server is not the FreedomBox IP or URL; rather, it will be another server or VPS that has been configured as a Shadowsocks server. There are also some public Shadowsocks servers listed on the web, but be aware that whoever operates the server can see where requests are going, and any non-encrypted data will be visible to them. To use Shadowsocks after setup, set the SOCKS5 proxy URL in your device, browser or application to Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Snapshots.raw.xml b/doc/manual/en/Snapshots.raw.xml index eb7cef0b1..6be89319c 100644 --- a/doc/manual/en/Snapshots.raw.xml +++ b/doc/manual/en/Snapshots.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Snapshots22018-03-10 15:11:41JosephNuthalapatiFix oversized image12017-11-14 02:24:01JamesValleroynew page for snapshots module
SnapshotsSnapshots allows you to create filesystem snapshots, and rollback the system to a previous snapshot. Note: This feature requires a Btrfs filesystem. All of the FreedomBox stable disk images use Btrfs. Snapshots Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Snapshots32020-05-30 18:33:06SunilMohanAdapaMatch title with FreedomBox interface22018-03-10 15:11:41JosephNuthalapatiFix oversized image12017-11-14 02:24:01JamesValleroynew page for snapshots module
Storage SnapshotsSnapshots allows you to create filesystem snapshots, and rollback the system to a previous snapshot. Note: This feature requires a Btrfs filesystem. All of the FreedomBox stable disk images use Btrfs. Snapshots Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Storage.raw.xml b/doc/manual/en/Storage.raw.xml index daf178d0b..0744b4087 100644 --- a/doc/manual/en/Storage.raw.xml +++ b/doc/manual/en/Storage.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Storage112018-12-18 00:01:12JamesValleroyfix screenshot parameter102018-12-04 06:20:20JosephNuthalapatiRestrict screenshot width to 800px92018-09-25 06:01:56JosephNuthalapatiUpdate description to match current functionality82018-09-25 05:51:15JosephNuthalapatiReplace screenshot with the latest version72018-03-05 12:17:19JosephNuthalapatiRenamed from 'FreedomBox/Manual/Disks'.62018-03-05 12:16:41JosephNuthalapatiRenaming Disks to Storage52017-04-09 13:45:57JamesValleroyupdate note about issue42017-03-31 20:16:25Drahtseilupdate screenshot with "expand partition"32017-02-10 22:33:01JamesValleroyadd warning about non-functional feature22016-08-31 17:10:11Drahtseilscreenshot12016-08-31 17:09:10DrahtseilDisks creation
StorageStorage allows you to see the storage devices attached to your FreedomBox and their disk space usage. FreedomBox can automatically detect and mount removable media like USB flash drives. They are listed under the Removable Devices section along with an option to eject them. If there is some free space left after the root partition, the option to expand the root partition is also available. This is typically not shown, since expanding the root partition happens automatically when the FreedomBox starts up for the first time. Storage.png Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Storage122020-05-24 02:11:30SunilMohanAdapaAdd advanced storage operations section referring to Cockpit112018-12-18 00:01:12JamesValleroyfix screenshot parameter102018-12-04 06:20:20JosephNuthalapatiRestrict screenshot width to 800px92018-09-25 06:01:56JosephNuthalapatiUpdate description to match current functionality82018-09-25 05:51:15JosephNuthalapatiReplace screenshot with the latest version72018-03-05 12:17:19JosephNuthalapatiRenamed from 'FreedomBox/Manual/Disks'.62018-03-05 12:16:41JosephNuthalapatiRenaming Disks to Storage52017-04-09 13:45:57JamesValleroyupdate note about issue42017-03-31 20:16:25Drahtseilupdate screenshot with "expand partition"32017-02-10 22:33:01JamesValleroyadd warning about non-functional feature22016-08-31 17:10:11Drahtseilscreenshot12016-08-31 17:09:10DrahtseilDisks creation
StorageStorage allows you to see the storage devices attached to your FreedomBox and their disk space usage. FreedomBox can automatically detect and mount removable media like USB flash drives. They are listed under the Removable Devices section along with an option to eject them. If there is some free space left after the root partition, the option to expand the root partition is also available. This is typically not shown, since expanding the root partition happens automatically when the FreedomBox starts up for the first time. Storage.png
Advanced Storage OperationsCockpit provides many advanced storage features over those offered by FreedomBox. Both FreedomBox and Cockpit operate over Udisks2 storage daemon and are hence compatible with each other. Some of the functions provided by Cockpit include: Format a disk or partition with a fresh filesystem Add, remove partitions or wipe the partition table Create and unlock encrypted file systems Create and manage RAID devices storage-cockpit.png Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Syncthing.raw.xml b/doc/manual/en/Syncthing.raw.xml index 8ad0418a8..775f2bd9a 100644 --- a/doc/manual/en/Syncthing.raw.xml +++ b/doc/manual/en/Syncthing.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Syncthing182019-11-11 17:00:38JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service172019-11-01 01:09:33JosephNuthalapatiMinor formatting changes162019-10-31 15:01:33JosephNuthalapatiMinor change to headings152019-10-31 14:42:33JosephNuthalapatiAdd synchronized password manager142019-10-27 05:53:05JosephNuthalapatiAdd tip to avoid using Syncthing relays132019-09-11 15:33:32fioddorCode decoration122019-06-09 11:07:46David Jones112019-06-09 11:00:48David Jonesadded information about syncthing and tor hidden service102018-03-10 04:32:57JosephNuthalapatiFix oversized image92017-10-22 14:57:58Drahtseil82017-10-22 14:57:09DrahtseilSyncthing GUI image72017-10-22 14:54:54DrahtseilSome rewording etc.62017-10-21 14:59:53DrahtseilTitel same as in Plinth GUI; standard footer; some basic restructuring before I will update the docu more in detail52017-04-04 10:39:36JosephNuthalapati42017-03-23 10:54:49JosephNuthalapatiRewrote the section on Syncthing's role in FreedomBox32017-03-23 05:12:13SunilMohanAdapaMinor formatting22017-03-23 05:11:43SunilMohanAdapaAdd note about availability of Syncthing12017-03-23 02:11:00JosephNuthalapatiCreated wiki page for Syncthing
File Synchronization (Syncthing)With Syncthing installed on your FreedomBox, you can synchronize content from other devices to your FreedomBox and vice-versa. For example, you can keep the photos taken on your mobile phone synchronized to your FreedomBox. Available since version: 0.14 Users should keep in mind that Syncthing is a peer-to-peer synchronization solution, not a client-server one. This means that the FreedomBox isn't really the server and your other devices clients. They're all devices from Syncthing's perspective. You can use Syncthing to synchronize your files between any of your devices. The advantage that FreedomBox provides is that it is a server that's always running. Suppose you want your photos on your phone to be synchronized to your laptop, if you simply sync the photos to the FreedomBox, the laptop can get them from the FreedomBox whenever it comes online the next time. You don't have to be worried about your other devices being online for synchronization. If your FreedomBox is one of the devices set up with your Syncthing shared folder, you can rest assured that your other devices will eventually get the latest files once they come online. After installation follow the instructions in the getting started of the Syncthing project. Syncthing allows individual folders to be selectively shared with other devices. Devices must be paired up before sharing by scanning QR codes or entering the device ids manually. Syncthing has a discovery service for easily identifying the other devices on the same network having Syncthing installed. In order to access to the web client of the Syncthing instance running on your FreedomBox, use the path /syncthing. This web client is currently only accessible to the users of the FreedomBox that have administrator privileges, though it might be accessible to all FreedomBox users in a future release. Syncthing web interface Syncthing has android apps available on the F-Droid and Google Play app stores. Cross-platform desktop apps are also available. To learn more about Syncthing, please visit their official website and documentation.
Synchronizing over TorSyncthing should automatically sync with your FreedomBox even if it is only accessible as a Tor Onion Service. If you would like to proxy your Syncthing client over Tor, set the all_proxy environment variable: For more information, see the Syncthing documentation on using proxies.
Avoiding Syncthing RelaysSyncthing uses dynamic connections by default to connect with other peers. This means that if you are synchronizing over the Internet, the data might have to go through public Syncthing relays to reach your devices. This doesn't take advantage of the fact that your FreedomBox has a public IP address. When adding your FreedomBox as a device in other Syncthing clients, set the address like "tcp://<my.freedombox.domain>" instead of "dynamic". This allows your Syncthing peers to directly connect to your FreedomBox avoiding the need for relays. It also allows for fast on-demand syncing if you don't want to keep Syncthing running all the time on your mobile devices.
Using Syncthing with other applications
Password ManagerPassword managers that store their databases in files are suitable for synchronization using Syncthing. The following example describes using a free password manager called KeePassXC in combination with Syncthing to serve as a replacement for proprietary password managers that store your passwords in the cloud. KeePassXC stores usernames, passwords etc. in files have the .kdbx extension. These kdbx files can be stored in a Syncthing shared folder to keep them synchronized on multiple machines. Free software applications which can read this file format are available for both desktop and mobile. You typically have to just point the application at the .kdbx file and enter the master password to access your stored credentials. For example, the same kdbx file can be accessed by using KeePassXC on desktop and KeePassDX on Android. KeePassXC can also be used to fill credentials into login fields in the browser by installing a browser extension. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Syncthing202020-05-30 18:00:50SunilMohanAdapaUpdate the title to emphasize app name over its generic name192020-05-23 19:53:08JamesValleroyadd TableOfContents182019-11-11 17:00:38JosephNuthalapatiRename Tor Hidden Service to Tor Onion Service172019-11-01 01:09:33JosephNuthalapatiMinor formatting changes162019-10-31 15:01:33JosephNuthalapatiMinor change to headings152019-10-31 14:42:33JosephNuthalapatiAdd synchronized password manager142019-10-27 05:53:05JosephNuthalapatiAdd tip to avoid using Syncthing relays132019-09-11 15:33:32fioddorCode decoration122019-06-09 11:07:46David Jones112019-06-09 11:00:48David Jonesadded information about syncthing and tor hidden service102018-03-10 04:32:57JosephNuthalapatiFix oversized image92017-10-22 14:57:58Drahtseil82017-10-22 14:57:09DrahtseilSyncthing GUI image72017-10-22 14:54:54DrahtseilSome rewording etc.62017-10-21 14:59:53DrahtseilTitel same as in Plinth GUI; standard footer; some basic restructuring before I will update the docu more in detail52017-04-04 10:39:36JosephNuthalapati42017-03-23 10:54:49JosephNuthalapatiRewrote the section on Syncthing's role in FreedomBox32017-03-23 05:12:13SunilMohanAdapaMinor formatting22017-03-23 05:11:43SunilMohanAdapaAdd note about availability of Syncthing12017-03-23 02:11:00JosephNuthalapatiCreated wiki page for Syncthing
Syncthing (File Synchronization)With Syncthing installed on your FreedomBox, you can synchronize content from other devices to your FreedomBox and vice-versa. For example, you can keep the photos taken on your mobile phone synchronized to your FreedomBox. Available since version: 0.14 Users should keep in mind that Syncthing is a peer-to-peer synchronization solution, not a client-server one. This means that the FreedomBox isn't really the server and your other devices clients. They're all devices from Syncthing's perspective. You can use Syncthing to synchronize your files between any of your devices. The advantage that FreedomBox provides is that it is a server that's always running. Suppose you want your photos on your phone to be synchronized to your laptop, if you simply sync the photos to the FreedomBox, the laptop can get them from the FreedomBox whenever it comes online the next time. You don't have to be worried about your other devices being online for synchronization. If your FreedomBox is one of the devices set up with your Syncthing shared folder, you can rest assured that your other devices will eventually get the latest files once they come online. After installation follow the instructions in the getting started of the Syncthing project. Syncthing allows individual folders to be selectively shared with other devices. Devices must be paired up before sharing by scanning QR codes or entering the device ids manually. Syncthing has a discovery service for easily identifying the other devices on the same network having Syncthing installed. In order to access to the web client of the Syncthing instance running on your FreedomBox, use the path /syncthing. This web client is currently only accessible to the users of the FreedomBox that have administrator privileges, though it might be accessible to all FreedomBox users in a future release. Syncthing web interface Syncthing has android apps available on the F-Droid and Google Play app stores. Cross-platform desktop apps are also available. To learn more about Syncthing, please visit their official website and documentation.
Synchronizing over TorSyncthing should automatically sync with your FreedomBox even if it is only accessible as a Tor Onion Service. If you would like to proxy your Syncthing client over Tor, set the all_proxy environment variable: For more information, see the Syncthing documentation on using proxies.
Avoiding Syncthing RelaysSyncthing uses dynamic connections by default to connect with other peers. This means that if you are synchronizing over the Internet, the data might have to go through public Syncthing relays to reach your devices. This doesn't take advantage of the fact that your FreedomBox has a public IP address. When adding your FreedomBox as a device in other Syncthing clients, set the address like "tcp://<my.freedombox.domain>" instead of "dynamic". This allows your Syncthing peers to directly connect to your FreedomBox avoiding the need for relays. It also allows for fast on-demand syncing if you don't want to keep Syncthing running all the time on your mobile devices.
Using Syncthing with other applications
Password ManagerPassword managers that store their databases in files are suitable for synchronization using Syncthing. The following example describes using a free password manager called KeePassXC in combination with Syncthing to serve as a replacement for proprietary password managers that store your passwords in the cloud. KeePassXC stores usernames, passwords etc. in files have the .kdbx extension. These kdbx files can be stored in a Syncthing shared folder to keep them synchronized on multiple machines. Free software applications which can read this file format are available for both desktop and mobile. You typically have to just point the application at the .kdbx file and enter the master password to access your stored credentials. For example, the same kdbx file can be accessed by using KeePassXC on desktop and KeePassDX on Android. KeePassXC can also be used to fill credentials into login fields in the browser by installing a browser extension. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/TinyTinyRSS.raw.xml b/doc/manual/en/TinyTinyRSS.raw.xml index bde3a549a..6aa310648 100644 --- a/doc/manual/en/TinyTinyRSS.raw.xml +++ b/doc/manual/en/TinyTinyRSS.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/TinyTinyRSS102018-03-11 03:05:29JosephNuthalapatiFix oversized images92017-10-18 13:51:27JosephNuthalapatiRemove link to source code as this wiki seems to have banned anything that starts with git.tt82017-10-18 13:47:46JosephNuthalapatiAdd importing OPML feeds and link to source code of TT-RSS Android App72017-10-18 12:58:46JosephNuthalapatiAdd documentation for automatic detection of RSS feeds and the Unsubscribe option62017-10-18 12:37:03JosephNuthalapatiAdd screenshots for subscribing to a new RSS feed52017-10-16 12:11:52SunilMohanAdapaMinor styling42017-10-16 12:08:36SunilMohanAdapaAdd information about mobile application32016-12-31 03:49:54JamesValleroyadd screenshot22016-12-31 03:44:56JamesValleroyadd user info12016-09-04 10:18:59Drahtseilstub created
News Feed Reader (Tiny Tiny RSS)Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, designed to allow reading news from any location, while feeling as close to a real desktop application as possible. Any user created through FreedomBox web interface will be able to login and use this app. Each user has their own feeds, state and preferences.
Using the Web InterfaceWhen enabled, Tiny Tiny RSS will be available from /tt-rss path on the web server. Any user created through Plinth will be able to login and use this app. Tiny Tiny RSS
Adding a new feed1. Go to the website you want the RSS feed for and copy the RSS/Atom feed link from it. Selecting feeds 2. Select "Subscribe to feed.." from the Actions dropdown. Subscribe to feed 3. In the dialog box that appears, paste the URL for copied in step 1 and click the Subscribe button. Subscription dialog box Give the application a minute to fetch the feeds after clicking Subscribe. In some websites, the RSS feeds button isn't clearly visible. In that case, you can simply paste the website URL into the Subscribe dialog (step 3) and let TT-RSS automatically detect the RSS feeds on the page. You can try this now with the homepage of WikiNews As you can see in the image below, TT-RSS detected and added the Atom feed of WikiNews to our list of feeds. WikiNews feed added If you don't want to keep this feed, right click on the feed shown in the above image, select Edit feed and click Unsubscribe in the dialog box that appears. Unsubscribe from a feed
Importing your feeds from another feed readerIn your existing feed reader, find an option to Export your feeds to a file. Prefer the OPML file format if you have to choose between multiple formats. Let's say your exported feeds file is called Subscriptions.opml Click on the Actions menu at the top left corner and select Preferences. You will be taken to another page. Select the second tab called Feeds in the top header. Feeds has several sections. The second one is called OPML. Select it. OPML feeds page To import your Subscriptions.opml file into TT-RSS, Click Browse and select the file from your file system Click Import my OPML After importing, you'll be taken to the Feeds section that's above the OPML section in the page. You can see that the feeds from your earlier feed reader are now imported into Tiny Tiny RSS. You can now start using Tiny Tiny RSS as your primary feed reader. In the next section, we will discuss setting up the mobile app, which can let you read your feeds on the go.
Using the Mobile AppThe official Android app from the Tiny Tiny RSS project works with FreedomBox's Tiny Tiny RSS Server. The older TTRSS-Reader application is known not to work. The official Android app is unfortunately only available on the Google Play Store and not on F-Droid. You can still obtain the source code and build the apk file yourself. To configure, first install the application, then in the setting page, set URL as . Set your user name and password in the Login details as well as HTTP Authentication details. If your FreedomBox does not have a valid HTTPS certificate, then in settings request allowing any SSL certificate and any host. Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/TinyTinyRSS132020-05-30 18:06:10SunilMohanAdapaUpdate the title to emphasize app name over its generic name122020-05-23 19:55:19JamesValleroyadd TableOfContents112020-05-23 17:03:46JamesValleroyrename plinth -> freedombox102018-03-11 03:05:29JosephNuthalapatiFix oversized images92017-10-18 13:51:27JosephNuthalapatiRemove link to source code as this wiki seems to have banned anything that starts with git.tt82017-10-18 13:47:46JosephNuthalapatiAdd importing OPML feeds and link to source code of TT-RSS Android App72017-10-18 12:58:46JosephNuthalapatiAdd documentation for automatic detection of RSS feeds and the Unsubscribe option62017-10-18 12:37:03JosephNuthalapatiAdd screenshots for subscribing to a new RSS feed52017-10-16 12:11:52SunilMohanAdapaMinor styling42017-10-16 12:08:36SunilMohanAdapaAdd information about mobile application32016-12-31 03:49:54JamesValleroyadd screenshot22016-12-31 03:44:56JamesValleroyadd user info12016-09-04 10:18:59Drahtseilstub created
Tiny Tiny RSS (News Feed Reader)Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, designed to allow reading news from any location, while feeling as close to a real desktop application as possible. Any user created through FreedomBox web interface will be able to login and use this app. Each user has their own feeds, state and preferences.
Using the Web InterfaceWhen enabled, Tiny Tiny RSS will be available from /tt-rss path on the web server. Any user created through FreedomBox will be able to login and use this app. Tiny Tiny RSS
Adding a new feed1. Go to the website you want the RSS feed for and copy the RSS/Atom feed link from it. Selecting feeds 2. Select "Subscribe to feed.." from the Actions dropdown. Subscribe to feed 3. In the dialog box that appears, paste the URL for copied in step 1 and click the Subscribe button. Subscription dialog box Give the application a minute to fetch the feeds after clicking Subscribe. In some websites, the RSS feeds button isn't clearly visible. In that case, you can simply paste the website URL into the Subscribe dialog (step 3) and let TT-RSS automatically detect the RSS feeds on the page. You can try this now with the homepage of WikiNews As you can see in the image below, TT-RSS detected and added the Atom feed of WikiNews to our list of feeds. WikiNews feed added If you don't want to keep this feed, right click on the feed shown in the above image, select Edit feed and click Unsubscribe in the dialog box that appears. Unsubscribe from a feed
Importing your feeds from another feed readerIn your existing feed reader, find an option to Export your feeds to a file. Prefer the OPML file format if you have to choose between multiple formats. Let's say your exported feeds file is called Subscriptions.opml Click on the Actions menu at the top left corner and select Preferences. You will be taken to another page. Select the second tab called Feeds in the top header. Feeds has several sections. The second one is called OPML. Select it. OPML feeds page To import your Subscriptions.opml file into TT-RSS, Click Browse and select the file from your file system Click Import my OPML After importing, you'll be taken to the Feeds section that's above the OPML section in the page. You can see that the feeds from your earlier feed reader are now imported into Tiny Tiny RSS. You can now start using Tiny Tiny RSS as your primary feed reader. In the next section, we will discuss setting up the mobile app, which can let you read your feeds on the go.
Using the Mobile AppThe official Android app from the Tiny Tiny RSS project works with FreedomBox's Tiny Tiny RSS Server. The older TTRSS-Reader application is known not to work. The official Android app is unfortunately only available on the Google Play Store and not on F-Droid. You can still obtain the source code and build the apk file yourself. To configure, first install the application, then in the setting page, set URL as . Set your user name and password in the Login details as well as HTTP Authentication details. If your FreedomBox does not have a valid HTTPS certificate, then in settings request allowing any SSL certificate and any host. Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Tor.raw.xml b/doc/manual/en/Tor.raw.xml index b6a4e97bf..b299f5703 100644 --- a/doc/manual/en/Tor.raw.xml +++ b/doc/manual/en/Tor.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Tor232019-11-28 22:24:36SunilMohanAdapaUpdate link to Tor Relay Guide Closes freedom-maker#169, thanks to Jamie Campbell222019-11-11 16:55:49JosephNuthalapatiRename Hidden Service to Onion Service212019-10-27 06:23:30JosephNuthalapatiAdd screenshot for using Tor SOCKS proxy with Firefox202019-10-27 06:18:47JosephNuthalapatiAdd example for using Tor SOCKS proxy with Firefox192019-06-09 10:47:56David Jonesadded two more apps to list182019-05-22 17:10:34David JonesCorrected formatting; added transition sentence.172019-05-22 17:05:45David JonesStarted a list of apps accessible via Tor162018-12-30 19:13:56Drahtseilrelay requirements152018-03-19 06:27:56JosephNuthalapatiAdd section on circumventing tor censorship142018-03-19 06:25:43JosephNuthalapatiAdd section on circumventing tor censorship132017-01-07 16:00:24JamesValleroyadd image122017-01-07 15:21:27JamesValleroyplural112016-12-31 02:19:46JamesValleroymention ssh102016-12-31 02:19:03JamesValleroyadd relay info92016-12-23 18:31:29JamesValleroyundo outline level change82016-12-23 18:30:06JamesValleroymove down outline level72016-04-10 07:14:17PhilippeBaretAdded bottom navigation link62015-12-15 16:54:58PhilippeBaretText finishing52015-12-15 16:40:11PhilippeBaret42015-12-15 16:34:38PhilippeBaretAdded Tor definition32015-09-13 14:54:59SunilMohanAdapaDemote headings one level for inclusion into manual22015-09-13 14:53:54SunilMohanAdapaAdd FreedomBox category and portal12015-09-12 15:55:05JamesValleroycreate tor page
Anonymity Network (Tor)
What is Tor?Tor is a network of servers operated by volunteers. It allows users of these servers to improve their privacy and security while surfing on the Internet. You and your friends are able to access to your FreedomBox via Tor network without revealing its IP address. Activating Tor application on your FreedomBox, you will be able to offer remote services (chat, wiki, file sharing, etc...) without showing your location. This application will give you a better protection than a public web server because you will be less exposed to intrusive people on the web.
Using Tor to browse anonymouslyTor Browser is the recommended way to browse the web using Tor. You can download the Tor Browser from and follow the instructions on that site to install and run it.
Using Tor Onion Service to access your FreedomBoxTor Onion Service provides a way to access your FreedomBox, even if it's behind a router, firewall, or carrier-grade NAT (i.e., your Internet Service Provider does not provide a public IPv4 address for your router). To enable Tor Onion Service, first navigate to the Anonymity Network (Tor) page. (If you don't see it, click on the FreedomBox logo at the top-left of the page, to go to the main Apps page.) On the Anonymity Network (Tor) page, under Configuration, check "Enable Tor Onion Service", then press the Update setup button. Tor will be reconfigured and restarted. After a while, the page will refresh and under Status, you will see a table listing the Onion Service .onion address. Copy the entire address (ending in .onion) and paste it into the Tor Browser's address field, and you should be able to access your FreedomBox. (You may see a certificate warning because FreedomBox has a self-signed certificate.) Tor Browser - Plinth Currently only HTTP (port 80), HTTPS (port 443), and SSH (port 22) are accessible through the Tor Onion Service configured on the FreedomBox.
Apps accessible via TorThe following apps can be accessed over Tor. Note that this list is not exhaustive. Calendar and Addressbook (Radicale) File Synchronization (Syncthing) Feed reader (TinyTinyRSS) Web Search (Searx) Wiki (MediaWiki) Wiki and Blog (Ikiwiki)
Running a Tor relayWhen Tor is installed, it is configured by default to run as a bridge relay. The relay or bridge option can be disabled through the Tor configuration page in Plinth. At the bottom of the Tor page in Plinth, there is a list of ports used by the Tor relay. If your FreedomBox is behind a router, you will need to configure port forwarding on your router so that these ports can be reached from the public Internet. The requirements to run a relay are listed in the Tor Relay Guide. In short, it is recommended that a relay has at least 16 Mbit/s (Mbps) upload and download bandwidth available for Tor. More is better. required that a Tor relay be allowed to use a minimum of 100 GByte of outbound and of incoming traffic per month. recommended that a <40 Mbit/s non-exit relay should have at least 512 MB of RAM available; A relay faster than 40 Mbit/s should have at least 1 GB of RAM.
(Advanced) Usage as a SOCKS proxyFreedomBox provides a Tor SOCKS port that other applications can connect to, in order to route their traffic over the Tor network. This port is accessible on any interfaces configured in the internal firewall zone. To configure the application, set SOCKS Host to the internal network connection's IP address, and set the SOCKS Port to 9050.
Example with FirefoxYour web browser can be configured to use the Tor network for all of your browsing activity. This allows for censorship circumvention and also hides your IP address from websites during regular browsing. For anonymity, using tor browser is recommended. Configure your local FreedomBox IP address and port 9050 as a SOCKS v5 proxy in Firefox. There are extensions to allow for easily turning the proxy on and off. Configuring Firefox with Tor SOCKS proxy With the SOCKS proxy configured, you can now access any onion URL directly from Firefox. FreedomBox itself has an onion v3 address that you can connect to over the Tor network (bookmark this for use in emergency situations).
Circumventing Tor censorshipIf your ISP is trying to block Tor traffic, you can use tor bridge relays to connect to the tor network. 1. Get the bridge configuration from the Tor BridgeDB Tor BridgeDB 2. Add the lines to your FreedomBox Tor configuration as show below. Tor Configuration Page Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Tor262020-05-30 17:52:23SunilMohanAdapaUpdate the title to emphasize app name over its generic name252020-05-23 19:44:12JamesValleroyadd TableOfContents242020-05-23 17:00:18JamesValleroyrename plinth -> freedombox232019-11-28 22:24:36SunilMohanAdapaUpdate link to Tor Relay Guide Closes freedom-maker#169, thanks to Jamie Campbell222019-11-11 16:55:49JosephNuthalapatiRename Hidden Service to Onion Service212019-10-27 06:23:30JosephNuthalapatiAdd screenshot for using Tor SOCKS proxy with Firefox202019-10-27 06:18:47JosephNuthalapatiAdd example for using Tor SOCKS proxy with Firefox192019-06-09 10:47:56David Jonesadded two more apps to list182019-05-22 17:10:34David JonesCorrected formatting; added transition sentence.172019-05-22 17:05:45David JonesStarted a list of apps accessible via Tor162018-12-30 19:13:56Drahtseilrelay requirements152018-03-19 06:27:56JosephNuthalapatiAdd section on circumventing tor censorship142018-03-19 06:25:43JosephNuthalapatiAdd section on circumventing tor censorship132017-01-07 16:00:24JamesValleroyadd image122017-01-07 15:21:27JamesValleroyplural112016-12-31 02:19:46JamesValleroymention ssh102016-12-31 02:19:03JamesValleroyadd relay info92016-12-23 18:31:29JamesValleroyundo outline level change82016-12-23 18:30:06JamesValleroymove down outline level72016-04-10 07:14:17PhilippeBaretAdded bottom navigation link62015-12-15 16:54:58PhilippeBaretText finishing52015-12-15 16:40:11PhilippeBaret42015-12-15 16:34:38PhilippeBaretAdded Tor definition32015-09-13 14:54:59SunilMohanAdapaDemote headings one level for inclusion into manual22015-09-13 14:53:54SunilMohanAdapaAdd FreedomBox category and portal12015-09-12 15:55:05JamesValleroycreate tor page
Tor (Anonymity Network)
What is Tor?Tor is a network of servers operated by volunteers. It allows users of these servers to improve their privacy and security while surfing on the Internet. You and your friends are able to access to your FreedomBox via Tor network without revealing its IP address. Activating Tor application on your FreedomBox, you will be able to offer remote services (chat, wiki, file sharing, etc...) without showing your location. This application will give you a better protection than a public web server because you will be less exposed to intrusive people on the web.
Using Tor to browse anonymouslyTor Browser is the recommended way to browse the web using Tor. You can download the Tor Browser from and follow the instructions on that site to install and run it.
Using Tor Onion Service to access your FreedomBoxTor Onion Service provides a way to access your FreedomBox, even if it's behind a router, firewall, or carrier-grade NAT (i.e., your Internet Service Provider does not provide a public IPv4 address for your router). To enable Tor Onion Service, first navigate to the Anonymity Network (Tor) page. (If you don't see it, click on the FreedomBox logo at the top-left of the page, to go to the main Apps page.) On the Anonymity Network (Tor) page, under Configuration, check "Enable Tor Onion Service", then press the Update setup button. Tor will be reconfigured and restarted. After a while, the page will refresh and under Status, you will see a table listing the Onion Service .onion address. Copy the entire address (ending in .onion) and paste it into the Tor Browser's address field, and you should be able to access your FreedomBox. (You may see a certificate warning because FreedomBox has a self-signed certificate.) Tor Configuration - FreedomBox Currently only HTTP (port 80), HTTPS (port 443), and SSH (port 22) are accessible through the Tor Onion Service configured on the FreedomBox.
Apps accessible via TorThe following apps can be accessed over Tor. Note that this list is not exhaustive. Calendar and Addressbook (Radicale) File Synchronization (Syncthing) Feed reader (TinyTinyRSS) Web Search (Searx) Wiki (MediaWiki) Wiki and Blog (Ikiwiki)
Running a Tor relayWhen Tor is installed, it is configured by default to run as a bridge relay. The relay or bridge option can be disabled through the Tor configuration page in FreedomBox. At the bottom of the Tor page in FreedomBox, there is a list of ports used by the Tor relay. If your FreedomBox is behind a router, you will need to configure port forwarding on your router so that these ports can be reached from the public Internet. The requirements to run a relay are listed in the Tor Relay Guide. In short, it is recommended that a relay has at least 16 Mbit/s (Mbps) upload and download bandwidth available for Tor. More is better. required that a Tor relay be allowed to use a minimum of 100 GByte of outbound and of incoming traffic per month. recommended that a <40 Mbit/s non-exit relay should have at least 512 MB of RAM available; A relay faster than 40 Mbit/s should have at least 1 GB of RAM.
(Advanced) Usage as a SOCKS proxyFreedomBox provides a Tor SOCKS port that other applications can connect to, in order to route their traffic over the Tor network. This port is accessible on any interfaces configured in the internal firewall zone. To configure the application, set SOCKS Host to the internal network connection's IP address, and set the SOCKS Port to 9050.
Example with FirefoxYour web browser can be configured to use the Tor network for all of your browsing activity. This allows for censorship circumvention and also hides your IP address from websites during regular browsing. For anonymity, using tor browser is recommended. Configure your local FreedomBox IP address and port 9050 as a SOCKS v5 proxy in Firefox. There are extensions to allow for easily turning the proxy on and off. Configuring Firefox with Tor SOCKS proxy With the SOCKS proxy configured, you can now access any onion URL directly from Firefox. FreedomBox itself has an onion v3 address that you can connect to over the Tor network (bookmark this for use in emergency situations).
Circumventing Tor censorshipIf your ISP is trying to block Tor traffic, you can use tor bridge relays to connect to the tor network. 1. Get the bridge configuration from the Tor BridgeDB Tor BridgeDB 2. Add the lines to your FreedomBox Tor configuration as show below. Tor Configuration Page Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Transmission.raw.xml b/doc/manual/en/Transmission.raw.xml index 4f44e4345..730cc7dee 100644 --- a/doc/manual/en/Transmission.raw.xml +++ b/doc/manual/en/Transmission.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Transmission142019-10-27 04:42:42JosephNuthalapatiRemove irrelevant known issue132019-10-27 04:41:18JosephNuthalapatiMinor fixes122019-10-27 04:40:38JosephNuthalapati112019-09-04 09:19:59fioddorSecurity recommendation102019-03-22 07:08:45JosephNuthalapatiAdd tips on how to transfer downloads from FreedomBox to local PC92016-12-31 02:07:57JamesValleroyadd login info82016-12-30 19:20:51JamesValleroyreword72016-12-30 19:13:09JamesValleroyadd intro paragraph62016-12-30 18:59:46JamesValleroyno space in "BitTorrent"52016-12-26 18:00:44JamesValleroyadd screenshot42016-09-01 19:04:35Drahtseiladapted title to Plinth wording32016-04-10 07:27:22PhilippeBaretAdded bottom navigation link22015-12-15 20:42:02PhilippeBaret12015-12-15 18:23:33PhilippeBaretAdded Transmission page and definition
BitTorrent (Transmission)
What is Transmission ?BitTorrent is a communications protocol using peer-to-peer (P2P) file sharing. It is not anonymous; you should assume that others can see what files you are sharing. There are two BitTorrent web clients available in FreedomBox: Transmission and Deluge. They have similar features, but you may prefer one over the other. Transmission is a lightweight BitTorrent client that is well known for its simplicity and a default configuration that "Just Works".
ScreenshotTransmission Web Interface
Using TransmissionAfter installing Transmission, it can be accessed at https://<your freedombox>/transmission. Transmission uses single sign-on from FreedomBox, which means that if you are logged in on your FreedomBox, you can directly access Transmission without having to enter the credentials again. Otherwise, you will be prompted to login first and then redirected to the Transmission app.
Tips
Transferring Downloads from the FreedomBoxTransmission's downloads directory can be added as a shared folder in the "Sharing" app. You can then access your downloads from this shared folder using a web browser. (Advanced) If you have the ssh access to your FreedomBox, you can use sftp to browse the downloads directory using a suitable file manager or web browser (e.g. dolphin or Konqueror). Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Transmission162020-05-30 17:53:11SunilMohanAdapaUpdate the title to emphasize app name over its generic name152020-05-23 19:44:47JamesValleroyadd TableOfContents142019-10-27 04:42:42JosephNuthalapatiRemove irrelevant known issue132019-10-27 04:41:18JosephNuthalapatiMinor fixes122019-10-27 04:40:38JosephNuthalapati112019-09-04 09:19:59fioddorSecurity recommendation102019-03-22 07:08:45JosephNuthalapatiAdd tips on how to transfer downloads from FreedomBox to local PC92016-12-31 02:07:57JamesValleroyadd login info82016-12-30 19:20:51JamesValleroyreword72016-12-30 19:13:09JamesValleroyadd intro paragraph62016-12-30 18:59:46JamesValleroyno space in "BitTorrent"52016-12-26 18:00:44JamesValleroyadd screenshot42016-09-01 19:04:35Drahtseiladapted title to Plinth wording32016-04-10 07:27:22PhilippeBaretAdded bottom navigation link22015-12-15 20:42:02PhilippeBaret12015-12-15 18:23:33PhilippeBaretAdded Transmission page and definition
Transmission (BitTorrent Web Client)
What is Transmission ?BitTorrent is a communications protocol using peer-to-peer (P2P) file sharing. It is not anonymous; you should assume that others can see what files you are sharing. There are two BitTorrent web clients available in FreedomBox: Transmission and Deluge. They have similar features, but you may prefer one over the other. Transmission is a lightweight BitTorrent client that is well known for its simplicity and a default configuration that "Just Works".
ScreenshotTransmission Web Interface
Using TransmissionAfter installing Transmission, it can be accessed at https://<your freedombox>/transmission. Transmission uses single sign-on from FreedomBox, which means that if you are logged in on your FreedomBox, you can directly access Transmission without having to enter the credentials again. Otherwise, you will be prompted to login first and then redirected to the Transmission app.
Tips
Transferring Downloads from the FreedomBoxTransmission's downloads directory can be added as a shared folder in the "Sharing" app. You can then access your downloads from this shared folder using a web browser. (Advanced) If you have the ssh access to your FreedomBox, you can use sftp to browse the downloads directory using a suitable file manager or web browser (e.g. dolphin or Konqueror). Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Upgrades.raw.xml b/doc/manual/en/Upgrades.raw.xml index f8d88d84a..86f8e8f07 100644 --- a/doc/manual/en/Upgrades.raw.xml +++ b/doc/manual/en/Upgrades.raw.xml @@ -1,8 +1,8 @@ -
FreedomBox/Manual/Upgrades82020-04-12 15:55:49JamesValleroyadd links back to top level pages72019-08-22 02:42:27SunilMohanAdapaProvide information about properly updating FreedomBox62019-06-19 07:42:18fioddorLack of feedback is not specific to manual procedure.52017-03-31 20:11:01DrahtseilScreenshot automatic upgrades42016-09-01 19:20:27Drahtseiladapted title to Plinth wording32016-01-16 07:41:43StacyCockrum22016-01-16 07:35:56StacyCockrum12015-09-16 15:01:05SunilMohanAdapaAdd upgrades manual page
Software UpdatesFreedomBox can automatically install security updates. On the Update page of the System section in FreedomBox web interface you can turn on automatic updates. This feature is enabled by default and there is no manual action necessary. It is strongly recommended that you have this option enabled to keep your FreedomBox secure. Updates are performed every day at night. If you wish to shutdown FreedomBox every day after use, keep it running at night once a week or so to let the automatic updates happen. Alternatively, you can perform manual updates as described below. Note that once the updates start, it may take a long time to complete. During automatic update process that runs every night or during manual update process, you will not be able to install apps from FreedomBox web interface. upgrades.png
When Will I Get the Latest Features?Although updates are done every day for security reasons, latest features of FreedomBox will not propagate to all the users. The following information should help you understand how new features become available to users. Stable Users: This category of users include users who bought the FreedomBox Pinoeer Edition, installed FreedomBox on a Debian stable distribution or users who downloaded the stable images from freedombox.org. As a general rule, only security updates to various packages are provided to these users. One exception to this rule is where FreedomBox service itself is updated when a release gains high confidence from developers. This means that latest FreedomBox features may become available to these users although not as quickly or frequently as testing users. If an app is available only in testing distribution but not in stable distribution, then that app will show up in the web interface but will not be installable by stable users. Some apps are also provided an exception to the rule of "security updates only" when the app is severely broken otherwise. Every two years, a major release of Debian stable happens with the latest versions of all the software packages and FreedomBox developers will attempt to upgrade these users to the new release without requiring manual intervention. Testing Users: This category of users include users who installed FreedomBox on a Debian testing distribution or users who downloaded the testing images from freedombox.org. Users who use Debian testing are likely to face occasional disruption in the services and may even need manual intervention to fix the issue. As a general rule, these users receive all the latest features and security updates to all the installed packages. Every two weeks, a new version of FreedomBox is released with all the latest features and fixes. These releases will reach testing users approximately 2-3 days after the release. Unstable Users: This category of users include users who installed FreedomBox on a Debian unstable distribution or users who downloaded the unstable images from freedombox.org. Users who use Debian unstable are likely to face occasional disruption in the services and may even need manual intervention to fix the issue. As a general rule, these users receive all the latest features to all the installed packages. Every two weeks, a new version of FreedomBox is released with all the latest features and fixes. Theses releases will reach unstable users on the day of the release. Only developers, testers and other contributors to the FreedomBox project should use the unstable distribution and end users and advised against using it.
Manual Updates from Web InterfaceTo get updates immediately and not wait until the end of the day, you may want to trigger updates manually. You can do this by pressing the Update now button in Manual update tab for Update page in System section. Note that this step is not necessary if you have enabled Auto-updates as every night this operation is performed automatically. When installing apps you may receive an error message such as This is typically caused by shutting down FreedomBox while it is installing apps, while performing daily updates or during some other operations. This situation can be rectified immediately by running manual update.
Manual Updates from TerminalSome software packages may require manual interaction for updating due to questions related to configuration. In such cases, FreedomBox updates itself and brings in new knowledge necessary to update the package by answering configuration questions. After updating itself, FreedomBox acts on behalf of the user and updates the packages by answering the questions. Until FreedomBox has a chance to update the package, such packages should not be be updated manually. The manual update triggered from the web interface is already mindful of such packages and does not update them. In some rare situations, FreedomBox itself might fail to update or the update mechanism might fall into a situation that might need manual intervention from a terminal. To perform manual upgrades on the terminal, login into FreedomBox on a terminal (if you have monitor and keyboard connected), via a web terminal (using FreedomBox/Manual/Cockpit) or using a remote secure shell (see Secure Shell section). Then run the following commands:
FreedomBox/Manual/Upgrades92020-05-23 20:46:38JamesValleroyadd TableOfContents82020-04-12 15:55:49JamesValleroyadd links back to top level pages72019-08-22 02:42:27SunilMohanAdapaProvide information about properly updating FreedomBox62019-06-19 07:42:18fioddorLack of feedback is not specific to manual procedure.52017-03-31 20:11:01DrahtseilScreenshot automatic upgrades42016-09-01 19:20:27Drahtseiladapted title to Plinth wording32016-01-16 07:41:43StacyCockrum22016-01-16 07:35:56StacyCockrum12015-09-16 15:01:05SunilMohanAdapaAdd upgrades manual page
Software UpdatesFreedomBox can automatically install security updates. On the Update page of the System section in FreedomBox web interface you can turn on automatic updates. This feature is enabled by default and there is no manual action necessary. It is strongly recommended that you have this option enabled to keep your FreedomBox secure. Updates are performed every day at night. If you wish to shutdown FreedomBox every day after use, keep it running at night once a week or so to let the automatic updates happen. Alternatively, you can perform manual updates as described below. Note that once the updates start, it may take a long time to complete. During automatic update process that runs every night or during manual update process, you will not be able to install apps from FreedomBox web interface. upgrades.png
When Will I Get the Latest Features?Although updates are done every day for security reasons, latest features of FreedomBox will not propagate to all the users. The following information should help you understand how new features become available to users. Stable Users: This category of users include users who bought the FreedomBox Pinoeer Edition, installed FreedomBox on a Debian stable distribution or users who downloaded the stable images from freedombox.org. As a general rule, only security updates to various packages are provided to these users. One exception to this rule is where FreedomBox service itself is updated when a release gains high confidence from developers. This means that latest FreedomBox features may become available to these users although not as quickly or frequently as testing users. If an app is available only in testing distribution but not in stable distribution, then that app will show up in the web interface but will not be installable by stable users. Some apps are also provided an exception to the rule of "security updates only" when the app is severely broken otherwise. Every two years, a major release of Debian stable happens with the latest versions of all the software packages and FreedomBox developers will attempt to upgrade these users to the new release without requiring manual intervention. Testing Users: This category of users include users who installed FreedomBox on a Debian testing distribution or users who downloaded the testing images from freedombox.org. Users who use Debian testing are likely to face occasional disruption in the services and may even need manual intervention to fix the issue. As a general rule, these users receive all the latest features and security updates to all the installed packages. Every two weeks, a new version of FreedomBox is released with all the latest features and fixes. These releases will reach testing users approximately 2-3 days after the release. Unstable Users: This category of users include users who installed FreedomBox on a Debian unstable distribution or users who downloaded the unstable images from freedombox.org. Users who use Debian unstable are likely to face occasional disruption in the services and may even need manual intervention to fix the issue. As a general rule, these users receive all the latest features to all the installed packages. Every two weeks, a new version of FreedomBox is released with all the latest features and fixes. Theses releases will reach unstable users on the day of the release. Only developers, testers and other contributors to the FreedomBox project should use the unstable distribution and end users and advised against using it.
Manual Updates from Web InterfaceTo get updates immediately and not wait until the end of the day, you may want to trigger updates manually. You can do this by pressing the Update now button in Manual update tab for Update page in System section. Note that this step is not necessary if you have enabled Auto-updates as every night this operation is performed automatically. When installing apps you may receive an error message such as This is typically caused by shutting down FreedomBox while it is installing apps, while performing daily updates or during some other operations. This situation can be rectified immediately by running manual update.
Manual Updates from TerminalSome software packages may require manual interaction for updating due to questions related to configuration. In such cases, FreedomBox updates itself and brings in new knowledge necessary to update the package by answering configuration questions. After updating itself, FreedomBox acts on behalf of the user and updates the packages by answering the questions. Until FreedomBox has a chance to update the package, such packages should not be be updated manually. The manual update triggered from the web interface is already mindful of such packages and does not update them. In some rare situations, FreedomBox itself might fail to update or the update mechanism might fall into a situation that might need manual intervention from a terminal. To perform manual upgrades on the terminal, login into FreedomBox on a terminal (if you have monitor and keyboard connected), via a web terminal (using FreedomBox/Manual/Cockpit) or using a remote secure shell (see Secure Shell section). Then run the following commands: # dpkg --configure -a # apt update # apt -f install # unattended-upgrade --debug # apt install freedombox -# apt update]]>If apt-get update asks for a confirmation to change Codename or other release information, confirm yes. If during update of freedombox package, if a question about overwriting configuration files is asked, answer to install new configuration files from the latest version of the package. This process will upgrade only packages that don't require configuration file questions (except for freedombox package). After this, let FreedomBox handle the upgrade of remaining packages. Be patient while new releases of FreedomBox are made to handle packages that require manual intervention. If you want to go beyond the recommendation to upgrade all the packages on your FreedomBox and if you are really sure about handling the configuration changes for packages yourself, run the following command: Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +# apt update]]>
If apt-get update asks for a confirmation to change Codename or other release information, confirm yes. If during update of freedombox package, if a question about overwriting configuration files is asked, answer to install new configuration files from the latest version of the package. This process will upgrade only packages that don't require configuration file questions (except for freedombox package). After this, let FreedomBox handle the upgrade of remaining packages. Be patient while new releases of FreedomBox are made to handle packages that require manual intervention. If you want to go beyond the recommendation to upgrade all the packages on your FreedomBox and if you are really sure about handling the configuration changes for packages yourself, run the following command: Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/Users.raw.xml b/doc/manual/en/Users.raw.xml index e060c7adc..d1f618f9f 100644 --- a/doc/manual/en/Users.raw.xml +++ b/doc/manual/en/Users.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/Users82019-07-29 22:34:11JamesValleroybetter wording72019-07-29 22:22:17JamesValleroyremove "Plinth"62019-07-29 22:10:39JamesValleroymention which releases known issue applies to52019-07-29 22:08:21JamesValleroyadd more supported groups42017-01-14 20:13:01JamesValleroyadd known issue32016-12-31 04:15:09JamesValleroyreword22016-09-01 19:21:25Drahtseiladapted title to Plinth wording12016-08-21 16:48:45DrahtseilCreated Users
Users and GroupsYou can grant access to your FreedomBox for other users. Provide the Username with a password and assign a group to it. Currently the groups admin bit-torrent ed2k feed-reader syncthing web-search wiki are supported. The user will be able to log in to services that support single sign-on through LDAP, if they are in the appropriate group. Users in the admin group will be able to log in to all services. They can also log in to the system through SSH and have administrative privileges (sudo). A user's groups can also be changed later-on. It is also possible to set an SSH public key which will allow this user to securely log in to the system without using a password. You may enter multiple keys, one on each line. Blank lines and lines starting with # will be ignored. A user's account can be deactivated, which will temporarily disable the account.
Known IssuesIn Debian Stretch, the FreedomBox web interface does not distinguish between users and administrators. Every user added will have full access to the web interface. This issue is fixed in Debian Buster and later. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/Users92020-05-23 20:47:07JamesValleroyadd TableOfContents82019-07-29 22:34:11JamesValleroybetter wording72019-07-29 22:22:17JamesValleroyremove "Plinth"62019-07-29 22:10:39JamesValleroymention which releases known issue applies to52019-07-29 22:08:21JamesValleroyadd more supported groups42017-01-14 20:13:01JamesValleroyadd known issue32016-12-31 04:15:09JamesValleroyreword22016-09-01 19:21:25Drahtseiladapted title to Plinth wording12016-08-21 16:48:45DrahtseilCreated Users
Users and GroupsYou can grant access to your FreedomBox for other users. Provide the Username with a password and assign a group to it. Currently the groups admin bit-torrent ed2k feed-reader syncthing web-search wiki are supported. The user will be able to log in to services that support single sign-on through LDAP, if they are in the appropriate group. Users in the admin group will be able to log in to all services. They can also log in to the system through SSH and have administrative privileges (sudo). A user's groups can also be changed later-on. It is also possible to set an SSH public key which will allow this user to securely log in to the system without using a password. You may enter multiple keys, one on each line. Blank lines and lines starting with # will be ignored. A user's account can be deactivated, which will temporarily disable the account.
Known IssuesIn Debian Stretch, the FreedomBox web interface does not distinguish between users and administrators. Every user added will have full access to the web interface. This issue is fixed in Debian Buster and later. Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/ejabberd.raw.xml b/doc/manual/en/ejabberd.raw.xml index f7801d1a1..f91b1f1c1 100644 --- a/doc/manual/en/ejabberd.raw.xml +++ b/doc/manual/en/ejabberd.raw.xml @@ -1 +1 @@ -
FreedomBox/Manual/ejabberd122019-03-01 17:43:12JosephNuthalapatiFix PageKite url112019-02-27 00:06:38JamesValleroymake title consistent with FreedomBox interface102018-03-02 13:01:38JosephNuthalapatiConsistent naming conventions92017-01-07 17:42:27JamesValleroyadd note about service restart82017-01-02 13:48:30JamesValleroyadd port forwarding info72016-12-31 03:11:19JamesValleroyclarify62016-12-31 03:10:19JamesValleroymention web client52016-12-31 02:35:52JamesValleroyadd security info42016-09-04 10:31:37Drahtseiladded links32016-04-10 07:18:35PhilippeBaretAdded bottom navigation link22015-12-15 18:37:29PhilippeBaretAdded definition to Chat server page12015-09-20 23:52:11JamesValleroyadd xmpp page
Chat Server (ejabberd)
What is XMPP?XMPP is a federated protocol for Instant Messaging. This means that users who have accounts on one server, can talk to users that are on another server. XMPP can also be used for voice and video calls, if supported by the clients. With XMPP, there are two ways that conversations can be secured: TLS: This secures the connection between the client and server, or between two servers. This should be supported by all clients and is highly recommended. End-to-end: This secures the messages sent from one client to another, so that even the server cannot see the contents. The latest and most convenient protocol is called OMEMO, but it is only supported by a few clients. There is another protocol called OTR that may be supported by some clients that lack OMEMO support. Both clients must support the same protocol for it to work.
Setting the Domain NameFor XMPP to work, your FreedomBox needs to have a Domain Name that can be accessed over the public Internet. You can read more about obtaining a Domain Name in the Dynamic DNS section of this manual. Once you have a Domain Name, you can tell your FreedomBox to use it by setting the Domain Name in the System Configuration. Note: After changing your Domain Name, the Chat Server (XMPP) page may show that the service is not running. After a minute or so, it should be up and running again. Please note that PageKite does not support the XMPP protocol at this time.
Registering XMPP users through SSOCurrently, all users created through Plinth will be able to login to the XMPP server. You can add new users through the System Users and Groups module. It does not matter which Groups are selected for the new user.
Using the web clientAfter the XMPP module install completes, the JSXC web client for XMPP can be accessed at https://<your freedombox>/plinth/apps/xmpp/jsxc/. It will automatically check the BOSH server connection to the configured domain name.
Using a desktop or mobile clientXMPP clients are available for various desktop and mobile platforms.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for XMPP: TCP 5222 (client-to-server) TCP 5269 (server-to-server) Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
FreedomBox/Manual/ejabberd152020-05-30 17:55:47SunilMohanAdapaUpdate the title to emphasize app name over its generic name142020-05-23 19:50:10JamesValleroyadd TableOfContents132020-05-23 17:01:56JamesValleroyrename plinth -> freedombox122019-03-01 17:43:12JosephNuthalapatiFix PageKite url112019-02-27 00:06:38JamesValleroymake title consistent with FreedomBox interface102018-03-02 13:01:38JosephNuthalapatiConsistent naming conventions92017-01-07 17:42:27JamesValleroyadd note about service restart82017-01-02 13:48:30JamesValleroyadd port forwarding info72016-12-31 03:11:19JamesValleroyclarify62016-12-31 03:10:19JamesValleroymention web client52016-12-31 02:35:52JamesValleroyadd security info42016-09-04 10:31:37Drahtseiladded links32016-04-10 07:18:35PhilippeBaretAdded bottom navigation link22015-12-15 18:37:29PhilippeBaretAdded definition to Chat server page12015-09-20 23:52:11JamesValleroyadd xmpp page
ejabberd (Chat Server)
What is XMPP?XMPP is a federated protocol for Instant Messaging. This means that users who have accounts on one server, can talk to users that are on another server. XMPP can also be used for voice and video calls, if supported by the clients. With XMPP, there are two ways that conversations can be secured: TLS: This secures the connection between the client and server, or between two servers. This should be supported by all clients and is highly recommended. End-to-end: This secures the messages sent from one client to another, so that even the server cannot see the contents. The latest and most convenient protocol is called OMEMO, but it is only supported by a few clients. There is another protocol called OTR that may be supported by some clients that lack OMEMO support. Both clients must support the same protocol for it to work.
Setting the Domain NameFor XMPP to work, your FreedomBox needs to have a Domain Name that can be accessed over the public Internet. You can read more about obtaining a Domain Name in the Dynamic DNS section of this manual. Once you have a Domain Name, you can tell your FreedomBox to use it by setting the Domain Name in the System Configuration. Note: After changing your Domain Name, the Chat Server (XMPP) page may show that the service is not running. After a minute or so, it should be up and running again. Please note that PageKite does not support the XMPP protocol at this time.
Registering XMPP users through SSOCurrently, all users created through FreedomBox will be able to login to the XMPP server. You can add new users through the System Users and Groups module. It does not matter which Groups are selected for the new user.
Using the web clientAfter the XMPP module install completes, the JSXC web client for XMPP can be accessed at https://<your freedombox>/plinth/apps/xmpp/jsxc/. It will automatically check the BOSH server connection to the configured domain name.
Using a desktop or mobile clientXMPP clients are available for various desktop and mobile platforms.
Port ForwardingIf your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for XMPP: TCP 5222 (client-to-server) TCP 5269 (server-to-server) Back to Features introduction or manual pages. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/en/freedombox-manual.raw.xml b/doc/manual/en/freedombox-manual.raw.xml index 553743496..c9c3bc120 100644 --- a/doc/manual/en/freedombox-manual.raw.xml +++ b/doc/manual/en/freedombox-manual.raw.xml @@ -4,6 +4,54 @@ FreedomBox/Manual + + 92 + 2020-05-30 18:28:47 + SunilMohanAdapa + Sort apps and system items according to their new titles + + + 91 + 2020-05-26 13:39:35 + fioddor + Bind moved to sort on headers. + + + 90 + 2020-05-26 13:37:10 + fioddor + Include Bind DNS Server under System + + + 89 + 2020-05-24 19:21:23 + JamesValleroy + fix broken includes due to space after page name + + + 88 + 2020-05-24 08:18:14 + fioddor + Improved readability + + + 87 + 2020-05-23 20:53:09 + JamesValleroy + skip TOCs for system pages + + + 86 + 2020-05-23 20:01:24 + JamesValleroy + skip TOCs for included app pages + + + 85 + 2020-05-23 19:47:32 + JamesValleroy + don't include TableOfContents from included pages + 84 2020-05-06 06:02:24 @@ -636,7 +684,7 @@ - After the FreedomBox has finished its initial setup, you can access its web interface (called Plinth) through your web browser. + After the FreedomBox has finished its initial setup, you can access its web interface through your web browser. If your computer is connected directly to the FreedomBox through a second (LAN) ethernet port, you can browse to: or . @@ -668,7 +716,7 @@ - On accessing FreedomBox's web interface (Plinth) your browser will warn you that it communicates securely but that it regards the security certificate for doing so as invalid. This is a fact you need to accept because the certificate is auto generated on the box and therefore "self-signed" (the browser might also use words such as "untrusted", "not private", "privacy error" or "unknown issuer/authority"). Telling your browser that you are aware of this might involve pressing buttons such as "I understand the Risks", "proceed to ... (unsafe)" or "Add exception". After installation this certificate can be changed to a normal one using the Let's Encrypt option. + On accessing FreedomBox's web interface your browser will warn you that it communicates securely but that it regards the security certificate for doing so as invalid. This is a fact you need to accept because the certificate is auto generated on the box and therefore "self-signed" (the browser might also use words such as "untrusted", "not private", "privacy error" or "unknown issuer/authority"). Telling your browser that you are aware of this might involve pressing buttons such as "I understand the Risks", "proceed to ... (unsafe)" or "Add exception". After installation this certificate can be changed to a normal one using the Let's Encrypt option. @@ -735,7 +783,7 @@ - After completing the form, you will be logged in to FreedomBox's web interface (Plinth) and able to access apps and configuration through the interface. + After completing the form, you will be logged in to FreedomBox's web interface and able to access apps and configuration through the interface. @@ -758,7 +806,7 @@ Finding your way around
Front page - The front page is the page that you will see when accessing the web root of your FreedomBox. You can also access it by clicking the FreedomBox logo in the top-left corner of the FreedomBox's web interface (Plinth). + The front page is the page that you will see when accessing the web root of your FreedomBox. You can also access it by clicking the FreedomBox logo in the top-left corner of the FreedomBox's web interface. The front page includes shortcuts to apps that have been installed and are enabled. For web apps, clicking the shortcut will take you directly to the app's web page. For other services, clicking the shortcut will show more information about the service. @@ -839,7 +887,7 @@
Burger menu - FreedomBox's web interface (Plinth) is responsive. Eventually you might miss the menu options on slim windows. + FreedomBox's web interface is responsive. Eventually you might miss the menu options on slim windows. @@ -1097,10 +1145,10 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971]]> You can build and install a package from its Debian's version control repository. For example, + dpkg -i ../freedombox*.deb]]>
@@ -1132,238 +1180,78 @@ dd if=temp/usr/lib/u-boot/A20-OLinuXino-Lime2/u-boot-sunxi-with-spl.bin of=Add entries here sorted after the level 2 heading inside the page to keep the list alphabetically sorted
- User websites (userdir) + Coquelicot (File Sharing)
- What is User websites? - User websites is a module of the Apache webserver enabled to allow users defined in the FreedomBox system to expose a set of static files on the FreedomBox filesystem as a website to the local network and/or the internet according to the network and firewall setup. - - - - - - - - - Application basics - - - - - - Category - - - File sharing - - - - - Available since version - - - 0.9.4 - - - - - Upstream project website - - - - - - - - - - Upstream end user documentation - - - - - - - - - - + About Coquelicot + Coquelicot is a "one-click" file sharing web application with a focus on protecting users' privacy. The basic principle is simple: users can upload a file to the server, in return they get a unique URL which can be shared with others in order to download the file. A download password can be defined. + After the upload you get a unique link that can be shared to your partners in order to + Read more about Coquelicot at the Coquelicot README + Available since: version 0.24.0
- Screenshot - - Add when/if an interface is made for FreedomBox - + When to use Coquelicot + Coquelicot is best used to quickly share a single file. If you want to share a folder, + + + for a single use, compress the folder and share it over Coquelicot + + + which must be kept synchronized between computers, use Syncthing instead + + + Coquelicot can only provide a reasonable degree of privacy. If anonymity is required, you should consider using the desktop application Onionshare instead. + Since Coquelicot fully uploads the file to the server, your FreedomBox will incur both upload and download bandwidth costs. For very large files, consider sharing them using BitTorrent by creating a private torrent file. If anonymity is required, use Onionshare. It is P2P and doesn't require a server.
- Using User websites - The module is always enabled and offers no configuration from the FreedomBox web interface. There is no configuration or status page shown for this module in the FreedomBox web interface. - To serve documents, place the files in the designated directory in a FreedomBox user's home directory in the filesystem. - 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. 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. + Coquelicot on FreedomBox + With Coquelicot installed, you can upload files to your FreedomBox server and privately share them. + Post installation, the Coquelicot page offers two settings. + + + Upload Password: Coquelicot on FreedomBox is currently configured to use simple password authentication for ease of use. Remember that it's one global password for this Coquelicot instance and not your user password for FreedomBox. You need not remember this password. You can set a new one from the FreedomBox interface anytime. + + + Maximum File Size: You can alter the maximum size of the file that can be transferred through Coquelicot using this setting. The size is in Mebibytes. The maximum file size is only limited by the disk size of your FreedomBox. + +
- Using SFTP to create public_html and upload documents - - To be written - -
-
-
- Anonymity Network (Tor) -
- What is Tor? - Tor is a network of servers operated by volunteers. It allows users of these servers to improve their privacy and security while surfing on the Internet. You and your friends are able to access to your FreedomBox via Tor network without revealing its IP address. Activating Tor application on your FreedomBox, you will be able to offer remote services (chat, wiki, file sharing, etc...) without showing your location. This application will give you a better protection than a public web server because you will be less exposed to intrusive people on the web. -
-
- Using Tor to browse anonymously - Tor Browser is the recommended way to browse the web using Tor. You can download the Tor Browser from and follow the instructions on that site to install and run it. -
-
- Using Tor Onion Service to access your FreedomBox - Tor Onion Service provides a way to access your FreedomBox, even if it's behind a router, firewall, or carrier-grade NAT (i.e., your Internet Service Provider does not provide a public IPv4 address for your router). - To enable Tor Onion Service, first navigate to the Anonymity Network (Tor) page. (If you don't see it, click on the FreedomBox logo at the top-left of the page, to go to the main Apps page.) On the Anonymity Network (Tor) page, under Configuration, check "Enable Tor Onion Service", then press the Update setup button. Tor will be reconfigured and restarted. - After a while, the page will refresh and under Status, you will see a table listing the Onion Service .onion address. Copy the entire address (ending in .onion) and paste it into the Tor Browser's address field, and you should be able to access your FreedomBox. (You may see a certificate warning because FreedomBox has a self-signed certificate.) - - - - - - - Tor Browser - Plinth - - - - Currently only HTTP (port 80), HTTPS (port 443), and SSH (port 22) are accessible through the Tor Onion Service configured on the FreedomBox. -
-
- Apps accessible via Tor - The following apps can be accessed over Tor. Note that this list is not exhaustive. - - - Calendar and Addressbook (Radicale) - - - File Synchronization (Syncthing) - - - Feed reader (TinyTinyRSS) - - - Web Search (Searx) - - - Wiki (MediaWiki) - - - Wiki and Blog (Ikiwiki) - - -
-
- Running a Tor relay - When Tor is installed, it is configured by default to run as a bridge relay. The relay or bridge option can be disabled through the Tor configuration page in Plinth. - At the bottom of the Tor page in Plinth, there is a list of ports used by the Tor relay. If your FreedomBox is behind a router, you will need to configure port forwarding on your router so that these ports can be reached from the public Internet. - The requirements to run a relay are listed in the Tor Relay Guide. In short, it is - - - recommended that a relay has at least 16 Mbit/s (Mbps) upload and download bandwidth available for Tor. More is better. - - - required that a Tor relay be allowed to use a minimum of 100 GByte of outbound and of incoming traffic per month. - - - recommended that a <40 Mbit/s non-exit relay should have at least 512 MB of RAM available; A relay faster than 40 Mbit/s should have at least 1 GB of RAM. - - -
-
- (Advanced) Usage as a SOCKS proxy - FreedomBox provides a Tor SOCKS port that other applications can connect to, in order to route their traffic over the Tor network. This port is accessible on any interfaces configured in the internal firewall zone. To configure the application, set SOCKS Host to the internal network connection's IP address, and set the SOCKS Port to 9050. + Privacy + Someone monitoring your network traffic might find out that some file is being transferred through your FreedomBox and also possibly its size, but will not know the file name. Coquelicot encrypts files on the server and also fills the file contents with 0s when deleting them. This eliminates the risk of file contents being revealed in the event of your FreedomBox being confiscated or stolen. The real risk to mitigate here is a third-party also downloading your file along with the intended recipient.
- Example with Firefox - Your web browser can be configured to use the Tor network for all of your browsing activity. This allows for censorship circumvention and also hides your IP address from websites during regular browsing. For anonymity, using tor browser is recommended. - Configure your local FreedomBox IP address and port 9050 as a SOCKS v5 proxy in Firefox. There are extensions to allow for easily turning the proxy on and off. - - - - - - - Configuring Firefox with Tor SOCKS proxy - - - - With the SOCKS proxy configured, you can now access any onion URL directly from Firefox. FreedomBox itself has an onion v3 address that you can connect to over the Tor network (bookmark this for use in emergency situations). + Sharing over instant messengers + Some instant messengers which have previews for websites might download your file in order to show a preview in the conversation. If you set the option of one-time download on a file, you might notice that the one download will be used up by the instant messenger. If sharing over such messengers, please use a download password in combination with a one-time download option.
-
-
- Circumventing Tor censorship - If your ISP is trying to block Tor traffic, you can use tor bridge relays to connect to the tor network. - 1. Get the bridge configuration from the Tor BridgeDB - - - - - - - Tor BridgeDB - - - - 2. Add the lines to your FreedomBox Tor configuration as show below. - - - - - - - Tor Configuration Page - - - -
-
-
- BitTorrent (Transmission) -
- What is Transmission ? - BitTorrent is a communications protocol using peer-to-peer (P2P) file sharing. It is not anonymous; you should assume that others can see what files you are sharing. There are two BitTorrent web clients available in FreedomBox: Transmission and Deluge. They have similar features, but you may prefer one over the other. - Transmission is a lightweight BitTorrent client that is well known for its simplicity and a default configuration that "Just Works". -
-
- Screenshot - - - - - - - Transmission Web Interface - - - -
-
- Using Transmission - After installing Transmission, it can be accessed at https://<your freedombox>/transmission. Transmission uses single sign-on from FreedomBox, which means that if you are logged in on your FreedomBox, you can directly access Transmission without having to enter the credentials again. Otherwise, you will be prompted to login first and then redirected to the Transmission app. -
-
- Tips
- Transferring Downloads from the FreedomBox - - - Transmission's downloads directory can be added as a shared folder in the "Sharing" app. You can then access your downloads from this shared folder using a web browser. - - - (Advanced) If you have the ssh access to your FreedomBox, you can use sftp to browse the downloads directory using a suitable file manager or web browser (e.g. dolphin or Konqueror). - - + Sharing download links privately + It is recommended to share your file download links and download passwords over encrypted channels. You can simply avoid all the above problems with instant messenger previews by using instant messengers that support encrypted conversations like Riot with Matrix Synapse or XMPP (ejabberd server on FreedomBox) with clients that support end-to-end encryption. Send the download link and the download password in two separate messages (helps if your messenger supports perfect forward secrecy like XMPP with OTR). You can also share your links over PGP-encrypted email using Thunderbird.
- BitTorrent (Deluge) + Coturn (VoIP Helper) + Coturn is a server to facilitate audio/video calls and conferences by providing an implementation of TURN and STUN protocols. WebRTC, SIP and other communication servers can use it to establish a call between parties who are otherwise unable connect to each other. + It is not meant to be used directly by users. Servers such as Matrix Synapse need to be configured with the details provided on the Coturn app page. Apart from Matrix Synapse, Jitsi, Ejabberd, Nextcloud Talk, etc. can use Coturn server for audio/video calls and conferences. There is no need for the servers to be running on the same machine as FreedomBox and external servers can use Coturn running on FreedomBox. + Coturn is available in FreedomBox since version 20.8 as an advanced app. This means that you need to check "Show advanced apps and features" in "General Configuration" to see Coturn icon in the "Apps" section. +
+ How it works + When making an audio/video call, it is best to route the media streams between two peers directly. This will give the best possible latency (better signal quality) and avoid depending on a centralized server (privacy). It scales well because a simple chat server can host thousands of calls without involving the server in any way other than to setup the call. However, this approach does not work most of the time to due to how networks are configured. Most peers on the network do not have a unique IP address allocated to them. They work hidden behind a network device that performs "Network Address Translation" (NAT) for them. This means that the two peers have no way of reaching each other. + To address this problem, a simple technique known as STUN was introduced. With the help of a third party STUN server, the peers can trick the NAT devices, to carry the traffic between the two peers. Unfortunately, this trick only works about 80% of the time. So, if STUN fails, peers have no choice but to route their traffic through an intermediary server called TURN server. All the mechanism of trying out STUN first and then falling back to TURN is described in a protocol known as ICE. + On FreedomBox, Coturn provides both STUN and TURN servers. Both services are provided over TCP as well as UDP. They are provided on unencrypted as well as encrypted channels (with have a higher chance of success). Since STUN servers are very inexpensive and don't consume a lot of server resources, there is no authentication needed to use them. TURN servers on the other hand need authentication. This authentication is highly simplified and does not require maintaining a database of users. A server such as matrix-synapse which is about to setup an audio/video call between two peers will generate a username and password using a shared secret. When the peers use the TURN server, they will be validated using these credentials because the TURN server also knows the same secret. + In summary, a communication server needs to know the URLs of the STUN/TURN servers along with a shared authentication secret for TURN. After that, during audio/video call setup, they will correctly guide the peers to use STUN/TURN servers. Coturn app in FreedomBox provides exactly this information. This information can be used to configure a communication server irrespective of whether it is running on the same FreedomBox or on another server. +
+
+ Configuring Matrix Synapse + Matrix Synapse server in FreedomBox can be configured to use Coturn TURN/STUN server. In future, when you install Matrix Synapse, FreedomBox will automatically install Coturn and configure its parameters into Matrix Synapse. To configure Matrix Synapse, edit the file /etc/matrix-synapse/homeserver.yaml with the following lines: + + And then restart matrix-synapse server by disabling and re-enabling the matrix-synapse app. +
+
+
+ Deluge (BitTorrent Web Client)
What is Deluge? BitTorrent is a communications protocol using peer-to-peer (P2P) file sharing. It is not anonymous; you should assume that others can see what files you are sharing. There are two BitTorrent web clients available in FreedomBox: Transmission and Deluge. They have similar features, but you may prefer one over the other. @@ -1422,354 +1310,7 @@ dd if=temp/usr/lib/u-boot/A20-OLinuXino-Lime2/u-boot-sunxi-with-spl.bin of=
- Block Sandbox (Minetest) - Minetest is a multiplayer infinite-world block sandbox. This module enables the Minetest server to be run on this FreedomBox, on the default port (30000). To connect to the server, a Minetest client is needed. -
- Port Forwarding - If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Minetest: - - - UDP 30000 - - -
-
-
- Calendar and Addressbook (Radicale) - With Radicale, you can synchronize your personal calendars, ToDo lists, and addressbooks with your various computers, tablets, and smartphones, and share them with friends, without letting third parties know your personal schedule or contacts. -
- Why should I run Radicale? - Using Radicale, you can get rid of centralized services like Google Calendar or Apple Calendar (iCloud) data mining your events and social connections. -
-
- How to setup Radicale? - First, the Radicale server needs to be activated on your box. - - - Within FreedomBox Service (Plinth) - - - select Apps - - - go to Radicale (Calendar and Addressbook) and - - - install the application. After the installation is complete, make sure the application is marked "enabled" in the FreedomBox interface. Enabling the application launches the Radicale CalDAV/CardDAV server. - - - define the access rights: - - - Only the owner of a calendar/addressbook can view or make changes - - - Any user can view any calendar/addressbook, but only the owner can make changes - - - Any user can view or make changes to any calendar/addressbook - - - - - - - Note, that only users with a FreedomBox login can access Radicale. - - - - - - - Radicale-Plinth.png - - - - If you want to share a calendar with only some users, the simplest approach is to create an additional user-name for these users and to share that user-name and password with them. - Radicale provides a basic web interface, which only supports creating new calendars and addressbooks. To add events or contacts, an external supported client application is needed. - - - - - - - radicale_web.png - - - - - - Creating addressbook/calendar using the web interface - - - Visit https://IP-address-or-domain-for-your-server/radicale/ - - - Log in with your FreedomBox account - - - Select "Create new addressbook or calendar" - - - Provide a title and select the type - - - Optionally, provide a description or select a color - - - Click "Create" - - - The page will show the URL for your newly created addressbook or calendar - - - - - Now open your client application to create new calendar and address books that will use your FreedomBox and Radicale server. The Radicale website provides an overview of supported clients, but do not use the URLs described there; FreedomBox uses another setup, follow this manual. Below are the steps for two examples: - - - Example of setup with Evolution client: - - - Calendar - - - Create a new calendar - - - For "Type," select "CalDAV" - - - When "CalDAV" is selected, additional options will appear in the dialogue window. - - - URL: https://IP-address-or-domain-for-your-server/radicale/user/calendar-name.ics/. Items in italics need to be changed to match your settings. - - - note the trailing / in the path, it is important. - - - - - Enable "Use a secure connection." - - - Name the calendar - - - - - - - Radicale-Evolution-Docu.png - - - - - - - - TODO/Tasks list: Adding a TODO/Tasks list is basically the same as a calendar. - - - Contacts - - - Follow the same steps described above and replace CalDAV with WebDAV. The extension of the address book will be .vcf. - - - - - - -
-
- Synchronizing over Tor - In FreedomBox, setting up a calendar with Radicale over Tor is the same as over the clear net. Here is a short summary: - - - When logged in to FreedomBox interface over Tor, click on Radicale, and at the prompt provide your FreedomBox user name and password. - - - In the Radicale web interface, log in using your FreedomBox user name and password. - - - Click on "Create new address book or calendar", provide a title, select a type, and click "Create". - - - Save the URL, e.g., https://ONION-ADDRESS-FOR-YOUR-SERVER.onion/radicale/USERNAME/CALENDAR-CODE/. Items in italics need to be changed to match your settings. - - - These instructions are for Thunderbird/Lightning. Note that you will need to be connected to Tor with the Tor Browser Bundle. - - - Open Thunderbird, install the Torbirdy add-on, and restart Thunderbird. (This may not be necessary.) - - - In the Lightning interface, under Calendar/Home in the left panel right click with the mouse and select "New calendar". - - - Select the location of your calendar as "On the Network". - - - Select CalDAV and for the location copy the URL, e.g., https://ONION-ADDRESS-FOR-YOUR-SERVER.onion/radicale/USERNAME/CALENDAR-CODE/. Items in italics need to be changed to match your settings. - - - Provide a name, etc. Click "Next". Your calendar is now syncing with your FreedomBox over Tor. - - - If you have not generated a certificate for your FreedomBox with "Let's Encrypt", you may need to select "Confirm Security Exception" when prompted. - - -
-
- Synchronizing with your Android phone - There are various Apps that allow integration with the Radicale server. This example uses DAVx5, which is available e.g. on F-Droid. If you intend to use ToDo-Lists as well, the compatible app OpenTasks has to be installed first. - Follow these steps for setting up your account with the Radicale server running on your FreedomBox. - - - Install DAVx5 - - - Create a new account on DAVx5 by clicking on the floating + button. - - - Select the second option as shown in the first figure below and enter the base url as (don't miss the / at the end). DAVx5 will be able to discover both CalDAV and WebDAV accounts for the user. - - - Follow this video from DAVx5 FAQ to learn how to migrate your existing contacts to Radicale. - - - - Synchronizing contacts - - - - Click on the hamburger menus of CalDAV and CardDAV and select either "Refresh ..." in case of existing accounts or "Create ..." in case of new accounts (see the second screenshot below). - - - Check the checkboxes for the address books and calendars you want to synchronize and click on the sync button in the header. (see the third screenshot below) - - - - - - - - - DAVx5 account setup - - - - - - - - DAVx5 refresh - - - - - - - - DAVx5 account sync - - - -
-
- Advanced Users -
- Sharing resources - Above was shown an easy way to create a resource for a group of people by creating a dedicated account for all. Here will be described an alternative method where two users User1 and User2 are granted access to a calendar. This requires SSH-access to the FreedomBox. - - - create a file /etc/radicale/rights - - - - - - [friends_calendar] is just an identifier, can be any name. - - - The [owner-write] section makes sure that owners have access to their own files - - - - - edit file /etc/radicale/config and make the following changes in section [rights) - - - - - - - - Restart the radicale server or the FreedomBox - - -
-
- Importing files - If you are using a contacts file exported from another service or application, it should be copied to: /var/lib/radicale/collections/user/contact file name.vcf. -
-
-
- Migrating from Radicale Version 1.x to Version 2.x - During the month of February 2019, radicale in Debian testing was upgraded from version 1.x to version 2.x. Version 2.x is a better version but is incompatible with data and configuration used with 1.x. Automatic upgrade mechanism in FreedomBox, handled by unattended-upgrades does not automatically upgrade radicale to version 2.x due to changes in configuration files. However, FreedomBox version 19.1, which is available on February 23rd, 2019 in testing will perform data and configuration migration to radicale version 2.x. Typical users require no action, this will happen automatically. - If for some reason, you need to manually run apt dist-upgrade on your machine, then radicale will be upgraded to 2.x and then FreedomBox will not be able to perform its upgrade (due to upstream project deciding to remove migration tools in radicale 2.x version). To avoid this situation, the following process is recommended if you wish to perform an upgrade. - - However, if you already happen to perform an upgrade to radicale 2.x without help from FreedomBox, you need to perform data and configuration migration yourself. Follow this procedure: - - Notes: - - - python-radicale is an old package from radicale 1.x version that is still available in testing. This is a hack to use the --export-storage feature that is responsible for data migration. This feature is not available in radicale 2.x unfortunately. - - - Files ending with .dpkg-dist will exist only if you have chosen 'Keep your currently-installed version' when prompted for configuration file override during radicale 2.x upgrade. The above process will overwrite the old configuration with new fresh configuration. No changes are necessary to the two configuration files unless you have changed the setting for sharing calendars. - - - Note that during the migration, your data is safe in /var/lib/radicale/collections directory. New data will be created and used in /var/lib/radicale/collections/collections-root/ directory. - - - The tar command takes a backup your configuration and data in /root/radicale_backup.tgz in case you do something goes wrong and you want to undo the changes. - - -
-
- Troubleshooting - 1. If you are using FreedomBox Pioneer Edition or installing FreedomBox on Debian Buster, then radicale may not be usable immediately after installation. This is due to a bug which has been fixed later. To overcome the problem, upgrade FreedomBox by clicking on 'Manual Update' from 'Updates' app. Otherwise, simply wait a day or two and let FreedomBox upgrade itself. After that install radicale. If radicale is already installed, disable and re-enable it after the update is completed. This will fix the problem and get radicale working properly. -
-
-
- Chat Server (ejabberd) + ejabberd (Chat Server)
What is XMPP? XMPP is a federated protocol for Instant Messaging. This means that users who have accounts on one server, can talk to users that are on another server. XMPP can also be used for voice and video calls, if supported by the clients. @@ -1796,7 +1337,7 @@ if [ -f /etc/default/radicale.dpkg-dist ] ; then cp /etc/default/radicale.dpkg-d
Registering XMPP users through SSO - Currently, all users created through Plinth will be able to login to the XMPP server. You can add new users through the System Users and Groups module. It does not matter which Groups are selected for the new user. + Currently, all users created through FreedomBox will be able to login to the XMPP server. You can add new users through the System Users and Groups module. It does not matter which Groups are selected for the new user.
Using the web client @@ -1820,7 +1361,165 @@ if [ -f /etc/default/radicale.dpkg-dist ] ; then cp /etc/default/radicale.dpkg-d
- Chat Server (Matrix Synapse) + GitWeb (Simple Git Hosting) + Git is a distributed version-control system for tracking changes in source code during software development. GitWeb provides a web interface to Git repositories. You can browse history and content of source code, use search to find relevant commits and code. You can also clone repositories and upload code changes with a command-line Git client or with multiple available graphical clients. And you can share your code with people around the world. + To learn more on how to use Git visit Git tutorial. + Available since version: 19.19 +
+ Managing the repositories + After installation of GitWeb, a new repository can be created. It can be marked as private to limit access. +
+
+ Access + GitWeb can be accessed after installation e.g. by the web client through +
+
+ HTTP basic auth + GitWeb on FreedomBox currently supports HTTP remotes only. To avoid having to enter the password each time you pull/push to the repository, you can edit your remote to include the credentials. + + Example: + + + Your username and password will be encrypted. Someone monitoring the network traffic will notice the domain name only. + Note: If using this method, your password will be stored in plain text in the local repository's .git/config file. For this reason, you should create a FreedomBox user who has only access to the gitweb and never use an admin account. +
+
+ Mirroring + Though your repositories are primarily hosted on your own FreedomBox, you can configure a repository on another Git hosting system like GitLab as a mirror. +
+
+
+ I2P (Anonymity Network) +
+ About I2P + The Invisible Internet Project is an anonymous network layer intended to protect communication from censorship and surveillance. I2P provides anonymity by sending encrypted traffic through a volunteer-run network distributed around the world. + Find more information about I2P on their project homepage. +
+
+ Services Offered + The following services are offered via I2P in FreedomBox by default. Additional services may be available when enabled from I2P router console that can be launched from FreedomBox web interface. + + + Anonymous Internet browsing: I2P can be used to browse Internet anonymously. For this, configure your browser (preferable a Tor Browser) to connect to I2P proxy. This can be done by setting HTTP proxy and HTTPS proxy to freedombox.local (or your FreedomBox's local IP address) and ports to 4444 and 4445 respectively. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. + + + Reaching eepsites: I2P network can host websites that can remain anonymous. These are called eepsites and end with .i2p in their domain name. For example, is the website for I2P project in the I2P network. eepsites are not reachable using a regular browser via regular Internet connection. To browse eepsites, your browser needs to be configured to use HTTP, HTTPS proxies as described above. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. + + + Anonymous torrent downloads: I2PSnark, an application for anonymously downloading and sharing files over the BitTorrent network is available in I2P and enabled by default in FreedomBox. This application is controlled via a web interface that can be launched from 'Anonymous torrents' section of I2P app in FreedomBox web interface or from the I2P router console interface. Only logged-in users belonging to 'Manage I2P application' group can use this service. + + + IRC network: I2P network contains an IRC network called Irc2P. This network hosts the I2P project's official IRC channel among other channels. This service is enabled by default in FreedomBox. To use it, open your favourite IRC client. Then configure it to connect to host freedombox.local (or your FreedomBox's local IP address) with port number 6668. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. + + + I2P router console: This is the central management interface for I2P. It shows the current status of I2P, bandwidth statistics and allows modifying various configuration settings. You can tune your participation in the I2P network and use/edit a list of your favourite I2P sites (eepsites). Only logged-in users belonging to 'Manage I2P application' group can use this service. + + +
+
+
+ Ikiwiki (Wiki and Blog) +
+ What is Ikiwiki? + Ikiwiki converts wiki pages into HTML pages suitable for publishing on a website. It provides particularly blogging, podcasting, calendars and a large selection of plugins. +
+
+ Quick Start + After the app installation on your box administration interface: + + + Go to "Create" section and create a wiki or a blog + + + Go back to "Configure" section and click on /ikiwiki link + + + Click on your new wiki or blog name under "Parent directory" + + + Enjoy your new publication page. + + +
+
+ Creating a wiki or blog + You can create a wiki or blog to be hosted on your FreedomBox through the Wiki & Blog (Ikiwiki) page in FreedomBox. The first time you visit this page, it will ask to install packages required by Ikiwiki. + After the package install has completed, select the Create tab. You can select the type to be Wiki or Blog. Also type in a name for the wiki or blog, and the username and password for the wiki's/blog's admin account. Then click Update setup and you will see the wiki/blog added to your list. Note that each wiki/blog has its own admin account. + + + + + + + ikiwiki: Create + + + +
+
+ Accessing your wiki or blog + From the Wiki & Blog (Ikiwiki) page, select the Manage tab and you will see a list of your wikis and blogs. Click a name to navigate to that wiki or blog. + + + + + + + ikiwiki: Manage + + + + From here, if you click Edit or Preferences, you will be taken to a login page. To log in with the admin account that you created before, select the Other tab, enter the username and password, and click Login. +
+
+ User login through SSO + Besides the wiki/blog admin, other FreedomBox users can be given access to login and edit wikis and blogs. However, they will not have all the same permissions as the wiki admin. They can add or edit pages, but cannot change the wiki's configuration. + To add a wiki user, go to the Users and Groups page in FreedomBox (under System configuration, the gear icon at the top right corner of the page). Create or modify a user, and add them to the wiki group. (Users in the admin group will also have wiki access.) + To login as a FreedomBox user, go to the wiki/blog's login page and select the Other tab. Then click the "Login with HTTP auth" button. The browser will show a popup dialog where you can enter the username and password of the FreedomBox user. +
+
+ Adding FreedomBox users as wiki admins + + + Login to the wiki, using the admin account that was specified when the wiki was created. + + + Click "Preferences", then "Setup". + + + Under "main", in the "users who are wiki admins", add the name of a user on the FreedomBox. + + + (Optional) Under "auth plugin: passwordauth", uncheck the "enable passwordauth?" option. (Note: This will disable the old admin account login. Only SSO login using HTTP auth will be possible.) + + + Click "Save Setup". + + + Click "Preferences", then "Logout". + + + Login as the new admin user using "Login with HTTP auth". + + +
+
+
+ infinoted (Gobby Server) + infinoted is a server for Gobby, a collaborative text editor. + To use it, download Gobby, desktop client and install it. Then start Gobby and select "Connect to Server" and enter your FreedomBox's domain name. +
+ Port Forwarding + If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for infinoted: + + + TCP 6523 + + +
+
+
+ Matrix Synapse (Chat Server)
What is Matrix? Matrix is an open standard for interoperable, decentralized, real-time communication over IP. Synapse is the reference implementation of a Matrix server. It can be used to setup instant messaging on FreedomBox to host large chat rooms, end-to-end encrypted communication and audio/video calls. Matrix Synapse is a federated application where chat rooms can exist on any server and users from any server in the federated network can join them. Learn more about Matrix. @@ -1882,91 +1581,187 @@ echo "UPDATE users SET admin=1 WHERE name='@username:domainname'" | sudo sqlite3
- Email Client (Roundcube) + MediaWiki (Wiki)
- What is Roundcube? - Roundcube is a browser-based multilingual email client with an application-like user interface. Roundcube is using the Internet Message Access Protocol (IMAP) to access e-mail on a remote mail server. It supports MIME to send files, and provides particularly address book, folder management, message searching and spell checking. + About MediaWiki + MediaWiki is the software that powers the Wikimedia suite of wikis. + Read more about MediaWiki on Wikipedia + Available since: version 0.20.0
- Using Roundcube - After Roundcube is installed, it can be accessed at https://<your freedombox>/roundcube. Enter your username and password. The username for many mail services will be the full email address such as exampleuser@example.org and not just the username like exampleuser. Enter the address of your email service's IMAP server address in the Server field. You can try providing your domain name here such as example.org for email address exampleuser@example.org and if this does not work, consult your email provider's documentation for the address of the IMAP server. Using encrypted connection to your IMAP server is strongly recommended. To do this, prepend 'imaps://' at the beginning of your IMAP server address. For example, imaps://imap.example.org. - - - - - - - Logging into your IMAP server - - - -
-
- Using Gmail with Roundcube - If you wish to use Roundcube with your Gmail account, you need to first enable support for password based login in your Google account preferences. This is because Gmail won't allow applications to login with a password by default. To do this, visit Google Account preferences and enable Less Secure Apps. After this, login to Roundcube by providing your Gmail address as Username, your password and in the server field use imaps://imap.gmail.com. - - - - - - - Logging into Gmail - - - -
-
-
- File Sharing (Coquelicot) -
- About Coquelicot - Coquelicot is a "one-click" file sharing web application with a focus on protecting users' privacy. The basic principle is simple: users can upload a file to the server, in return they get a unique URL which can be shared with others in order to download the file. A download password can be defined. - After the upload you get a unique link that can be shared to your partners in order to - Read more about Coquelicot at the Coquelicot README - Available since: version 0.24.0 -
-
- When to use Coquelicot - Coquelicot is best used to quickly share a single file. If you want to share a folder, - - - for a single use, compress the folder and share it over Coquelicot - - - which must be kept synchronized between computers, use Syncthing instead - - - Coquelicot can only provide a reasonable degree of privacy. If anonymity is required, you should consider using the desktop application Onionshare instead. - Since Coquelicot fully uploads the file to the server, your FreedomBox will incur both upload and download bandwidth costs. For very large files, consider sharing them using BitTorrent by creating a private torrent file. If anonymity is required, use Onionshare. It is P2P and doesn't require a server. -
-
- Coquelicot on FreedomBox - With Coquelicot installed, you can upload files to your FreedomBox server and privately share them. - Post installation, the Coquelicot page offers two settings. - - - Upload Password: Coquelicot on FreedomBox is currently configured to use simple password authentication for ease of use. Remember that it's one global password for this Coquelicot instance and not your user password for FreedomBox. You need not remember this password. You can set a new one from the Plinth interface anytime. - - - Maximum File Size: You can alter the maximum size of the file that can be transferred through Coquelicot using this setting. The size is in Mebibytes. The maximum file size is only limited by the disk size of your FreedomBox. - - -
-
- Privacy - Someone monitoring your network traffic might find out that some file is being transferred through your FreedomBox and also possibly its size, but will not know the file name. Coquelicot encrypts files on the server and also fills the file contents with 0s when deleting them. This eliminates the risk of file contents being revealed in the event of your FreedomBox being confiscated or stolen. The real risk to mitigate here is a third-party also downloading your file along with the intended recipient. + MediaWiki on FreedomBox + MediaWiki on FreedomBox is configured to be publicly readable and privately editable. Only logged in users can make edits to the wiki. This configuration prevents spam and vandalism on the wiki.
- Sharing over instant messengers - Some instant messengers which have previews for websites might download your file in order to show a preview in the conversation. If you set the option of one-time download on a file, you might notice that the one download will be used up by the instant messenger. If sharing over such messengers, please use a download password in combination with a one-time download option. + User management + Users can be created by the MediaWiki administrator (user "admin") only. The "admin" user can also be used to reset passwords of MediaWiki users. The administrator password, if forgotten can be reset anytime from the MediaWiki app page in web interface.
- Sharing download links privately - It is recommended to share your file download links and download passwords over encrypted channels. You can simply avoid all the above problems with instant messenger previews by using instant messengers that support encrypted conversations like Riot with Matrix Synapse or XMPP (ejabberd server on FreedomBox) with clients that support end-to-end encryption. Send the download link and the download password in two separate messages (helps if your messenger supports perfect forward secrecy like XMPP with OTR). You can also share your links over PGP-encrypted email using Thunderbird. + Use cases + MediaWiki is quite versatile and can be put to many creative uses. It also comes with a lot of plugins and themes and is highly customizable. +
+ Personal Knowledge Repository + + + MediaWiki on FreedomBox can be your own personal knowledge repository. Since MediaWiki has good multimedia support, you can write notes, store images, create checklists, store references and bookmarks etc. in an organized manner. You can store the knowledge of a lifetime in your MediaWiki instance. + + +
+
+ Community Wiki + + + A community of users can use MediaWiki as their common repository of knowledge and reference material. It can used as a college notice board, documentation server for a small company, common notebook for study groups or as a fan wiki like wikia. + + +
+
+ Personal Wiki-based Website + + + Several websites on the internet are simply MediaWiki instances. MediaWiki on FreedomBox is read-only to visitors. Hence, it can be adapted to serve as your personal website and/or blog. MediaWiki content is easy to export and can be later moved to use another blog engine. + + +
+
+
+ Editing Wiki Content + The MediaWiki installation on FreedomBox ships with a basic editor with a toolbar for common options like Bold, Italics etc. Click on the Advanced section for more options like Headings, bullet lists etc. + + + + + + + mediawiki-toolbar.png + + + +
+ Visual Editor + + + MediaWiki's new Visual Editor gives a WYSIWYG user interface to creating wiki pages. This is still a Beta feature and is not provided by default with MediaWiki. A workaround is to use write your content using the Visual Editor in Wikipedia's Sandbox, switching to source editing mode and copying the content into your wiki. + + +
+
+ Other Formats + + + You don't have to necessarily learn the MediaWiki formatting language. You can write in your favorite format (Markdown, Org-mode, LaTeX etc.) and convert it to the MediaWiki format using Pandoc. + + +
+
+ Image Uploads + + + Image uploads have been enabled since FreedomBox version 0.36.0. You can also directly use images from Wikimedia Commons using a feature called Instant Commons. + + +
+
+
+ Customization +
+ Skins + MediaWiki's default skin is usually Vector. The default skin set by FreedomBox is Timeless. + Vector is a skin best-suited for viewing on desktop browsers. It is not suitable for mobile screen sizes. Wikimedia sites host a separate mobile site. It is not worth hosting a separate mobile site for small MediaWiki installations like those on FreedomBox. Using a mobile-friendly skin like Timeless is a cheaper way of solving the problem. + Administrators can choose a default skin from the app configuration. Users of the site also have the choice of viewing it with a different skin. +
- File Sharing (MLDonkey) + Minetest (Block Sandbox) + Minetest is a multiplayer infinite-world block sandbox. This module enables the Minetest server to be run on this FreedomBox, on the default port (30000). To connect to the server, a Minetest client is needed. +
+ Port Forwarding + If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Minetest: + + + UDP 30000 + + +
+
+
+ MiniDLNA (Simple Media Server) + MiniDLNA is a media server with the aim to be compliant with DLNA/UPnP clients. + Note: This service is available only on networks configured as "internal" zone. It is not available when connected via OpenVPN. +
+ What is UPnP/DLNA? + Universal plug & play is a set of networking protocols that allow devices within a network such as PCs, TVs, printers etc. to seamlessly discover each other and establish communication for data sharing. It is zero configuration protocol and requires only a media server and a media player that are compliant with the protocol. + DLNA is derived from UPnP as a form of standardizing media interoperability. It forms a standard/certification which many consumer electronics conform to. +
+
+ Setting up MiniDLNA on your FreedomBox + To install/enable the media server you need to navigate at MiniDLNA page and enable it. The application is intended to be available in the internal (home) network and therefore it requires a network interface configured for internal traffic. + After installation a web page becomes available on . It includes information for how many files the server is detecting, how many connections exist etc. This is very useful if plugging external disks with media to check if the new media files are detected properly. If that is not happening, disabling and enabling the server will fix it. +
+
+ Using MiniDLNA to play media on your devices + Any DLNA compliant device or media player should be able to automatically detect, browse and play media from MiniDLNA on FreedomBox. The following devices and media players have been tested: + + + GNOME Videos: Videos is the default media player on the popular GNU/Linux desktop environment GNOME. Open Videos, switch to 'Channels'. You should see a channel named 'freedombox: minidlna'. You will be able to browse and play media from it. + + + VLC media player: VLC is a very popular media player for GNU/Linux, Android, Windows and macOS. Open VLC and click on 'View -> Playlist'. In the playlist sidebar that appears, select 'Universal Plug'n'Play'. You should see an item named 'freedombox: minidlna'. You should be able to browse and play media from it. + + + Kodi: Kodi is a popular media centre software with user interface designed for Televisions. Open Kodi, goto 'System -> Service settings -> UPnP/DLNA' and 'Enable UPnP support'. Then visit 'Home -> Videos -> Files -> Add videos... -> Browse -> UPnP devices'. You should see 'freedombox: minidlna'. Select it and choose 'OK'. Then choose 'OK in the 'Add video source' dialog. From now on, you should see 'freedombox: minidlna' in 'Videos -> Files' section. You should be able to browse and play media from it. See Kodi documentation for more information. + + + Roku: Roku is an appliance connected to a TV for playing Internet streaming services. Many TVs also have Roku built into them. In Roku interface, find a channel called 'Roku Media Player' and open it. You should see an item called 'freedombox: minidlna'. You should be able to browse and play media from it. + + + Rhythmbox: Rhythmbox is the default audio player on the popular GNU/Linux desktop environment GNOME. Open Rhythmbox and ensure that the side pane is open by clicking on 'Application menu -> View -> Side Pane'. In the side pane you should see 'freedombox:minidlna' under the 'Shared' section. You should be able to browse and play audio files from it. Video files will not show up. + + +
+
+ Supported media formats + MiniDLNA supports a wide variety of video and audio file formats. + + + Video: Files ending with .avi, .mp4, .mkv, .mpg, .mpeg, .wmv, .m4v, .flv, .mov, .3gp, etc. + + + Audio: Files ending with .mp3, .ogg, .flac, .wav, .pcm, .wma, .fla, .aac, etc. + + + Image: Files ending with .jpg, .jpeg + + + Playlist: Files ending with .m3u, .pls + + + Captions: Files ending with .srt, .smi + + + Notably, it does not support the following file extensions. Renaming the file to a known extension seems to work in most cases. + + + Video: Files ending with .webm + + + In addition to file format support from MiniDLNA, your media player or device needs to support the audio/video codecs with which the media has been encoded. MiniDLNA does not have the ability to translate files into a codec understood by the player. If you face problems with media playback, use the VLC player to find the codecs used in the media and the check your device or media player documentation on whether the codecs are supported. +
+
+ File systems for external drives + If using an external drive that is used also from a Windows system the preferred filesystem should be NTFS. NTFS will keep Linux file permissions and UTF8 encoding for file names. This is useful if file names are in your language. +
+
+ External links + + + + +
+
+
+ MLDonkey (Peer-to-peer File Sharing)
What is MLDonkey? MLDonkey is an open-source, multi-protocol, peer-to-peer file sharing application that runs as a back-end server application on many platforms. It can be controlled through a user interface provided by one of many separate front-ends, including a Web interface, telnet interface and over a dozen native client programs. @@ -2010,94 +1805,336 @@ echo "UPDATE users SET admin=1 WHERE name='@username:domainname'" | sudo sqlite3
- File Synchronization (Syncthing) - With Syncthing installed on your FreedomBox, you can synchronize content from other devices to your FreedomBox and vice-versa. For example, you can keep the photos taken on your mobile phone synchronized to your FreedomBox. - Available since version: 0.14 - Users should keep in mind that Syncthing is a peer-to-peer synchronization solution, not a client-server one. This means that the FreedomBox isn't really the server and your other devices clients. They're all devices from Syncthing's perspective. You can use Syncthing to synchronize your files between any of your devices. The advantage that FreedomBox provides is that it is a server that's always running. Suppose you want your photos on your phone to be synchronized to your laptop, if you simply sync the photos to the FreedomBox, the laptop can get them from the FreedomBox whenever it comes online the next time. You don't have to be worried about your other devices being online for synchronization. If your FreedomBox is one of the devices set up with your Syncthing shared folder, you can rest assured that your other devices will eventually get the latest files once they come online. - After installation follow the instructions in the getting started of the Syncthing project. Syncthing allows individual folders to be selectively shared with other devices. Devices must be paired up before sharing by scanning QR codes or entering the device ids manually. Syncthing has a discovery service for easily identifying the other devices on the same network having Syncthing installed. - In order to access to the web client of the Syncthing instance running on your FreedomBox, use the path /syncthing. This web client is currently only accessible to the users of the FreedomBox that have administrator privileges, though it might be accessible to all FreedomBox users in a future release. - - - - - - - Syncthing web interface - - - - Syncthing has android apps available on the F-Droid and Google Play app stores. Cross-platform desktop apps are also available. - To learn more about Syncthing, please visit their official website and documentation. + Mumble (Voice Chat)
- Synchronizing over Tor - Syncthing should automatically sync with your FreedomBox even if it is only accessible as a Tor Onion Service. - If you would like to proxy your Syncthing client over Tor, set the all_proxy environment variable: - - For more information, see the Syncthing documentation on using proxies. + What is Mumble? + Mumble is a voice chat software. Primarily intended for use while gaming, it is suitable for simple talking with high audio quality, noise suppression, encrypted communication, public/private-key authentication by default, and "wizards" to configure your microphone for instance. A user can be marked as a "priority speaker" within a channel.
- Avoiding Syncthing Relays - Syncthing uses dynamic connections by default to connect with other peers. This means that if you are synchronizing over the Internet, the data might have to go through public Syncthing relays to reach your devices. This doesn't take advantage of the fact that your FreedomBox has a public IP address. - When adding your FreedomBox as a device in other Syncthing clients, set the address like "tcp://<my.freedombox.domain>" instead of "dynamic". This allows your Syncthing peers to directly connect to your FreedomBox avoiding the need for relays. It also allows for fast on-demand syncing if you don't want to keep Syncthing running all the time on your mobile devices. + Using Mumble + FreedomBox includes the Mumble server. Clients are available for desktop and mobile platforms. Users can download one of these clients and connect to the server.
-
- Using Syncthing with other applications -
- Password Manager - Password managers that store their databases in files are suitable for synchronization using Syncthing. The following example describes using a free password manager called KeePassXC in combination with Syncthing to serve as a replacement for proprietary password managers that store your passwords in the cloud. - KeePassXC stores usernames, passwords etc. in files have the .kdbx extension. These kdbx files can be stored in a Syncthing shared folder to keep them synchronized on multiple machines. Free software applications which can read this file format are available for both desktop and mobile. You typically have to just point the application at the .kdbx file and enter the master password to access your stored credentials. For example, the same kdbx file can be accessed by using KeePassXC on desktop and KeePassDX on Android. KeePassXC can also be used to fill credentials into login fields in the browser by installing a browser extension. -
-
-
-
- Network File Storage (Samba) - Samba lets you have shared folders over the local network that can be used from multiple computers running different operating systems. We refer to these shared folders as "shares". - You can have a personal folder shared between your own devices (Home share), a folder shared with a trusted group (Group share) or one that is shared with every device on the network (Open share). - Samba lets you to treat a share as if it's a local folder on your computer. However, shares are available only on the local network. - To learn more about Samba, please refer to the user documentation on their wiki. - Available since version: 19.22 -
- Using Samba - After installation, you can choose which disks to use for sharing. Enabled shares are accessible in the file manager on your computer at location \\freedombox (on Windows) or smb://freedombox.local (on Linux and Mac). There are three types of shares you can choose from: - Open share - accessible to everyone in your local network. - Group share - accessible only to FreedomBox users who are in the freedombox-share group. - Home share - every user in the freedombox-share group can have their own private space. -
- On Android - To access Samba shares on an Android device, install "Android Samba Client" from F-Droid or Google Play. Enter smb://freedombox.local/<disk> as the share path in the app. Your shared folders should then be visible in the file manager app. -
-
-
- Integration with other apps - Transmission app on FreedomBox provides a setting to allow downloads to be saved directly to a Samba share. - If you want to make available files synchronized with Syncthing through Samba you need to make sure you synchronize in a Samba share folder. Additionally in order to make Syncthing shares available in Samba Open share or Group share you will need to ensure you click "Permissions > Ignore" button under the "Advanced" tab in folder you wish in the Syncthing web UI. This will ensure that the files will be writable through Samba. -
-
- Comparison with other apps -
- Syncthing - Syncthing maintains a copy of the shared folder on each device that it is shared with. Samba maintains only one copy on your FreedomBox device. - Syncthing can synchronize your shared folders between devices over the Internet. Samba shares are only available on the local network. - Since Syncthing is primarily a synchronization solution, it has features like conflict resolution and versioning. Samba has only copy of the file, so it doesn't need such features. For example, if two people are editing a spreadsheet stored on a Samba share, the last one to save the file wins. -
-
-
-
- Gobby Server (infinoted) - infinoted is a server for Gobby, a collaborative text editor. - To use it, download Gobby, desktop client and install it. Then start Gobby and select "Connect to Server" and enter your FreedomBox's domain name.
Port Forwarding - If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for infinoted: + If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Mumble: - TCP 6523 + TCP 64738 + + + UDP 64738
+
+ Managing Permissions + A super user in Mumble has the ability to create administrator accounts who can in turn manage groups and channel permissions. This can be done after logging in with the username "SuperUser" using the super user password. See Mumble Guide for information on how to do this.. FreedomBox currently does not offer a UI to get or set the super user password for Mumble. A super user password is automatically generated during Mumble setup. To get the password, login to the terminal as admin user using Cockpit , Secure Shell or the console. Then, to read the super user password that was automatically generated during Mumble installation run the following command: + + You should see output such as: + 2019-11-06 02:47:41.313 1 => Password for 'SuperUser' set to 'noo8Dahwiesh']]> + Alternatively, you can set a new password as follows: + +
- IRC Client (Quassel) + OpenVPN (Virtual Private Network) +
+ What is OpenVPN? + OpenVPN provides to your FreedomBox a virtual private network service. You can use this software for remote access, site-to-site VPNs and Wi-Fi security. OpenVPN includes support for dynamic IP addresses and NAT. +
+
+ Port Forwarding + If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for OpenVPN: + + + UDP 1194 + + +
+
+ Setting up + + + In FreedomBox apps menu, select Virtual Private Network (OpenVPN) and click Install. + + + After the module is installed, there is an additional setup step that may take a long time to complete. Click "Start setup" to begin. + + + + + + + OpenVPN service page + + + + + + Wait for the setup to finish. This could take a while. + + + Once the setup of the OpenVPN server is complete, you can download your profile. This will download a file called <USER>.ovpn, where <USER> is the name of a FreedomBox user. Each FreedomBox user will be able to download a different profile. Users who are not administrators can download the profile from home page after login. + + + The ovpn file contains all the information a vpn client needs to connect to the server. + + + The downloaded profile contains the domain name of the FreedomBox that the client should connect to. This is picked up from the domain configured in 'Config' section of 'System' page. In case your domain is not configured properly, you may need to change this value after downloading the profile. If your OpenVPN client allows it, you can do this after importing the OpenVPN profile. Otherwise, you can edit the .ovpn profile file in a text editor and change the 'remote' line to contain the WAN IP address or hostname of your FreedomBox as follows. + + + +
+
+ Browsing Internet after connecting to VPN + After connecting to the VPN, the client device will be able to browse the Internet without any further configuration. However, a pre-condition for this to work is that you need to have at least one Internet connected network interface which is part of the 'External' firewall zone. Use the networks configuration page to edit the firewall zone for the device's network interfaces. +
+
+ Usage +
+ On Android/LineageOS + + + Visit FreedomBox home page. Login with your user account. From home page, download the OpenVPN profile. The file will be named username.ovpn. + + + + + + + + + OpenVPN Download Profile + + + + + + + + Download an OpenVPN client such as OpenVPN for Android. F-Droid repository is recommended. In the app, select import profile. + + + + + + + + + OpenVPN App + + + + + + + + In the select profile dialog, choose the username.opvn file you have just downloaded. Provide a name for the connection and save the profile. + + + + + + + + + OpenVPN import profile + + + + + + + + Newly created profile will show up. If necessary, edit the profile and set the domain name of your FreedomBox as the server address. + + + + + + + + + OpenVPN profile created + + + + + + + + + + OpenVPN edit domain name + + + + + + + + Connect by tapping on the profile. + + + + + + + + + OpenVPN connect + + + + + + + + + + OpenVPN connected + + + + + + + + When done, disconnect by tapping on the profile. + + + + + + + + + OpenVPN disconnect + + + + + + + +
+
+ On Debian + Install an OpenVPN client for your system + + Open the ovpn file with the OpenVPN client. + .ovpn]]> + If you use Network Manager, you can create a new connection by importing the file: + .ovpn]]> +
+
+
+ Checking if you are connected +
+ On Debian + + + Try to ping the FreedomBox or other devices on the local network. + + + Running the command ip addr should show a tun0 connection. + + + The command traceroute freedombox.org should show you the ip address of the VPN server as the first hop. + + +
+
+
+ Accessing internal services + After connecting to OpenVPN, you will be able to access FreedomBox services that are only meant to be accessed on internal networks. This is in addition to being able to access external services. This can be done by using the IP address 10.91.0.1 as the host name for these services. The following services are known to work: Privoxy, Tor Socks, Shadowsocks, I2P Proxy and Samba. Some services are known not to work at this time: Avahi, Bind and MiniDLNA. +
+
+ External Links + + + +
+
+
+ Privoxy (Web Proxy) + A web proxy acts as a filter for incoming and outgoing web traffic. Thus, you can instruct any computer in your network to pass internet traffic through the proxy to remove unwanted ads and tracking mechanisms. + Privoxy is a software for security, privacy, and accurate control over the web. It provides a much more powerful web proxy (and anonymity on the web) than what your browser can offer. Privoxy "is a proxy that is primarily focused on privacy enhancement, ad and junk elimination and freeing the user from restrictions placed on his activities" (source: Privoxy FAQ). +
+ Screencast + Watch the screencast on how to setup and use Privoxy in FreedomBox. +
+
+ Setting up + + + In FreedomBox, install Web Proxy (Privoxy) + + + + + + + Privoxy Installation + + + + + + Adapt your browser proxy settings to your FreedomBox hostname (or IP address) with port 8118. Please note that Privoxy can only proxy HTTP and HTTPS traffic. It will not work with FTP or other protocols. + + + + + + + Privoxy Browser Settings + + + + + + Go to page or . If Privoxy is installed properly, you will be able to configure it in detail; if not you will see an error message. + + + If you are using a laptop that occasionally has to connect through other routers than yours with the FreedomBox and Privoxy, you may want to install a proxy switch add-on that allows you to easily turn the proxy on or off. + + +
+
+ Advanced Users + + + The default installation should provide a reasonable starting point for most. There will undoubtedly be occasions where you will want to adjust the configuration, that can be dealt with as the need arises. + + + While using Privoxy, you can see its configuration details and documentation at or . + + + To enable changing these configurations, you first have to change the value of enable-edit-actions in /etc/privoxy/config to 1. Before doing so, read carefully the manual, especially: + + + + Access to the editor can not be controlled separately by "ACLs" or HTTP authentication, so that everybody who can access Privoxy can modify its configuration for all users. This option is not recommended for environments with untrusted users. Note that malicious client side code (e.g Java) is also capable of using the actions editor and you shouldn't enable this options unless you understand the consequences and are sure your browser is configured correctly. + + + + + + Now you find an EDIT button on the configuration screen in http://config.privoxy.org/. + + + The Quickstart is a good starting point to read on how to define own blocking and filtering rules. + + +
+
+
+ Quassel (IRC Client) Quassel is an IRC application that is split into two parts, a "core" and a "client". This allows the core to remain connected to IRC servers, and to continue receiving messages, even when the client is disconnected. FreedomBox can run the Quassel core service keeping you always online and one or more Quassel clients from a desktop or a mobile device can be used to connect and disconnect from it.
Why run Quassel? @@ -2452,37 +2489,554 @@ echo "UPDATE users SET admin=1 WHERE name='@username:domainname'" | sudo sqlite3
- MiniDLNA - MiniDLNA is a media server with the aim to be compliant with DLNA/UPnP clients. + Radicale (Calendar and Addressbook) + With Radicale, you can synchronize your personal calendars, ToDo lists, and addressbooks with your various computers, tablets, and smartphones, and share them with friends, without letting third parties know your personal schedule or contacts.
- What is UPnP/DLNA? - Universal plug & play is a set of networking protocols that allow devices within a network such as PCs, TVs, printers etc. to seamlessly discover each other and establish communication for data sharing. It is zero configuration protocol and requires only a media server and a media player that are compliant with the protocol. - DLNA is derived from UPnP as a form of standardizing media interoperability. It forms a standard/certification which many consumer electronics conform to. + Why should I run Radicale? + Using Radicale, you can get rid of centralized services like Google Calendar or Apple Calendar (iCloud) data mining your events and social connections.
- Setting up MiniDLNA on your FreedomBox. - To install/enable the media server you need to navigate at MiniDLNA page and enable it. The application is intended to be available in the internal (home) network and therefore it requires a network interface configured for internal traffic. - After installation a web page becomes available on . It includes information for how many files the server is detecting, how many connections exist etc. This is very useful if plugging external disks with media to check if the new media files are detected properly. If that is not happening, disabling and enabling the server will fix it. -
-
- File systems for external drives. - If using an external drive that is used also from a Windows system the preferred filesystem should be NTFS. NTFS will keep Linux file permissions and UTF8 encoding for file names. This is useful if file names are in your language. -
-
- External links + How to setup Radicale? + First, the Radicale server needs to be activated on your box. + + + Within FreedomBox Service: + + + select Apps + + + go to Radicale (Calendar and Addressbook) and + + + install the application. After the installation is complete, make sure the application is marked "enabled" in the FreedomBox interface. Enabling the application launches the Radicale CalDAV/CardDAV server. + + + define the access rights: + + + Only the owner of a calendar/addressbook can view or make changes + + + Any user can view any calendar/addressbook, but only the owner can make changes + + + Any user can view or make changes to any calendar/addressbook + + + + + + + Note, that only users with a FreedomBox login can access Radicale. - - + + + + + + Radicale-Plinth.png + + + + If you want to share a calendar with only some users, the simplest approach is to create an additional user-name for these users and to share that user-name and password with them. + Radicale provides a basic web interface, which only supports creating new calendars and addressbooks. To add events or contacts, an external supported client application is needed. + + + + + + + radicale_web.png + + + + + + Creating addressbook/calendar using the web interface + + + Visit https://IP-address-or-domain-for-your-server/radicale/ + + + Log in with your FreedomBox account + + + Select "Create new addressbook or calendar" + + + Provide a title and select the type + + + Optionally, provide a description or select a color + + + Click "Create" + + + The page will show the URL for your newly created addressbook or calendar + + + + + Now open your client application to create new calendar and address books that will use your FreedomBox and Radicale server. The Radicale website provides an overview of supported clients, but do not use the URLs described there; FreedomBox uses another setup, follow this manual. Below are the steps for two examples: + + + Example of setup with Evolution client: + + + Calendar + + + Create a new calendar + + + For "Type," select "CalDAV" + + + When "CalDAV" is selected, additional options will appear in the dialogue window. + + + URL: https://IP-address-or-domain-for-your-server/radicale/user/calendar-name.ics/. Items in italics need to be changed to match your settings. + + + note the trailing / in the path, it is important. + + + + + Enable "Use a secure connection." + + + Name the calendar + + + + + + + Radicale-Evolution-Docu.png + + + + + + + + TODO/Tasks list: Adding a TODO/Tasks list is basically the same as a calendar. + + + Contacts + + + Follow the same steps described above and replace CalDAV with WebDAV. The extension of the address book will be .vcf. + + + + + + +
+
+ Synchronizing over Tor + In FreedomBox, setting up a calendar with Radicale over Tor is the same as over the clear net. Here is a short summary: + + + When logged in to FreedomBox interface over Tor, click on Radicale, and at the prompt provide your FreedomBox user name and password. + + + In the Radicale web interface, log in using your FreedomBox user name and password. + + + Click on "Create new address book or calendar", provide a title, select a type, and click "Create". + + + Save the URL, e.g., https://ONION-ADDRESS-FOR-YOUR-SERVER.onion/radicale/USERNAME/CALENDAR-CODE/. Items in italics need to be changed to match your settings. + + + These instructions are for Thunderbird/Lightning. Note that you will need to be connected to Tor with the Tor Browser Bundle. + + + Open Thunderbird, install the Torbirdy add-on, and restart Thunderbird. (This may not be necessary.) + + + In the Lightning interface, under Calendar/Home in the left panel right click with the mouse and select "New calendar". + + + Select the location of your calendar as "On the Network". + + + Select CalDAV and for the location copy the URL, e.g., https://ONION-ADDRESS-FOR-YOUR-SERVER.onion/radicale/USERNAME/CALENDAR-CODE/. Items in italics need to be changed to match your settings. + + + Provide a name, etc. Click "Next". Your calendar is now syncing with your FreedomBox over Tor. + + + If you have not generated a certificate for your FreedomBox with "Let's Encrypt", you may need to select "Confirm Security Exception" when prompted. + + +
+
+ Synchronizing with your Android phone + There are various Apps that allow integration with the Radicale server. This example uses DAVx5, which is available e.g. on F-Droid. If you intend to use ToDo-Lists as well, the compatible app OpenTasks has to be installed first. + Follow these steps for setting up your account with the Radicale server running on your FreedomBox. + + + Install DAVx5 + + + Create a new account on DAVx5 by clicking on the floating + button. + + + Select the second option as shown in the first figure below and enter the base url as (don't miss the / at the end). DAVx5 will be able to discover both CalDAV and WebDAV accounts for the user. + + + Follow this video from DAVx5 FAQ to learn how to migrate your existing contacts to Radicale. + + + + Synchronizing contacts + + + + Click on the hamburger menus of CalDAV and CardDAV and select either "Refresh ..." in case of existing accounts or "Create ..." in case of new accounts (see the second screenshot below). + + + Check the checkboxes for the address books and calendars you want to synchronize and click on the sync button in the header. (see the third screenshot below) + + + + + + + + + DAVx5 account setup + + + + + + + + DAVx5 refresh + + + + + + + + DAVx5 account sync + + + +
+
+ Advanced Users +
+ Sharing resources + Above was shown an easy way to create a resource for a group of people by creating a dedicated account for all. Here will be described an alternative method where two users User1 and User2 are granted access to a calendar. This requires SSH-access to the FreedomBox. + + + create a file /etc/radicale/rights + + + + + + [friends_calendar] is just an identifier, can be any name. + + + The [owner-write] section makes sure that owners have access to their own files + + + + + edit file /etc/radicale/config and make the following changes in section [rights] + + + + + + + + Restart the radicale server or the FreedomBox + + +
+
+ Importing files + If you are using a contacts file exported from another service or application, it should be copied to: /var/lib/radicale/collections/user/contact file name.vcf. +
+
+
+ Migrating from Radicale Version 1.x to Version 2.x + During the month of February 2019, radicale in Debian testing was upgraded from version 1.x to version 2.x. Version 2.x is a better version but is incompatible with data and configuration used with 1.x. Automatic upgrade mechanism in FreedomBox, handled by unattended-upgrades does not automatically upgrade radicale to version 2.x due to changes in configuration files. However, FreedomBox version 19.1, which is available on February 23rd, 2019 in testing will perform data and configuration migration to radicale version 2.x. Typical users require no action, this will happen automatically. + If for some reason, you need to manually run apt dist-upgrade on your machine, then radicale will be upgraded to 2.x and then FreedomBox will not be able to perform its upgrade (due to upstream project deciding to remove migration tools in radicale 2.x version). To avoid this situation, the following process is recommended if you wish to perform an upgrade. + + However, if you already happen to perform an upgrade to radicale 2.x without help from FreedomBox, you need to perform data and configuration migration yourself. Follow this procedure: + + Notes: + + + python-radicale is an old package from radicale 1.x version that is still available in testing. This is a hack to use the --export-storage feature that is responsible for data migration. This feature is not available in radicale 2.x unfortunately. + + + Files ending with .dpkg-dist will exist only if you have chosen 'Keep your currently-installed version' when prompted for configuration file override during radicale 2.x upgrade. The above process will overwrite the old configuration with new fresh configuration. No changes are necessary to the two configuration files unless you have changed the setting for sharing calendars. + + + Note that during the migration, your data is safe in /var/lib/radicale/collections directory. New data will be created and used in /var/lib/radicale/collections/collections-root/ directory. + + + The tar command takes a backup your configuration and data in /root/radicale_backup.tgz in case you do something goes wrong and you want to undo the changes. + + +
+
+ Troubleshooting + 1. If you are using FreedomBox Pioneer Edition or installing FreedomBox on Debian Buster, then radicale may not be usable immediately after installation. This is due to a bug which has been fixed later. To overcome the problem, upgrade FreedomBox by clicking on 'Manual Update' from 'Updates' app. Otherwise, simply wait a day or two and let FreedomBox upgrade itself. After that install radicale. If radicale is already installed, disable and re-enable it after the update is completed. This will fix the problem and get radicale working properly. +
+
+
+ repro (SIP Server) + + + App removed + + repro has been removed from Debian 10 (Buster), and therefore is no longer available in FreedomBox. + +
+
+ Roundcube (Email Client) +
+ What is Roundcube? + Roundcube is a browser-based multilingual email client with an application-like user interface. Roundcube is using the Internet Message Access Protocol (IMAP) to access e-mail on a remote mail server. It supports MIME to send files, and provides particularly address book, folder management, message searching and spell checking. +
+
+ Using Roundcube + After Roundcube is installed, it can be accessed at https://<your freedombox>/roundcube. Enter your username and password. The username for many mail services will be the full email address such as exampleuser@example.org and not just the username like exampleuser. Enter the address of your email service's IMAP server address in the Server field. You can try providing your domain name here such as example.org for email address exampleuser@example.org and if this does not work, consult your email provider's documentation for the address of the IMAP server. Using encrypted connection to your IMAP server is strongly recommended. To do this, prepend 'imaps://' at the beginning of your IMAP server address. For example, imaps://imap.example.org. + + + + + + + Logging into your IMAP server + + + +
+
+ Using Gmail with Roundcube + If you wish to use Roundcube with your Gmail account, you need to first enable support for password based login in your Google account preferences. This is because Gmail won't allow applications to login with a password by default. To do this, visit Google Account preferences and enable Less Secure Apps. After this, login to Roundcube by providing your Gmail address as Username, your password and in the server field use imaps://imap.gmail.com. + + + + + + + Logging into Gmail + +
- News Feed Reader (Tiny Tiny RSS) + Samba (Network File Storage) + Samba lets you have shared folders over the local network that can be used from multiple computers running different operating systems. We refer to these shared folders as "shares". + You can have a personal folder shared between your own devices (Home share), a folder shared with a trusted group (Group share) or one that is shared with every device on the network (Open share). + Samba lets you to treat a share as if it's a local folder on your computer. However, shares are available only on the local network. + To learn more about Samba, please refer to the user documentation on their wiki. + Available since version: 19.22 +
+ Using Samba + After installation, you can choose which disks to use for sharing. Enabled shares are accessible in the file manager on your computer at location \\freedombox (on Windows) or smb://freedombox.local (on Linux and Mac). There are three types of shares you can choose from: + Open share - accessible to everyone in your local network. + Group share - accessible only to FreedomBox users who are in the freedombox-share group. + Home share - every user in the freedombox-share group can have their own private space. +
+ On Android + To access Samba shares on an Android device, install "Android Samba Client" from F-Droid or Google Play. Enter smb://freedombox.local/<disk> as the share path in the app. Your shared folders should then be visible in the file manager app. Samba shares can also be used by VLC for Android which automatically discovers them. +
+
+
+ Integration with other apps + Transmission app on FreedomBox provides a setting to allow downloads to be saved directly to a Samba share. + If you want to make available files synchronized with Syncthing through Samba you need to make sure you synchronize in a Samba share folder. Additionally in order to make Syncthing shares available in Samba Open share or Group share you will need to ensure you click "Permissions > Ignore" button under the "Advanced" tab in folder you wish in the Syncthing web UI. This will ensure that the files will be writable through Samba. +
+
+ Comparison with other apps +
+ Syncthing + Syncthing maintains a copy of the shared folder on each device that it is shared with. Samba maintains only one copy on your FreedomBox device. + Syncthing can synchronize your shared folders between devices over the Internet. Samba shares are only available on the local network. + Since Syncthing is primarily a synchronization solution, it has features like conflict resolution and versioning. Samba has only copy of the file, so it doesn't need such features. For example, if two people are editing a spreadsheet stored on a Samba share, the last one to save the file wins. +
+
+
+
+ Searx (Web Search) +
+ About Searx + Searx is a metasearch engine. A metasearch engine aggregates the results from various search engines and presents them in a unified interface. + Read more about Searx on their official website. + Available since: version 0.24.0 +
+
+ Screenshot + + + + + + + Searx Screenshot + + + +
+
+ Screencast + Searx installation and first steps (14 MB) +
+
+ Why use Searx? +
+ Personalization and Filter Bubbles + Search engines have the ability to profile users and serve results most relevant to them, putting people into filter bubbles, thus distorting people's view of the world. Search engines have a financial incentive to serve interesting advertisements to their users, increasing their chances of clicking on the advertisements. + A metasearch engine is a possible solution to this problem, as it aggregates results from multiple search engines thus bypassing personalization attempts by search engines. + Searx avoids storing cookies from search engines as a means of preventing tracking and profiling by search engines. +
+
+ Advertisement filtering + Searx filters out advertisements from the search results before serving the results, thus increasing relevance the of your search results and saving you from distractions. +
+
+ Privacy + Searx uses HTTP POST instead of GET by default to send your search queries to the search engines, so that anyone snooping your traffic wouldn't be able to read your queries. The search queries wouldn't stored in browser history either. + Note: Searx used from Chrome browser's omnibar would make GET requests instead of POST. +
+
+
+ Searx on FreedomBox + + + Searx on FreedomBox uses Single Sign On. This means that you should be logged in into your FreedomBox in the browser that you're using Searx. + + + SearX is easily accessible via Tor. + + + Searx can be added as a search engine to the Firefox browser's search bar. See Firefox Help on this topic. Once Searx is added, you can also set it as your default search engine. + + + Searx also offers search results in csv, json and rss formats, which can be used with scripts to automate some tasks. + + +
+
+
+ Shadowsocks (SOCKS5 proxy) +
+ What is Shadowsocks? + Shadowsocks is a lightweight and secure SOCKS5 proxy, designed to protect your Internet traffic. It can be used to bypass Internet filtering and censorship. Your FreedomBox can run a Shadowsocks client which can connect to a Shadowsocks server. It will also run a SOCKS5 proxy. Local devices can connect to this proxy, and their data will be encrypted and proxied through the Shadowsocks server. + Note: Shadowsocks is available in FreedomBox starting with version 0.18. +
+
+ Using the Shadowsocks client? + The current implementation of Shadowsocks in FreedomBox only supports configuring FreedomBox as a Shadowsocks client. The current use case for Shadowsocks is as follows: + + + Shadowsocks client (FreedomBox) is in a region where some parts of the Internet are blocked or censored. + + + Shadowsocks server is in a different region, which doesn't have these blocks. + + + The FreedomBox provides SOCKS proxy service on the local network for other devices to make use of its Shadowsocks connection. + + + At a future date it will be possible to configure FreedomBox as Shadowsocks server. +
+
+ Configuring your FreedomBox for the Shadowsocks client + To enable Shadowsocks, first navigate to the Socks5 Proxy (Shadowsocks) page and install it. + Server: the Shadowsocks server is not the FreedomBox IP or URL; rather, it will be another server or VPS that has been configured as a Shadowsocks server. There are also some public Shadowsocks servers listed on the web, but be aware that whoever operates the server can see where requests are going, and any non-encrypted data will be visible to them. + To use Shadowsocks after setup, set the SOCKS5 proxy URL in your device, browser or application to +
+
+
+ Syncthing (File Synchronization) + With Syncthing installed on your FreedomBox, you can synchronize content from other devices to your FreedomBox and vice-versa. For example, you can keep the photos taken on your mobile phone synchronized to your FreedomBox. + Available since version: 0.14 + Users should keep in mind that Syncthing is a peer-to-peer synchronization solution, not a client-server one. This means that the FreedomBox isn't really the server and your other devices clients. They're all devices from Syncthing's perspective. You can use Syncthing to synchronize your files between any of your devices. The advantage that FreedomBox provides is that it is a server that's always running. Suppose you want your photos on your phone to be synchronized to your laptop, if you simply sync the photos to the FreedomBox, the laptop can get them from the FreedomBox whenever it comes online the next time. You don't have to be worried about your other devices being online for synchronization. If your FreedomBox is one of the devices set up with your Syncthing shared folder, you can rest assured that your other devices will eventually get the latest files once they come online. + After installation follow the instructions in the getting started of the Syncthing project. Syncthing allows individual folders to be selectively shared with other devices. Devices must be paired up before sharing by scanning QR codes or entering the device ids manually. Syncthing has a discovery service for easily identifying the other devices on the same network having Syncthing installed. + In order to access to the web client of the Syncthing instance running on your FreedomBox, use the path /syncthing. This web client is currently only accessible to the users of the FreedomBox that have administrator privileges, though it might be accessible to all FreedomBox users in a future release. + + + + + + + Syncthing web interface + + + + Syncthing has android apps available on the F-Droid and Google Play app stores. Cross-platform desktop apps are also available. + To learn more about Syncthing, please visit their official website and documentation. +
+ Synchronizing over Tor + Syncthing should automatically sync with your FreedomBox even if it is only accessible as a Tor Onion Service. + If you would like to proxy your Syncthing client over Tor, set the all_proxy environment variable: + + For more information, see the Syncthing documentation on using proxies. +
+
+ Avoiding Syncthing Relays + Syncthing uses dynamic connections by default to connect with other peers. This means that if you are synchronizing over the Internet, the data might have to go through public Syncthing relays to reach your devices. This doesn't take advantage of the fact that your FreedomBox has a public IP address. + When adding your FreedomBox as a device in other Syncthing clients, set the address like "tcp://<my.freedombox.domain>" instead of "dynamic". This allows your Syncthing peers to directly connect to your FreedomBox avoiding the need for relays. It also allows for fast on-demand syncing if you don't want to keep Syncthing running all the time on your mobile devices. +
+
+ Using Syncthing with other applications +
+ Password Manager + Password managers that store their databases in files are suitable for synchronization using Syncthing. The following example describes using a free password manager called KeePassXC in combination with Syncthing to serve as a replacement for proprietary password managers that store your passwords in the cloud. + KeePassXC stores usernames, passwords etc. in files have the .kdbx extension. These kdbx files can be stored in a Syncthing shared folder to keep them synchronized on multiple machines. Free software applications which can read this file format are available for both desktop and mobile. You typically have to just point the application at the .kdbx file and enter the master password to access your stored credentials. For example, the same kdbx file can be accessed by using KeePassXC on desktop and KeePassDX on Android. KeePassXC can also be used to fill credentials into login fields in the browser by installing a browser extension. +
+
+
+
+ Tiny Tiny RSS (News Feed Reader) Tiny Tiny RSS is a news feed (RSS/Atom) reader and aggregator, designed to allow reading news from any location, while feeling as close to a real desktop application as possible. Any user created through FreedomBox web interface will be able to login and use this app. Each user has their own feeds, state and preferences.
Using the Web Interface - When enabled, Tiny Tiny RSS will be available from /tt-rss path on the web server. Any user created through Plinth will be able to login and use this app. + When enabled, Tiny Tiny RSS will be available from /tt-rss path on the web server. Any user created through FreedomBox will be able to login and use this app. @@ -2632,686 +3186,234 @@ echo "UPDATE users SET admin=1 WHERE name='@username:domainname'" | sudo sqlite3
- Simple Git Hosting (GitWeb) - Git is a distributed version-control system for tracking changes in source code during software development. GitWeb provides a web interface to Git repositories. You can browse history and content of source code, use search to find relevant commits and code. You can also clone repositories and upload code changes with a command-line Git client or with multiple available graphical clients. And you can share your code with people around the world. - To learn more on how to use Git visit Git tutorial. - Available since version: 19.19 + Tor (Anonymity Network)
- Managing the repositories - After installation of GitWeb, a new repository can be created. It can be marked as private to limit access. + What is Tor? + Tor is a network of servers operated by volunteers. It allows users of these servers to improve their privacy and security while surfing on the Internet. You and your friends are able to access to your FreedomBox via Tor network without revealing its IP address. Activating Tor application on your FreedomBox, you will be able to offer remote services (chat, wiki, file sharing, etc...) without showing your location. This application will give you a better protection than a public web server because you will be less exposed to intrusive people on the web.
- Access - GitWeb can be accessed after installation e.g. by the web client through + Using Tor to browse anonymously + Tor Browser is the recommended way to browse the web using Tor. You can download the Tor Browser from and follow the instructions on that site to install and run it.
- HTTP basic auth - GitWeb on FreedomBox currently supports HTTP remotes only. To avoid having to enter the password each time you pull/push to the repository, you can edit your remote to include the credentials. + Using Tor Onion Service to access your FreedomBox + Tor Onion Service provides a way to access your FreedomBox, even if it's behind a router, firewall, or carrier-grade NAT (i.e., your Internet Service Provider does not provide a public IPv4 address for your router). + To enable Tor Onion Service, first navigate to the Anonymity Network (Tor) page. (If you don't see it, click on the FreedomBox logo at the top-left of the page, to go to the main Apps page.) On the Anonymity Network (Tor) page, under Configuration, check "Enable Tor Onion Service", then press the Update setup button. Tor will be reconfigured and restarted. + After a while, the page will refresh and under Status, you will see a table listing the Onion Service .onion address. Copy the entire address (ending in .onion) and paste it into the Tor Browser's address field, and you should be able to access your FreedomBox. (You may see a certificate warning because FreedomBox has a self-signed certificate.) - Example: - + + + + + + Tor Configuration - FreedomBox + + - Your username and password will be encrypted. Someone monitoring the network traffic will notice the domain name only. - Note: If using this method, your password will be stored in plain text in the local repository's .git/config file. For this reason, you should create a FreedomBox user who has only access to the gitweb and never use an admin account. + Currently only HTTP (port 80), HTTPS (port 443), and SSH (port 22) are accessible through the Tor Onion Service configured on the FreedomBox.
- Mirroring - Though your repositories are primarily hosted on your own FreedomBox, you can configure a repository on another Git hosting system like GitLab as a mirror. -
-
-
- SIP Server (repro) - - - App removed - - repro has been removed from Debian 10 (Buster), and therefore is no longer available in FreedomBox. - -
-
- SOCKS5 proxy (Shadowsocks) -
- What is Shadowsocks? - Shadowsocks is a lightweight and secure SOCKS5 proxy, designed to protect your Internet traffic. It can be used to bypass Internet filtering and censorship. Your FreedomBox can run a Shadowsocks client which can connect to a Shadowsocks server. It will also run a SOCKS5 proxy. Local devices can connect to this proxy, and their data will be encrypted and proxied through the Shadowsocks server. - Note: Shadowsocks is available in FreedomBox starting with Plinth version 0.18. -
-
- Using the Shadowsocks client? - The current implementation of Shadowsocks in FreedomBox only supports configuring FreedomBox as a Shadowsocks client. The current use case for Shadowsocks is as follows: + Apps accessible via Tor + The following apps can be accessed over Tor. Note that this list is not exhaustive. - Shadowsocks client (FreedomBox) is in a region where some parts of the Internet are blocked or censored. + Calendar and Addressbook (Radicale) - Shadowsocks server is in a different region, which doesn't have these blocks. + File Synchronization (Syncthing) - The FreedomBox provides SOCKS proxy service on the local network for other devices to make use of its Shadowsocks connection. + Feed reader (TinyTinyRSS) - - At a future date it will be possible to configure FreedomBox as Shadowsocks server. -
-
- Configuring your FreedomBox for the Shadowsocks client - To enable Shadowsocks, first navigate to the Socks5 Proxy (Shadowsocks) page and install it. - Server: the Shadowsocks server is not the FreedomBox IP or URL; rather, it will be another server or VPS that has been configured as a Shadowsocks server. There are also some public Shadowsocks servers listed on the web, but be aware that whoever operates the server can see where requests are going, and any non-encrypted data will be visible to them. - To use Shadowsocks after setup, set the SOCKS5 proxy URL in your device, browser or application to -
-
-
- Virtual Private Network (OpenVPN) -
- What is OpenVPN? - OpenVPN provides to your FreedomBox a virtual private network service. You can use this software for remote access, site-to-site VPNs and Wi-Fi security. OpenVPN includes support for dynamic IP addresses and NAT. -
-
- Port Forwarding - If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for OpenVPN: - - UDP 1194 + Web Search (Searx) + + + Wiki (MediaWiki) + + + Wiki and Blog (Ikiwiki)
- Setting up - - - In Plinth apps menu, select Virtual Private Network (OpenVPN) and click Install. - - - After the module is installed, there is an additional setup step that may take a long time to complete. Click "Start setup" to begin. - - - - - - - OpenVPN service page - - - - - - Wait for the setup to finish. This could take a while. - - - Once the setup of the OpenVPN server is complete, you can download your profile. This will download a file called <USER>.ovpn, where <USER> is the name of a FreedomBox user. Each FreedomBox user will be able to download a different profile. Users who are not administrators can download the profile from home page after login. - - - The ovpn file contains all the information a vpn client needs to connect to the server. - - - The downloaded profile contains the domain name of the FreedomBox that the client should connect to. This is picked up from the domain configured in 'Config' section of 'System' page. In case your domain is not configured properly, you may need to change this value after downloading the profile. If your OpenVPN client allows it, you can do this after importing the OpenVPN profile. Otherwise, you can edit the .ovpn profile file in a text editor and change the 'remote' line to contain the WAN IP address or hostname of your FreedomBox as follows. - - - -
-
- Browsing Internet after connecting to VPN - After connecting to the VPN, the client device will be able to browse the Internet without any further configuration. However, a pre-condition for this to work is that you need to have at least one Internet connected network interface which is part of the 'External' firewall zone. Use the networks configuration page to edit the firewall zone for the device's network interfaces. -
-
- Usage -
- On Android/LineageOS - - - Visit FreedomBox home page. Login with your user account. From home page, download the OpenVPN profile. The file will be named username.ovpn. - - - - - - - - - OpenVPN Download Profile - - - - - - - - Download an OpenVPN client such as OpenVPN for Android. F-Droid repository is recommended. In the app, select import profile. - - - - - - - - - OpenVPN App - - - - - - - - In the select profile dialog, choose the username.opvn file you have just downloaded. Provide a name for the connection and save the profile. - - - - - - - - - OpenVPN import profile - - - - - - - - Newly created profile will show up. If necessary, edit the profile and set the domain name of your FreedomBox as the server address. - - - - - - - - - OpenVPN profile created - - - - - - - - - - OpenVPN edit domain name - - - - - - - - Connect by tapping on the profile. - - - - - - - - - OpenVPN connect - - - - - - - - - - OpenVPN connected - - - - - - - - When done, disconnect by tapping on the profile. - - - - - - - - - OpenVPN disconnect - - - - - - - -
-
- On Debian - Install an OpenVPN client for your system - - Open the ovpn file with the OpenVPN client. - .ovpn]]> - If you use Network Manager, you can create a new connection by importing the file: - .ovpn]]> -
-
-
- Checking if you are connected -
- On Debian - - - Try to ping the FreedomBox or other devices on the local network. - - - Running the command ip addr should show a tun0 connection. - - - The command traceroute freedombox.org should show you the ip address of the VPN server as the first hop. - - -
-
-
- External Links - - - -
-
-
- Voice Chat (Mumble) -
- What is Mumble? - Mumble is a voice chat software. Primarily intended for use while gaming, it is suitable for simple talking with high audio quality, noise suppression, encrypted communication, public/private-key authentication by default, and "wizards" to configure your microphone for instance. A user can be marked as a "priority speaker" within a channel. -
-
- Using Mumble - FreedomBox includes the Mumble server. Clients are available for desktop and mobile platforms. Users can download one of these clients and connect to the server. -
-
- Port Forwarding - If your FreedomBox is behind a router, you will need to set up port forwarding on your router. You should forward the following ports for Mumble: + Running a Tor relay + When Tor is installed, it is configured by default to run as a bridge relay. The relay or bridge option can be disabled through the Tor configuration page in FreedomBox. + At the bottom of the Tor page in FreedomBox, there is a list of ports used by the Tor relay. If your FreedomBox is behind a router, you will need to configure port forwarding on your router so that these ports can be reached from the public Internet. + The requirements to run a relay are listed in the Tor Relay Guide. In short, it is - TCP 64738 + recommended that a relay has at least 16 Mbit/s (Mbps) upload and download bandwidth available for Tor. More is better. - UDP 64738 + required that a Tor relay be allowed to use a minimum of 100 GByte of outbound and of incoming traffic per month. + + + recommended that a <40 Mbit/s non-exit relay should have at least 512 MB of RAM available; A relay faster than 40 Mbit/s should have at least 1 GB of RAM.
- Managing Permissions - A super user in Mumble has the ability to create administrator accounts who can in turn manage groups and channel permissions. This can be done after logging in with the username "SuperUser" using the super user password. See Mumble Guide for information on how to do this.. FreedomBox currently does not offer a UI to get or set the super user password for Mumble. A super user password is automatically generated during Mumble setup. To get the password, login to the terminal as admin user using Cockpit , Secure Shell or the console. Then, to read the super user password that was automatically generated during Mumble installation run the following command: - - You should see output such as: - 2019-11-06 02:47:41.313 1 => Password for 'SuperUser' set to 'noo8Dahwiesh']]> - Alternatively, you can set a new password as follows: - + (Advanced) Usage as a SOCKS proxy + FreedomBox provides a Tor SOCKS port that other applications can connect to, in order to route their traffic over the Tor network. This port is accessible on any interfaces configured in the internal firewall zone. To configure the application, set SOCKS Host to the internal network connection's IP address, and set the SOCKS Port to 9050. +
+ Example with Firefox + Your web browser can be configured to use the Tor network for all of your browsing activity. This allows for censorship circumvention and also hides your IP address from websites during regular browsing. For anonymity, using tor browser is recommended. + Configure your local FreedomBox IP address and port 9050 as a SOCKS v5 proxy in Firefox. There are extensions to allow for easily turning the proxy on and off. + + + + + + + Configuring Firefox with Tor SOCKS proxy + + + + With the SOCKS proxy configured, you can now access any onion URL directly from Firefox. FreedomBox itself has an onion v3 address that you can connect to over the Tor network (bookmark this for use in emergency situations). +
+
+
+ Circumventing Tor censorship + If your ISP is trying to block Tor traffic, you can use tor bridge relays to connect to the tor network. + 1. Get the bridge configuration from the Tor BridgeDB + + + + + + + Tor BridgeDB + + + + 2. Add the lines to your FreedomBox Tor configuration as show below. + + + + + + + Tor Configuration Page + + +
- VoIP Helper (Coturn) - Coturn is a server to facilitate audio/video calls and conferences by providing an implementation of TURN and STUN protocols. WebRTC, SIP and other communication servers can use it to establish a call between parties who are otherwise unable connect to each other. - It is not meant to be used directly by users. Servers such as Matrix Synapse need to be configured with the details provided on the Coturn app page. Apart from Matrix Synapse, Jitsi, Ejabberd, Nextcloud Talk, etc. can use Coturn server for audio/video calls and conferences. There is no need for the servers to be running on the same machine as FreedomBox and external servers can use Coturn running on FreedomBox. - Coturn is available in FreedomBox since version 20.8 as an advanced app. This means that you need to check "Show advanced apps and features" in "General Configuration" to see Coturn icon in the "Apps" section. + Transmission (BitTorrent Web Client)
- How it works - When making an audio/video call, it is best to route the media streams between two peers directly. This will give the best possible latency (better signal quality) and avoid depending on a centralized server (privacy). It scales well because a simple chat server can host thousands of calls without involving the server in any way other than to setup the call. However, this approach does not work most of the time to due to how networks are configured. Most peers on the network do not have a unique IP address allocated to them. They work hidden behind a network device that performs "Network Address Translation" (NAT) for them. This means that the two peers have no way of reaching each other. - To address this problem, a simple technique known as STUN was introduced. With the help of a third party STUN server, the peers can trick the NAT devices, to carry the traffic between the two peers. Unfortunately, this trick only works about 80% of the time. So, if STUN fails, peers have no choice but to route their traffic through an intermediary server called TURN server. All the mechanism of trying out STUN first and then falling back to TURN is described in a protocol known as ICE. - On FreedomBox, Coturn provides both STUN and TURN servers. Both services are provided over TCP as well as UDP. They are provided on unencrypted as well as encrypted channels (with have a higher chance of success). Since STUN servers are very inexpensive and don't consume a lot of server resources, there is no authentication needed to use them. TURN servers on the other hand need authentication. This authentication is highly simplified and does not require maintaining a database of users. A server such as matrix-synapse which is about to setup an audio/video call between two peers will generate a username and password using a shared secret. When the peers use the TURN server, they will be validated using these credentials because the TURN server also knows the same secret. - In summary, a communication server needs to know the URLs of the STUN/TURN servers along with a shared authentication secret for TURN. After that, during audio/video call setup, they will correctly guide the peers to use STUN/TURN servers. Coturn app in FreedomBox provides exactly this information. This information can be used to configure a communication server irrespective of whether it is running on the same FreedomBox or on another server. -
-
- Configuring Matrix Synapse - Matrix Synapse server in FreedomBox can be configured to use Coturn TURN/STUN server. In future, when you install Matrix Synapse, FreedomBox will automatically install Coturn and configure its parameters into Matrix Synapse. To configure Matrix Synapse, edit the file /etc/matrix-synapse/homeserver.yaml with the following lines: - - And then restart matrix-synapse server by disabling and re-enabling the matrix-synapse app. -
-
-
- Web Proxy (Privoxy) - A web proxy acts as a filter for incoming and outgoing web traffic. Thus, you can instruct any computer in your network to pass internet traffic through the proxy to remove unwanted ads and tracking mechanisms. - Privoxy is a software for security, privacy, and accurate control over the web. It provides a much more powerful web proxy (and anonymity on the web) than what your browser can offer. Privoxy "is a proxy that is primarily focused on privacy enhancement, ad and junk elimination and freeing the user from restrictions placed on his activities" (source: Privoxy FAQ). -
- Screencast - Watch the screencast on how to setup and use Privoxy in FreedomBox. -
-
- Setting up - - - In Plinth install Web Proxy (Privoxy) - - - - - - - Privoxy Installation - - - - - - Adapt your browser proxy settings to your FreedomBox hostname (or IP address) with port 8118. Please note that Privoxy can only proxy HTTP and HTTPS traffic. It will not work with FTP or other protocols. - - - - - - - Privoxy Browser Settings - - - - - - Go to page or . If Privoxy is installed properly, you will be able to configure it in detail; if not you will see an error message. - - - If you are using a laptop that occasionally has to connect through other routers than yours with the FreedomBox and Privoxy, you may want to install a proxy switch add-on that allows you to easily turn the proxy on or off. - - -
-
- Advanced Users - - - The default installation should provide a reasonable starting point for most. There will undoubtedly be occasions where you will want to adjust the configuration, that can be dealt with as the need arises. - - - While using Privoxy, you can see its configuration details and documentation at or . - - - To enable changing these configurations, you first have to change the value of enable-edit-actions in /etc/privoxy/config to 1. Before doing so, read carefully the manual, especially: - - - - Access to the editor can not be controlled separately by "ACLs" or HTTP authentication, so that everybody who can access Privoxy can modify its configuration for all users. This option is not recommended for environments with untrusted users. Note that malicious client side code (e.g Java) is also capable of using the actions editor and you shouldn't enable this options unless you understand the consequences and are sure your browser is configured correctly. - - - - - - Now you find an EDIT button on the configuration screen in http://config.privoxy.org/. - - - The Quickstart is a good starting point to read on how to define own blocking and filtering rules. - - -
-
-
- Web Search (Searx) -
- About Searx - Searx is a metasearch engine. A metasearch engine aggregates the results from various search engines and presents them in a unified interface. - Read more about Searx on their official website. - Available since: version 0.24.0 + What is Transmission ? + BitTorrent is a communications protocol using peer-to-peer (P2P) file sharing. It is not anonymous; you should assume that others can see what files you are sharing. There are two BitTorrent web clients available in FreedomBox: Transmission and Deluge. They have similar features, but you may prefer one over the other. + Transmission is a lightweight BitTorrent client that is well known for its simplicity and a default configuration that "Just Works".
Screenshot - + - Searx Screenshot + Transmission Web Interface
- Screencast - Searx installation and first steps (14 MB) + Using Transmission + After installing Transmission, it can be accessed at https://<your freedombox>/transmission. Transmission uses single sign-on from FreedomBox, which means that if you are logged in on your FreedomBox, you can directly access Transmission without having to enter the credentials again. Otherwise, you will be prompted to login first and then redirected to the Transmission app.
- Why use Searx? + Tips
- Personalization and Filter Bubbles - Search engines have the ability to profile users and serve results most relevant to them, putting people into filter bubbles, thus distorting people's view of the world. Search engines have a financial incentive to serve interesting advertisements to their users, increasing their chances of clicking on the advertisements. - A metasearch engine is a possible solution to this problem, as it aggregates results from multiple search engines thus bypassing personalization attempts by search engines. - Searx avoids storing cookies from search engines as a means of preventing tracking and profiling by search engines. -
-
- Advertisement filtering - Searx filters out advertisements from the search results before serving the results, thus increasing relevance the of your search results and saving you from distractions. -
-
- Privacy - Searx uses HTTP POST instead of GET by default to send your search queries to the search engines, so that anyone snooping your traffic wouldn't be able to read your queries. The search queries wouldn't stored in browser history either. - Note: Searx used from Chrome browser's omnibar would make GET requests instead of POST. -
-
-
- Searx on FreedomBox - - - Searx on FreedomBox uses Single Sign On. This means that you should be logged in into your FreedomBox in the browser that you're using Searx. - - - SearX is easily accessible via Tor. - - - Searx can be added as a search engine to the Firefox browser's search bar. See Firefox Help on this topic. Once Searx is added, you can also set it as your default search engine. - - - Searx also offers search results in csv, json and rss formats, which can be used with scripts to automate some tasks. - - -
-
-
- Wiki (MediaWiki) -
- About MediaWiki - MediaWiki is the software that powers the Wikimedia suite of wikis. - Read more about MediaWiki on Wikipedia - Available since: version 0.20.0 -
-
- MediaWiki on FreedomBox - MediaWiki on FreedomBox is configured to be publicly readable and privately editable. Only logged in users can make edits to the wiki. This configuration prevents spam and vandalism on the wiki. -
- User management - Users can be created by the MediaWiki administrator (user "admin") only. The "admin" user can also be used to reset passwords of MediaWiki users. The administrator password, if forgotten can be reset anytime from the MediaWiki app page in web interface. -
-
- Use cases - MediaWiki is quite versatile and can be put to many creative uses. It also comes with a lot of plugins and themes and is highly customizable. -
- Personal Knowledge Repository - - - MediaWiki on FreedomBox can be your own personal knowledge repository. Since MediaWiki has good multimedia support, you can write notes, store images, create checklists, store references and bookmarks etc. in an organized manner. You can store the knowledge of a lifetime in your MediaWiki instance. - - -
-
- Community Wiki - - - A community of users can use MediaWiki as their common repository of knowledge and reference material. It can used as a college notice board, documentation server for a small company, common notebook for study groups or as a fan wiki like wikia. - - -
-
- Personal Wiki-based Website - - - Several websites on the internet are simply MediaWiki instances. MediaWiki on FreedomBox is read-only to visitors. Hence, it can be adapted to serve as your personal website and/or blog. MediaWiki content is easy to export and can be later moved to use another blog engine. - - -
-
-
- Editing Wiki Content - The MediaWiki installation on FreedomBox ships with a basic editor with a toolbar for common options like Bold, Italics etc. Click on the Advanced section for more options like Headings, bullet lists etc. - - - - - - - mediawiki-toolbar.png - - - -
- Visual Editor - - - MediaWiki's new Visual Editor gives a WYSIWYG user interface to creating wiki pages. This is still a Beta feature and is not provided by default with MediaWiki. A workaround is to use write your content using the Visual Editor in Wikipedia's Sandbox, switching to source editing mode and copying the content into your wiki. - - -
-
- Other Formats - - - You don't have to necessarily learn the MediaWiki formatting language. You can write in your favorite format (Markdown, Org-mode, LaTeX etc.) and convert it to the MediaWiki format using Pandoc. - - -
-
- Image Uploads - - - Image uploads have been enabled since FreedomBox version 0.36.0. You can also directly use images from Wikimedia Commons using a feature called Instant Commons. - - -
-
-
- Customization -
- Skins - MediaWiki's default skin is usually Vector. The default skin set by FreedomBox is Timeless. - Vector is a skin best-suited for viewing on desktop browsers. It is not suitable for mobile screen sizes. Wikimedia sites host a separate mobile site. It is not worth hosting a separate mobile site for small MediaWiki installations like those on FreedomBox. Using a mobile-friendly skin like Timeless is a cheaper way of solving the problem. - Administrators can choose a default skin from the app configuration. Users of the site also have the choice of viewing it with a different skin. -
+ Transferring Downloads from the FreedomBox + + + Transmission's downloads directory can be added as a shared folder in the "Sharing" app. You can then access your downloads from this shared folder using a web browser. + + + (Advanced) If you have the ssh access to your FreedomBox, you can use sftp to browse the downloads directory using a suitable file manager or web browser (e.g. dolphin or Konqueror). + +
- Wiki and Blog (Ikiwiki) + User Websites
- What is Ikiwiki? - Ikiwiki converts wiki pages into HTML pages suitable for publishing on a website. It provides particularly blogging, podcasting, calendars and a large selection of plugins. + What is User websites? + User websites is a module of the Apache webserver enabled to allow users defined in the FreedomBox system to expose a set of static files on the FreedomBox filesystem as a website to the local network and/or the internet according to the network and firewall setup. + + + + + + + + + Application basics + + + + + + Category + + + File sharing + + + + + Available since version + + + 0.9.4 + + + + + Upstream project website + + + + + + + + + + Upstream end user documentation + + + + + + + + + +
- Quick Start - After the app installation on your box administration interface: - - - Go to "Create" section and create a wiki or a blog - - - Go back to "Configure" section and click on /ikiwiki link - - - Click on your new wiki or blog name under "Parent directory" - - - Enjoy your new publication page. - - -
-
- Creating a wiki or blog - You can create a wiki or blog to be hosted on your FreedomBox through the Wiki & Blog (Ikiwiki) page in Plinth. The first time you visit this page, it will ask to install packages required by Ikiwiki. - After the package install has completed, select the Create tab. You can select the type to be Wiki or Blog. Also type in a name for the wiki or blog, and the username and password for the wiki's/blog's admin account. Then click Update setup and you will see the wiki/blog added to your list. Note that each wiki/blog has its own admin account. + Screenshot - - - - - - ikiwiki: Create - - + Add when/if an interface is made for FreedomBox
- Accessing your wiki or blog - From the Wiki & Blog (Ikiwiki) page, select the Manage tab and you will see a list of your wikis and blogs. Click a name to navigate to that wiki or blog. + Using User websites + The module is always enabled and offers no configuration from the FreedomBox web interface. There is no configuration or status page shown for this module in the FreedomBox web interface. + To serve documents, place the files in the designated directory in a FreedomBox user's home directory in the filesystem. + 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. 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. +
+
+ Using SFTP to create public_html and upload documents - - - - - - ikiwiki: Manage - - + To be written - From here, if you click Edit or Preferences, you will be taken to a login page. To log in with the admin account that you created before, select the Other tab, enter the username and password, and click Login. -
-
- User login through SSO - Besides the wiki/blog admin, other FreedomBox users can be given access to login and edit wikis and blogs. However, they will not have all the same permissions as the wiki admin. They can add or edit pages, but cannot change the wiki's configuration. - To add a wiki user, go to the Users and Groups page in Plinth (under System configuration, the gear icon at the top right corner of the page). Create or modify a user, and add them to the wiki group. (Users in the admin group will also have wiki access.) - To login as a FreedomBox user, go to the wiki/blog's login page and select the Other tab. Then click the "Login with HTTP auth" button. The browser will show a popup dialog where you can enter the username and password of the FreedomBox user. -
-
- Adding FreedomBox users as wiki admins - - - Login to the wiki, using the admin account that was specified when the wiki was created. - - - Click "Preferences", then "Setup". - - - Under "main", in the "users who are wiki admins", add the name of a user on the FreedomBox. - - - (Optional) Under "auth plugin: passwordauth", uncheck the "enable passwordauth?" option. (Note: This will disable the old admin account login. Only SSO login using HTTP auth will be possible.) - - - Click "Save Setup". - - - Click "Preferences", then "Logout". - - - Login as the new admin user using "Login with HTTP auth". - - -
-
-
- Anonymity Network (I2P) -
- About I2P - The Invisible Internet Project is an anonymous network layer intended to protect communication from censorship and surveillance. I2P provides anonymity by sending encrypted traffic through a volunteer-run network distributed around the world. - Find more information about I2P on their project homepage. -
-
- Services Offered - The following services are offered via I2P in FreedomBox by default. Additional services may be available when enabled from I2P router console that can be launched from FreedomBox web interface. - - - Anonymous Internet browsing: I2P can be used to browse Internet anonymously. For this, configure your browser (preferable a Tor Browser) to connect to I2P proxy. This can be done by setting HTTP proxy and HTTPS proxy to freedombox.local (or your FreedomBox's local IP address) and ports to 4444 and 4445 respectively. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. - - - Reaching eepsites: I2P network can host websites that can remain anonymous. These are called eepsites and end with .i2p in their domain name. For example, is the website for I2P project in the I2P network. eepsites are not reachable using a regular browser via regular Internet connection. To browse eepsites, your browser needs to be configured to use HTTP, HTTPS proxies as described above. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. - - - Anonymous torrent downloads: I2PSnark, an application for anonymously downloading and sharing files over the BitTorrent network is available in I2P and enabled by default in FreedomBox. This application is controlled via a web interface that can be launched from 'Anonymous torrents' section of I2P app in FreedomBox web interface or from the I2P router console interface. Only logged-in users belonging to 'Manage I2P application' group can use this service. - - - IRC network: I2P network contains an IRC network called Irc2P. This network hosts the I2P project's official IRC channel among other channels. This service is enabled by default in FreedomBox. To use it, open your favourite IRC client. Then configure it to connect to host freedombox.local (or your FreedomBox's local IP address) with port number 6668. This service is available only when you are reaching FreedomBox using local network (networks in internal zone) and not available when connecting to FreedomBox from the Internet. One exception to this is when you connect to FreedomBox's VPN service from Internet you can still use this service. - - - I2P router console: This is the central management interface for I2P. It shows the current status of I2P, bandwidth statistics and allows modifying various configuration settings. You can tune your participation in the I2P network and use/edit a list of your favourite I2P sites (eepsites). Only logged-in users belonging to 'Manage I2P application' group can use this service. - -
@@ -3918,41 +4020,10 @@ turn_allow_guests: True]]>
- Configure - Configure has some general configuration options: -
- Hostname - - - Hostname is the local name by which other devices on the local network can reach your FreedomBox. The default hostname is freedombox. - - -
-
- Domain Name - - - Domain name is the global name by which other devices on the Internet can reach your FreedomBox. The value set here is used by the Chat Server (XMPP), Matrix Synapse, Certificates (Let's Encrypt), and Monkeysphere. - - -
-
- Webserver Home Page - - - This is an advanced option that allows you to set something other than FreedomBox Service (Plinth) as the home page to be served on the domain name of the FreedomBox. For example, if your FreedomBox's domain name is and you set MediaWiki as the home page, visiting will take you to instead of the usual . You can set any web application, Ikiwiki wikis and blogs or Apache's default index.html page as the web server home page. - - - - Once some other app is set as the home page, you can only navigate to the FreedomBox Service (Plinth) by typing into the browser. - /freedombox can also be used as an alias to /plinth - - - - Tip: Bookmark the URL of FreedomBox Service (Plinth) before setting the home page to some other app. - - -
+ BIND (Domain Name Server) + BIND enables you to publish your Domain Name System (DNS) information on the Internet, and to resolve DNS queries for your user devices on your network. + Currently, on FreedomBox, BIND is only used to resolve DNS queries for other machines on local network. It is also incompatible with sharing Internet connection from FreedomBox. + Note: This service is available only on networks configured as "internal" zone. It is not available when connected via OpenVPN.
Cockpit (Server Administration) @@ -4195,6 +4266,43 @@ https://exampletorhs.onion/_cockpit/]]> The reason for this behaviour is that Cockpit uses WebSockets to connect to the backend server. Cross site requests for WebSockets must be prevented for security reasons. To implement this, Cockpit maintains a list of all domains from which requests are allowed. FreedomBox automatically configures this list whenever you add or remove a domain. However, since we can't rely on IP addresses, they are not added by FreedomBox to this domain list. You can see the current list of allowed domains, as managed by FreedomBox, in /etc/cockpit/cockpit.conf. You may edit this, but do so only if you understand web security consequences of this.
+
+ Configure + Configure has some general configuration options: +
+ Hostname + + + Hostname is the local name by which other devices on the local network can reach your FreedomBox. The default hostname is freedombox. + + +
+
+ Domain Name + + + Domain name is the global name by which other devices on the Internet can reach your FreedomBox. The value set here is used by the Chat Server (XMPP), Matrix Synapse, Certificates (Let's Encrypt), and Monkeysphere. + + +
+
+ Webserver Home Page + + + This is an advanced option that allows you to set something other than FreedomBox Service as the home page to be served on the domain name of the FreedomBox. For example, if your FreedomBox's domain name is and you set MediaWiki as the home page, visiting will take you to instead of the usual . You can set any web application, Ikiwiki wikis and blogs or Apache's default index.html page as the web server home page. + + + + Once some other app is set as the home page, you can only navigate to the FreedomBox Service by typing into the browser. + /freedombox can also be used as an alias to /plinth + + + + Tip: Bookmark the URL of FreedomBox Service before setting the home page to some other app. + + +
+
Date & Time This network time server is a program that maintains the system time in synchronization with servers on the Internet. @@ -4365,12 +4473,26 @@ https://exampletorhs.onion/_cockpit/]]> Firewall management in FreedomBox is done using FirewallD.
Interfaces - Each interface is needs to be assigned to one (and only one) zone. Whatever rules are in effect for a zone, those rules start to apply for that interface. For example, if HTTP traffic is allowed in a particular zone, then web requests will be accepted on all the addresses configured for all the interfaces assigned to that zone. + Each interface is needs to be assigned to one (and only one) zone. If an interface is not assigned any zone, it is automatically assigned external zone. Whatever rules are in effect for a zone, those rules start to apply for that interface. For example, if HTTP traffic is allowed in a particular zone, then web requests will be accepted on all the addresses configured for all the interfaces assigned to that zone. There are primarily two firewall zones used. The internal zone is meant for services that are provided to all machines on the local network. This may include services such as streaming media and simple file sharing. The external zone is meant for services that are provided publicly on the Internet. This may include services such as blog, website, email web client etc. For details on how network interfaces are configured by default, see the Networks section.
- Ports/Services + Opening Custom Ports + Cockpit app provides advanced management of firewall. Both FreedomBox and Cockpit operate over firewalld and are hence compatible with each other. In particular, Cockpit can be used to open custom services or ports on FreedomBox. This is useful if you are manually running your own services in addition to the services provided by FreedomBox on the same machine. + + + + + + + firewalld-cockpit.png + + + +
+
+ FreedomBox Ports/Services The following table attempts to document the ports, services and their default statuses in FreedomBox. If you find this page outdated, see the Firewall status page in FreedomBox interface. @@ -6224,7 +6346,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0]]>
- Certificates (Let's Encrypt) + Let's Encrypt (Certificates) A digital certificate allows users of a web service to verify the identity of the service and to securely communicate with it. FreedomBox can automatically obtain and setup digital certificates for each available domain. It does so by proving itself to be the owner of a domain to Let's Encrypt, a certificate authority (CA). Let's Encrypt is a free, automated, and open certificate authority, run for the public's benefit by the Internet Security Research Group (ISRG). Please read and agree with the Let's Encrypt Subscriber Agreement before using this service.
@@ -6694,6 +6816,40 @@ wifi.scan-rand-mac-address=no]]>
+
+ Advanced Network Operations + Cockpit provides many advanced networking features over those offered by FreedomBox. Both FreedomBox and Cockpit operate over Network Manager and are hence compatible with each other. Some of the functions provided by Cockpit include: + + + Set the maximum transmission unit (MTU) for a network connection + + + Change the hardware address (MAC address) of a network interface + + + Add more DNS servers and configure routing of a network connection + + + Creating bonded devices for highly available network interfaces + + + Creating bridge devices to join network interfaces for aggregating separate networks + + + Manage VLAN for creating virtual partitions in the physical network + + + + + + + + + networks-cockpit.png + + + +
Manual Network Operation FreedomBox automatically configures networks by default and provides a simplified interface to customize the configuration to specific needs. In most cases, manual operation is not necessary. The following steps describe how to manually operate network configuration in the event that a user finds FreedomBox interface to insufficient for task at hand or to diagnose a problem that FreedomBox does not identify. @@ -6725,27 +6881,7 @@ nmcli con modify "" connection.zone internal]]>
- Performance (cockpit-pcp) - Performance app allows you to collect, store and view information about utilization of the hardware. This can gives you basic insights into usage patterns and whether the hardware is overloaded by users and services. - Performance metrics are collected by Performance Co-Pilot and can be viewed using the Cockpit app. Performance app is available in FreedomBox since version 20.9. When this system app is installed and enabled, cockpit's graphs shows the past (up to one year at a time). - - - - - - - performance-one-week.png - - - -
-
- Power - Power provides an easy way to restart or shut down FreedomBox. After you select "Restart" or "Shut Down", you will be asked to confirm. - "Restart" and "Shut Down" options can also be reached from the user dropdown menu on the top right. -
-
- Public Visibility (PageKite) + PageKite (Public Visibility)
What is PageKite? PageKite makes local websites and services publicly accessible immediately without creating yourself a public IP address. It does this by tunneling protocols such as HTTPS or SSH through firewalls and NAT. Using PageKite requires an account on a PageKite relay service. One such service is . @@ -6761,7 +6897,7 @@ nmcli con modify "" connection.zone internal]]> Add a kite to your account. Note your kite name and kite secret. - In Plinth, go to the "Configure PageKite" tab on the Public Visibility (PageKite) page. + In FreedomBox, go to the "Configure PageKite" tab on the Public Visibility (PageKite) page. Check the "Enable PageKite" box, then enter your kite name and kite secret. Click "Save settings". @@ -6781,7 +6917,27 @@ nmcli con modify "" connection.zone internal]]>
- Secure Shell + Performance (System Monitoring) + Performance app allows you to collect, store and view information about utilization of the hardware. This can gives you basic insights into usage patterns and whether the hardware is overloaded by users and services. + Performance metrics are collected by Performance Co-Pilot and can be viewed using the Cockpit app. Performance app is available in FreedomBox since version 20.9. When this system app is installed and enabled, cockpit's graphs shows the past (up to one year at a time). + + + + + + + performance-one-week.png + + + +
+
+ Power + Power provides an easy way to restart or shut down FreedomBox. After you select "Restart" or "Shut Down", you will be asked to confirm. + "Restart" and "Shut Down" options can also be reached from the user dropdown menu on the top right. +
+
+ Secure Shell (SSH) Sever
What is Secure Shell? FreedomBox runs openssh-server server by default allowing remote logins from all interfaces. If your hardware device is connected to a monitor and a keyboard, you may login directly as well. Regular operation of FreedomBox does not require you to use the shell. However, some tasks or identifying a problem may require you to login to a shell. @@ -6789,7 +6945,7 @@ nmcli con modify "" connection.zone internal]]>
Setting Up A User Account
- Plinth First Log In: Admin Account + FreedomBox First Log In: Admin Account When creating an account in FreedomBox's web interface for the first time, this user will automatically have administrator capabilities. Admin users are able to log in using ssh (see Logging In below) and have superuser privileges via sudo.
@@ -6815,13 +6971,13 @@ nmcli con modify "" connection.zone internal]]> To login via SSH, to your FreedomBox: Replace fbx with the name of the user you wish to login as. freedombox should be replaced with the hostname or IP address of you FreedomBox device as found in the Quick Start process. - fbx is the default user present on FreedomBox with superuser privileges. Any other user created using Plinth and belonging to the group admin will be able to login. The root account has no password set and will not be able to login. Access will be denied to all other users. + fbx is the default user present on FreedomBox with superuser privileges. Any other user created using FreedomBox and belonging to the group admin will be able to login. The root account has no password set and will not be able to login. Access will be denied to all other users. fbx and users in admin group will also be able to login on the terminal directly. Other users will be denied access. If you repeatedly try to login as a user and fail, you will be blocked from logging in for some time. This is due to libpam-abl package that FreedomBox installs by default. To control this behavior consult libpam-abl documentation.
SSH over Tor - If in Plinth you have enabled onion services via Tor, you can access your FreedomBox using ssh over Tor. On a GNU/Linux computer, install netcat-openbsd. + If in FreedomBox you have enabled onion services via Tor, you can access your FreedomBox using ssh over Tor. On a GNU/Linux computer, install netcat-openbsd. Edit ~/.ssh/config to enable connections over Tor. @@ -6875,7 +7031,51 @@ nmcli con modify "" connection.zone internal]]> Service discovery is not essential and works only on internal networks. It may be disabled to improve security especially when connecting to a hostile local network.
- Snapshots + Storage + Storage allows you to see the storage devices attached to your FreedomBox and their disk space usage. + FreedomBox can automatically detect and mount removable media like USB flash drives. They are listed under the Removable Devices section along with an option to eject them. + If there is some free space left after the root partition, the option to expand the root partition is also available. This is typically not shown, since expanding the root partition happens automatically when the FreedomBox starts up for the first time. + + + + + + + Storage.png + + + +
+ Advanced Storage Operations + Cockpit provides many advanced storage features over those offered by FreedomBox. Both FreedomBox and Cockpit operate over Udisks2 storage daemon and are hence compatible with each other. Some of the functions provided by Cockpit include: + + + Format a disk or partition with a fresh filesystem + + + Add, remove partitions or wipe the partition table + + + Create and unlock encrypted file systems + + + Create and manage RAID devices + + + + + + + + + storage-cockpit.png + + + +
+
+
+ Storage Snapshots Snapshots allows you to create filesystem snapshots, and rollback the system to a previous snapshot. @@ -6893,22 +7093,6 @@ nmcli con modify "" connection.zone internal]]>
-
- Storage - Storage allows you to see the storage devices attached to your FreedomBox and their disk space usage. - FreedomBox can automatically detect and mount removable media like USB flash drives. They are listed under the Removable Devices section along with an option to eject them. - If there is some free space left after the root partition, the option to expand the root partition is also available. This is typically not shown, since expanding the root partition happens automatically when the FreedomBox starts up for the first time. - - - - - - - Storage.png - - - -
Software Updates FreedomBox can automatically install security updates. On the Update page of the System section in FreedomBox web interface you can turn on automatic updates. This feature is enabled by default and there is no manual action necessary. It is strongly recommended that you have this option enabled to keep your FreedomBox secure. @@ -7039,7 +7223,7 @@ Password:
Supported Hardware - Use these hardware if you are able to download FreedomBox images and prepare an SD card by following the manual. If you wish for simper setup process, please buy the FreedomBox kits from recommended hardware instead. If you are using a board that uses SD cards, when you flash the FreedomBox image onto your SD card, we recommend that you use an SD card with at least 8GB of storage space. + Use these hardware if you are able to download FreedomBox images and prepare an SD card by following the manual. If you wish for simper setup process, please buy the FreedomBox kits from recommended hardware instead. If you are using a board that uses SD cards, when you flash the FreedomBox image onto your SD card, we recommend that you use an SD card with at least 8GB of storage space. @@ -8314,10 +8498,10 @@ Password: You can build and install a package from its Debian's version control repository. For example, + dpkg -i ../freedombox*.deb]]>
@@ -9190,7 +9374,7 @@ esac]]> - This page will help you get started with using FreedomBox on a virtual machine using VirtualBox. While VirtualBox images are primarily used for testing and development, they can also be used for regular use if you have spare resources on one of your machines. This setup is useful if: + This page will help you get started with using FreedomBox on a virtual machine using VirtualBox. While VirtualBox images are primarily used for testing and development, they can also be used for regular use if you have spare resources on one of your machines. This setup is useful if: You don't own one of the supported hardware devices. @@ -9202,9 +9386,9 @@ esac]]> You don't want to disturb your Debian installation to try out FreedomBox. - Prebuilt FreedomBox images for VirtualBox are routinely made available in VirtualBox's own VDI image file format. They contain a Debian GNU/Linux operating system and an installation of FreedomBox with all dependencies ready to run on any OS supported by VirtualBox (Windows, Linux, Macintosh, and Solaris). + Prebuilt FreedomBox images for VirtualBox are routinely made available in VirtualBox's own VDI image file format. They contain a Debian GNU/Linux operating system and an installation of FreedomBox with all dependencies ready to run on any OS supported by VirtualBox (Windows, Linux, Macintosh, and Solaris). A more adventurous alternative to downloading one of these images is to install Debian on VirtualBox and then install FreedomBox on it. - VirtualBox itself is available from (or your distribution's package manager). + VirtualBox itself is available from (or your distribution's package manager).
Download Follow the instructions on the download page to download and verify a VirtualBox image. The latest images are available on freedombox.org. @@ -9264,7 +9448,7 @@ esac]]>
First Boot When satisfied with the VM settings click the start button in the VirtualBox UI and your new FreedomBox will boot. - The console of the VM will show the textual screen below when finished booting, from here most interaction with FreedomBox will be through the web interface (aka. Plinth) in a browser. + The console of the VM will show the textual screen below when finished booting, from here most interaction with FreedomBox will be through the web interface in a browser. @@ -9276,7 +9460,7 @@ esac]]> If everything went well so far, you should be able to access the web interface of FreedomBox by pointing a browser on the host machine to . - In case freedombox.local cannot be resolved, you need to find out your FreedomBox's IP address as described in Finding out the IP address of the virtual machine. Then access this IP from a web browser which is on the same network as the VM (f.ex. the host). If all is well, you are now presented with a welcome message and invited to complete the first boot process. + In case freedombox.local cannot be resolved, you need to find out your FreedomBox's IP address as described in Finding out the IP address of the virtual machine. Then access this IP from a web browser which is on the same network as the VM (for example, the host). If all is well, you are now presented with a welcome message and invited to complete the first boot process. @@ -9292,7 +9476,7 @@ esac]]>
Using See the FreedomBox usage page for more details. - You can log in to the Debian GNU/Linux system as the user created during Plinth first boot on the VirtualBox console or remotely via ssh. + You can log in to the Debian GNU/Linux system as the user created during FreedomBox first boot on the VirtualBox console or remotely via ssh. After logging in, you can become root with the command sudo su.
@@ -9642,7 +9826,7 @@ esac]]> Finding out the IP address of the virtual machine This depends on the network configuration you chose. With a bridged adapter, your virtual machine gets its IP address from the DHCP server of your network, most likely of your Router. You can try the first couple of IP addresses or check your router web interface for a list of connected devices. If you chose host-only adapter, the IP address is assigned by the DHCP server of your VirtualBox network. In the VirtualBox Manager, go to File -> Preferences -> Network -> Host-only Networks. You can see and edit the DHCP address range there, typically you get assigned addresses close to the Lower Address Bound. - Another possibility of finding the IP address is to login via the Virtualbox Manager (or similar software). The FreedomBox images do not have any default user accounts, so you need to set an initial user and password using the passwd-in-image script. + Another possibility of finding the IP address is to login via the VirtualBox Manager (or similar software). The FreedomBox images do not have any default user accounts, so you need to set an initial user and password using the passwd-in-image script. See also QuickStart for instructions on how to scan your network to discover the IP of the VM.
@@ -10281,6 +10465,67 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Release Notes The following are the release notes for each FreedomBox version. +
+ FreedomBox 20.10 (2020-06-01) +
+ Top Highlights + + + pagekite: Fix expired certificates causing connection failures + + + tor: Fix problems with running a relay + + +
+
+ Other Changes + + + backups: Add optional field - Name + + + cockpit: Promote for advanced storage/firewalld/networking ops + + + firewall: Don't show tun interface in internal zone warning + + + firewall: Mention that internal services are available over VPN + + + ikiwiki: Enable 'attachment' plugin by default + + + locale: Update translations for Spanish, French, Russian, Norwegian Bokmål, Czech, Hungarian, and Greek + + + minidlna: Add link to manual page + + + minidlna: Fix internationalization for name of the app + + + mldonkey: Add app to freedombox-share group + + + openvpn: Use app toggle button and common app view + + + radicale: Fix link in description to clients + + + samba: Add clients information + + + templates: Fix setup state check + + + users: Avoid error when user's groups cannot be parsed + + +
+
FreedomBox 20.9 (2020-05-18)
@@ -13455,7 +13700,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Development priorities - Upcoming priorities are discussed on an regular basis. You find the progress of the FreedomBox Service (Plinth) with its priorities here: issues board and milestones. + Upcoming priorities are discussed on an regular basis. You find the progress of the FreedomBox Service with its priorities here: issues board and milestones. Please check next progress calls to keep yourself on track and meet members of the release team. A TODO page aggregates the complete list of the items to work on for FreedomBox.
@@ -13473,7 +13718,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw] If you are a developer, you can contribute code to one of the sub-projects of FreedomBox. Step-by-step process of contributing code to FreedomBox is available. - FreedomBox Service (Plinth): a web interface to administer the functions of FreedomBox. + FreedomBox Service: a web interface to administer the functions of FreedomBox. Freedom Maker: a script to build FreedomBox disk images for use on various hardware devices or virtual machines. @@ -13488,7 +13733,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw] If you are a user experience designer, you can help FreedomBox with the following items: - UI experience for the FreedomBox Service (Plinth) web interface + UI experience for the FreedomBox Service web interface Web design for freedombox.org, freedomboxfoundation.org and the wiki pages @@ -13517,7 +13762,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Document: User Manual, Website and Wiki - FreedomBox needs better documentation for users and contributors. FreedomBox manual is prepared by aggregating various pages on the wiki and exporting to various formats. The manual is then used in FreedomBox Service (Plinth) and elsewhere. + FreedomBox needs better documentation for users and contributors. FreedomBox manual is prepared by aggregating various pages on the wiki and exporting to various formats. The manual is then used in FreedomBox Service and elsewhere. If you wish to contribute to the FreedomBox wiki (and consequently the FreedomBox manual), you can create a wiki account and start editing. For contributing to the website please start a discussion on the FreedomBox discussion forum's development category.
@@ -13581,21 +13826,21 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
FreedomBox Service (Plinth) FreedomBox Service (Plinth) is a web interface to administer the functions of the FreedomBox. - FreedomBox Service (Plinth) is Free Software under GNU Affero General Public License version 3 or (at your option) a later version. + FreedomBox Service is Free Software under GNU Affero General Public License version 3 or (at your option) a later version.
Using - FreedomBox Service (Plinth) comes installed with all FreedomBox images. You can download FreedomBox images and run on any of the supported hardware. Then, you can access FreedomBox Service (Plinth) by visiting the URL or . + FreedomBox Service comes installed with all FreedomBox images. You can download FreedomBox images and run on any of the supported hardware. Then, you can access FreedomBox Service by visiting the URL or . - If you are on a Debian box, you may install FreedomBox Service (Plinth) from Debian package archive. Currently, only Buster (stable), Bullseye (testing), and Sid (unstable) are supported. To install FreedomBox Service (Plinth) run: + If you are on a Debian box, you may install FreedomBox Service from Debian package archive. Currently, only Buster (stable), Bullseye (testing), and Sid (unstable) are supported. To install FreedomBox Service run: - You can also get FreedomBox Service (Plinth) from its Git repository and install from source. + You can also get FreedomBox Service from its Git repository and install from source.
@@ -13716,7 +13961,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Contributing - We are looking for help to improve FreedomBox Service (Plinth). You can contribute to FreedomBox Service (Plinth) by not just by coding but also by translating, documenting, designing, packaging and providing support. + We are looking for help to improve FreedomBox Service. You can contribute to FreedomBox Service by not just by coding but also by translating, documenting, designing, packaging and providing support. Instructions on how to contribute code are available. @@ -13731,7 +13976,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw] List of bugs, TODO items and feature requests are available on the issue tracker. - Before contributing to FreedomBox Service (Plinth) code, you need understand Python and Django on top which it is built. + Before contributing to FreedomBox Service code, you need understand Python and Django on top which it is built. You can request for development assistance on the discussion forum, the mailing list or the #freedombox IRC channel. @@ -13741,7 +13986,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw] Debian Package - FreedomBox Service (Plinth) is packaged for Debian. FreedomBox Service (Plinth) is a native package and packaging source code is part of the main package source code. + FreedomBox Service is packaged for Debian. FreedomBox Service is a native package and packaging source code is part of the main package source code. Issues related to packaging are listed on Debian BTS. diff --git a/doc/manual/en/images/firewalld-cockpit.png b/doc/manual/en/images/firewalld-cockpit.png new file mode 100644 index 0000000000000000000000000000000000000000..397f8247c6e262abe39fdc6f1dbc54ee9c2065ab GIT binary patch literal 46555 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 literal 0 HcmV?d00001 diff --git a/doc/manual/en/images/networks-cockpit.png b/doc/manual/en/images/networks-cockpit.png new file mode 100644 index 0000000000000000000000000000000000000000..0f32e5e7d68b8cfa9ca2790cd51e88d3a45bf05c GIT binary patch literal 46402 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 E0M_0`ZvX%Q literal 0 HcmV?d00001 diff --git a/doc/manual/en/images/storage-cockpit.png b/doc/manual/en/images/storage-cockpit.png new file mode 100644 index 0000000000000000000000000000000000000000..eff21ba5cf94c278dc13d58d9550b15bce271701 GIT binary patch literal 61222 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
es/FreedomBox/Manual/Apache_userdir52020-03-01 11:59:06fioddorSe alinea con la versión 06 en inglés del 26 de febrero de 202042019-10-21 14:19:20fioddorCorrección menor32019-10-21 14:17:11fioddorCorrección menor22019-08-29 12:55:24fioddorCorrección menor12019-08-29 12:50:13fioddorSe crea la versión española.
Sitios Web de Usuario (User websites) (userdir)
¿Qué es User websites?User websites es un módulo del servidor web Apache habilitado para permitir a los usuarios definidos en el sistema FreedomBox exponer un conjunto de archivos del sistema de ficheros de FreedomBox como sitio web a la red local y/o a internet de acuerdo a la configuración de la red y el cortafuegos. Datos básicos de la aplicaciónCategoría Compartición de archivos Disponible desde la versión 0.9.4Sitio web del proyecto original Documentación original de usuario
Captura de pantallaAñadir cuando/si se crea un interfaz para FreedomBox
Usar User websitesEl módulo está siempre activado y el interfaz web de FreedomBox no ofrece configuración ni página de estado para este módulo. Para servir documentos con el módulo solo se necesita poner los documentos en un subdirectorio designado /home/<un_usuario_de_plinth>/public_html. User websites servirá los archivos que haya en este directorio cuando se reciban peticiones con la URI ~<un_usuario_de_freedombox>. Por tanto para un dominio ejemplo.org con un usuario pepe una petición ejemplo.org/~pepe/index.html transferirá el fichero /home/pepe/public_html/index.html.
Usar SFTP para crear public_html y subir archivosPendiente de redactar Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Apache_userdir72020-05-30 19:46:57SunilMohanAdapaUpdate the title to emphasize app name over its generic name62020-05-23 22:51:13fioddorSe alinea con la versión 07 en inglés del 23 de mayo de 202052020-03-01 11:59:06fioddorSe alinea con la versión 06 en inglés del 26 de febrero de 202042019-10-21 14:19:20fioddorCorrección menor32019-10-21 14:17:11fioddorCorrección menor22019-08-29 12:55:24fioddorCorrección menor12019-08-29 12:50:13fioddorSe crea la versión española.
Sitios Web de Usuario (User websites)
¿Qué es User websites?User websites es un módulo del servidor web Apache habilitado para permitir a los usuarios definidos en el sistema FreedomBox exponer un conjunto de archivos del sistema de ficheros de FreedomBox como sitio web a la red local y/o a internet de acuerdo a la configuración de la red y el cortafuegos. Datos básicos de la aplicaciónCategoría Compartición de archivos Disponible desde la versión 0.9.4Sitio web del proyecto original Documentación original de usuario
Captura de pantallaAñadir cuando/si se crea un interfaz para FreedomBox
Usar User websitesEl módulo está siempre activado y el interfaz web de FreedomBox no ofrece configuración ni página de estado para este módulo. Para servir documentos con el módulo solo se necesita poner los documentos en un subdirectorio designado /home/<un_usuario_de_plinth>/public_html. User websites servirá los archivos que haya en este directorio cuando se reciban peticiones con la URI ~<un_usuario_de_freedombox>. Por tanto para un dominio ejemplo.org con un usuario pepe una petición ejemplo.org/~pepe/index.html transferirá el fichero /home/pepe/public_html/index.html.
Usar SFTP para crear public_html y subir archivosPendiente de redactar Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Backups.raw.xml b/doc/manual/es/Backups.raw.xml index 1252bc656..1ae3f1aa8 100644 --- a/doc/manual/es/Backups.raw.xml +++ b/doc/manual/es/Backups.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Backups82020-04-11 10:33:24fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_15425872020-04-04 13:32:23fioddorCorrección menor62020-04-04 13:31:45fioddorImágenes indicativas52020-04-04 13:10:54fioddorCorrección.42020-04-04 13:09:42fioddorSe usan imágenes traducidas y más actuales.32020-04-04 13:06:11fioddorCorrección. Descripción de pasos como texto en los títulos en vez de como imágenes (mejor accesibilidad)22019-11-14 18:14:48fioddorSe alinea con la versión 31 en inglés del 11 de noviembre de 201912019-06-18 15:14:43fioddorSe crea la versión española.
Copias de respaldo (backups)FreedomBox incluye la posibilidad de copiar y restaurar datos, preferencias, configuración y secretos de la mayoría de las aplicaciones. La funcionalidad de Backups se resuelve con el software de backup Borg. Borg es un programa de backup con deduplicación y compresión. Está diseñado para hacer backups eficientes y seguros. Esta funcionalidad de backups se puede emplear para respaldar y recuperar datos aplicación por aplicación. Las copias de respaldado se pueden almacenar en la propia máquina FreedomBox o en un servidor remoto. Cualquier servidor remoto con acceso por SSH se puede emplear como almacenamiento para los backups de la FreedomBox. Las copias remotas se pueden cifrar para que el servidor remoto no pueda leer los datos que alberga.
Estados de la Funcionalidad de Backups App/Funcionalidad Soporte en Versión Notas Avahi - no precisa backup Backups - no precisa backup Bind 0.41 Cockpit - no precisa backup Coquelicot 0.40 incluye ficheros subidos Datetime 0.41 Deluge 0.41 no incluye archivos descargados ni semillas Diagnostics - no precisa backup Dynamic DNS 0.39 ejabberd 0.39 incluye todos los datos y configuración Firewall - no precisa backup ikiwiki 0.39 incluye todos los wikis/blogs y sus contenidos infinoted 0.39 incluye todos los datos y claves JSXC - no precisa backup Let's Encrypt 0.42 Matrix Synapse 0.39 incluye media y cargas MediaWiki 0.39 incluye páginas de wiki y archivos adjuntos Minetest 0.39 MLDonkey 19.0 Monkeysphere 0.42 Mumble 0.40 Names - no precisa backup Networks No sin planes para implementar backup, de momento OpenVPN 0.48 incluye a todos los usuarios y claves de servidor Pagekite 0.40 Power - no precisa backup Privoxy - no precisa backup Quassel 0.40 incluye usuarios y registros de ejeución (logs) Radicale 0.39 incluye calendario y datos de tarjetas de todos los usuarios repro 0.39 incluye a todos los usuarios, datos y claves Roundcube - no precisa backup SearX - no precisa backup Secure Shell (SSH) Server 0.41 incluye las claves del servidor Security 0.41 Shadowsocks 0.40 solo secretos Sharing 0.40 no incluye datos de las carpetas compartidas Snapshot 0.41 solo configuración, no incluye datos de capturas (snapshots) Storage - no precisa backup Syncthing 0.48 no incluye datos de las carpetas compartidas Tahoe-LAFS 0.42 incluye todos los datos y configuración Tiny Tiny RSS 19.2 incluye base de datos con feeds, historias, etc. Tor 0.42 includes configuración y secretos como las claves de servicios Tor Onion Transmission 0.40 no incluye archivos descargados ni semillas Upgrades 0.42 Users No sin planes para implementar backup, de momento
Cómo instalar y usar BackupsPaso 1: Ir a la página de Copias de Seguridad Backups: Paso 1 Paso 2: Pulsar el botón Instalar Backups: Paso 2 Paso 3: Esperar a que se instalen todos los componentes de la aplicación Backups: Paso 3 Paso 4: Pulsar el botón de Crear Copia de Seguridad Backups: Paso 4 Paso 5: Seleccionar las aplicaciones a respaldar y pulsar Enviar Backups: Paso 5 Paso 6: Pulsar en el botón Descargar Backups: Paso 6 Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Backups92020-05-24 07:22:56fioddorSe alinea con la versión 32 en inglés del 23 de mayo de 202082020-04-11 10:33:24fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_15425872020-04-04 13:32:23fioddorCorrección menor62020-04-04 13:31:45fioddorImágenes indicativas52020-04-04 13:10:54fioddorCorrección.42020-04-04 13:09:42fioddorSe usan imágenes traducidas y más actuales.32020-04-04 13:06:11fioddorCorrección. Descripción de pasos como texto en los títulos en vez de como imágenes (mejor accesibilidad)22019-11-14 18:14:48fioddorSe alinea con la versión 31 en inglés del 11 de noviembre de 201912019-06-18 15:14:43fioddorSe crea la versión española.
Copias de respaldo (backups)FreedomBox incluye la posibilidad de copiar y restaurar datos, preferencias, configuración y secretos de la mayoría de las aplicaciones. La funcionalidad de Backups se resuelve con el software de backup Borg. Borg es un programa de backup con deduplicación y compresión. Está diseñado para hacer backups eficientes y seguros. Esta funcionalidad de backups se puede emplear para respaldar y recuperar datos aplicación por aplicación. Las copias de respaldado se pueden almacenar en la propia máquina FreedomBox o en un servidor remoto. Cualquier servidor remoto con acceso por SSH se puede emplear como almacenamiento para los backups de la FreedomBox. Las copias remotas se pueden cifrar para que el servidor remoto no pueda leer los datos que alberga.
Estados de la Funcionalidad de Backups App/Funcionalidad Soporte en Versión Notas Avahi - no precisa backup Backups - no precisa backup Bind 0.41 Cockpit - no precisa backup Coquelicot 0.40 incluye ficheros subidos Datetime 0.41 Deluge 0.41 no incluye archivos descargados ni semillas Diagnostics - no precisa backup Dynamic DNS 0.39 ejabberd 0.39 incluye todos los datos y configuración Firewall - no precisa backup ikiwiki 0.39 incluye todos los wikis/blogs y sus contenidos infinoted 0.39 incluye todos los datos y claves JSXC - no precisa backup Let's Encrypt 0.42 Matrix Synapse 0.39 incluye media y cargas MediaWiki 0.39 incluye páginas de wiki y archivos adjuntos Minetest 0.39 MLDonkey 19.0 Monkeysphere 0.42 Mumble 0.40 Names - no precisa backup Networks No sin planes para implementar backup, de momento OpenVPN 0.48 incluye a todos los usuarios y claves de servidor Pagekite 0.40 Power - no precisa backup Privoxy - no precisa backup Quassel 0.40 incluye usuarios y registros de ejeución (logs) Radicale 0.39 incluye calendario y datos de tarjetas de todos los usuarios repro 0.39 incluye a todos los usuarios, datos y claves Roundcube - no precisa backup SearX - no precisa backup Secure Shell (SSH) Server 0.41 incluye las claves del servidor Security 0.41 Shadowsocks 0.40 solo secretos Sharing 0.40 no incluye datos de las carpetas compartidas Snapshot 0.41 solo configuración, no incluye datos de capturas (snapshots) Storage - no precisa backup Syncthing 0.48 no incluye datos de las carpetas compartidas Tahoe-LAFS 0.42 incluye todos los datos y configuración Tiny Tiny RSS 19.2 incluye base de datos con feeds, historias, etc. Tor 0.42 includes configuración y secretos como las claves de servicios Tor Onion Transmission 0.40 no incluye archivos descargados ni semillas Upgrades 0.42 Users No sin planes para implementar backup, de momento
Cómo instalar y usar BackupsPaso 1: Ir a la página de Copias de Seguridad Backups: Paso 1 Paso 2: Pulsar el botón Instalar Backups: Paso 2 Paso 3: Esperar a que se instalen todos los componentes de la aplicación Backups: Paso 3 Paso 4: Pulsar el botón de Crear Copia de Seguridad Backups: Paso 4 Paso 5: Seleccionar las aplicaciones a respaldar y pulsar Enviar Backups: Paso 5 Paso 6: Pulsar en el botón Descargar Backups: Paso 6 Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Bind.raw.xml b/doc/manual/es/Bind.raw.xml new file mode 100644 index 000000000..20cddbef0 --- /dev/null +++ b/doc/manual/es/Bind.raw.xml @@ -0,0 +1 @@ +
es/FreedomBox/Manual/Bind42020-05-30 19:48:23SunilMohanAdapaUpdate the title to emphasize app name over its generic name32020-05-26 14:04:08fioddorCorrección.22020-05-26 13:55:43fioddorEnlaces a traducciones12020-05-26 13:51:17fioddorNueva página traducidaTranslation(s): - English - Español
BIND (Servidor de Nombre de Dominio)BIND te permite publicar en Internet tu información de Sistema de Nombre de Dominio (DNS) y resolver consultas DNS de los dispositivos de usuario en tu red. Actualmente en FreedomBox BIND solo se usa para resolver consultas DNS de otras máquinas en tu red local. También es incompatible con compartir conexiones a Internet de tu FreedomBox. Nota: Este servicio solo está disponible en redes configuradas como zona "interna". Tampoco está disponble a través de OpenVPN (es incompatible). Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Cockpit.raw.xml b/doc/manual/es/Cockpit.raw.xml index b298ceaa8..99a38e22a 100644 --- a/doc/manual/es/Cockpit.raw.xml +++ b/doc/manual/es/Cockpit.raw.xml @@ -1,3 +1,3 @@ -
es/FreedomBox/Manual/Cockpit72019-11-14 18:06:47fioddorSe alinea con la versión 06 en inglés del 14 de noviembre de 201962019-11-14 18:01:18fioddorSe alinea con la versión 05 en inglés del 11 de noviembre de 201952019-08-28 07:46:04fioddorTítulo explicativo y el nombre de la app entre paréntesis como aclaración adicional42019-08-22 11:10:28fioddorSe actualiza a la versión inglesa 4 del 20 de agosto de 2019.32019-07-22 17:57:58fioddorSe incorpora la traducción de una sección nueva.22019-07-01 12:32:35fioddorClaridad.12019-07-01 09:47:44fioddorSe crea la versión española.
Administración de Servidor (Cockpit)Cockpit es una aplicación que facilita administrar servidores GNU/Linux desde el navegador web. En una FreedomBox, hay disponibles controles para muchas funciones avanzadas que normalmente no se necesitan. También hay disponible un terminal web para operaciones de consola. Cualquier usuario del grupo de administradores de to FreedomBox puede acceder a Cockpit. Cockpit solo se puede usar si tienes una configuración de nombre de dominio apropiada para tu FreedomBox y usas ese nombre de dominio para acceder a Cockpit. Para más información mira la sección de Resolución de Problemas. Usa cockpit sólo si eres un administrador de sistemas GNU/Linux con habilidades avanzadas. FreedomBox intenta coexistir con los cambios al sistema que efectúan los administradores y sus herramientas, como Cockpit. Sin embargo, los cambios al sistema inadecuados pueden causar fallos en las funciones de FreedomBox.
Usar CockpitInstala Cockpit como cualquier otra aplicación de FreedomBox. Y a continuación asegúrate de que Cockpit está habilitado. cockpit-enable.png Asegúrate de que la cuenta de usuario de FreedomBox que se empleará con Cockpit es parte del grupo de administradores. cockpit-admin-user.png Arranca el interfaz web de Cockpit. Ingresa con la cuenta de usuario configurada. cockpit-login.png Empieza a usar cockpit. cockpit-system.png Cockpit también funciona con interfaces mobiles. cockpit-mobile.png
FuncionalidadesLas siguientes funcionalidades de Cockpit pueden ser útiles para usuarios avanzados de FreedomBox.
Cuadro de Mando del SistemaCockpit tiene un cuadro de mando del sistema que Muestra información detallada del hardware. Muestra métricas básicas de rendimiento del sistema. Permite cambiar la hora y el huso del sistema. Permite cambiar el hostname. Por favor usa el interfaz de usuario de FreedomBox UI para hacer esto. Muestra las huellas del servidor SSH. cockpit-system.png
Visualización de los Registros de Ejecución (logs) del SistemaCockpit permite consultar los registros de ejecución (logs) del sistema y examinarlos a todo detalle. cockpit-logs.png
Administración de AlmacenamientoCockpit permite las siguientes funciones avanzadas de almacenamiento: Visualización de llenado de discos. Edición de particiones de disco. Administración de RAID. cockpit-storage1.png cockpit-storage2.png
RedesTanto Cockpit como FreedomBox se apoyan en NetworkManager para configurar la red. No obstante, Cockpit ofrece alguna configuración avanzada no disponible en FreedomBox: Configuración de rutas. Configuración de enlaces, puentes y VLANs. cockpit-network1.png cockpit-network2.png cockpit-network3.png
ServiciosCockpit permite agendar servicios y tareas periódicas (como cron). cockpit-services1.png cockpit-services2.png
Terminal WebCockpit ofrece un terminal web que se puede usar para ejecutar tareas manuales de administración del sistema. cockpit-terminal.png
Resolución de ProblemasCockpit require un nombre de dominio adecuadamente configurado en tu FreedomBox y solo funcionará cuando accedas a él mediante una URL con ese nombre de dominio. Cockpit no funcionará con una dirección IP en la URL. Tampoco con freedombox.local como nombre de dominio. Por ejemplo, las URLs siguientes no funcionarán:
es/FreedomBox/Manual/Cockpit92020-05-30 19:48:03SunilMohanAdapaUpdate the title to emphasize app name over its generic name82020-05-24 07:23:47fioddorSe alinea con la versión 07 en inglés del 23 de mayo de 202072019-11-14 18:06:47fioddorSe alinea con la versión 06 en inglés del 14 de noviembre de 201962019-11-14 18:01:18fioddorSe alinea con la versión 05 en inglés del 11 de noviembre de 201952019-08-28 07:46:04fioddorTítulo explicativo y el nombre de la app entre paréntesis como aclaración adicional42019-08-22 11:10:28fioddorSe actualiza a la versión inglesa 4 del 20 de agosto de 2019.32019-07-22 17:57:58fioddorSe incorpora la traducción de una sección nueva.22019-07-01 12:32:35fioddorClaridad.12019-07-01 09:47:44fioddorSe crea la versión española.
Cockpit (Administración de Servidor)Cockpit es una aplicación que facilita administrar servidores GNU/Linux desde el navegador web. En una FreedomBox, hay disponibles controles para muchas funciones avanzadas que normalmente no se necesitan. También hay disponible un terminal web para operaciones de consola. Cualquier usuario del grupo de administradores de to FreedomBox puede acceder a Cockpit. Cockpit solo se puede usar si tienes una configuración de nombre de dominio apropiada para tu FreedomBox y usas ese nombre de dominio para acceder a Cockpit. Para más información mira la sección de Resolución de Problemas. Usa cockpit sólo si eres un administrador de sistemas GNU/Linux con habilidades avanzadas. FreedomBox intenta coexistir con los cambios al sistema que efectúan los administradores y sus herramientas, como Cockpit. Sin embargo, los cambios al sistema inadecuados pueden causar fallos en las funciones de FreedomBox.
Usar CockpitInstala Cockpit como cualquier otra aplicación de FreedomBox. Y a continuación asegúrate de que Cockpit está habilitado. cockpit-enable.png Asegúrate de que la cuenta de usuario de FreedomBox que se empleará con Cockpit es parte del grupo de administradores. cockpit-admin-user.png Arranca el interfaz web de Cockpit. Ingresa con la cuenta de usuario configurada. cockpit-login.png Empieza a usar cockpit. cockpit-system.png Cockpit también funciona con interfaces mobiles. cockpit-mobile.png
FuncionalidadesLas siguientes funcionalidades de Cockpit pueden ser útiles para usuarios avanzados de FreedomBox.
Cuadro de Mando del SistemaCockpit tiene un cuadro de mando del sistema que Muestra información detallada del hardware. Muestra métricas básicas de rendimiento del sistema. Permite cambiar la hora y el huso del sistema. Permite cambiar el hostname. Por favor usa el interfaz de usuario de FreedomBox UI para hacer esto. Muestra las huellas del servidor SSH. cockpit-system.png
Visualización de los Registros de Ejecución (logs) del SistemaCockpit permite consultar los registros de ejecución (logs) del sistema y examinarlos a todo detalle. cockpit-logs.png
Administración de AlmacenamientoCockpit permite las siguientes funciones avanzadas de almacenamiento: Visualización de llenado de discos. Edición de particiones de disco. Administración de RAID. cockpit-storage1.png cockpit-storage2.png
RedesTanto Cockpit como FreedomBox se apoyan en NetworkManager para configurar la red. No obstante, Cockpit ofrece alguna configuración avanzada no disponible en FreedomBox: Configuración de rutas. Configuración de enlaces, puentes y VLANs. cockpit-network1.png cockpit-network2.png cockpit-network3.png
ServiciosCockpit permite agendar servicios y tareas periódicas (como cron). cockpit-services1.png cockpit-services2.png
Terminal WebCockpit ofrece un terminal web que se puede usar para ejecutar tareas manuales de administración del sistema. cockpit-terminal.png
Resolución de ProblemasCockpit require un nombre de dominio adecuadamente configurado en tu FreedomBox y solo funcionará cuando accedas a él mediante una URL con ese nombre de dominio. Cockpit no funcionará con una dirección IP en la URL. Tampoco con freedombox.local como nombre de dominio. Por ejemplo, las URLs siguientes no funcionarán: A partir de la versión 19.15 funciona el dominio .local. Puedes acceder a Cockpit mediante la URL . El dominio .local se basa en tu hostname. Si tu hostname es mifb tu nombre de dominio .local será mifb.local y la URL de Cockpit será . Para acceder apropiadamente a Cockpit, usa el nombre de dominio configurado en tu FreedomBox. Cockpit también funcionará cuando se use un Servicio Tor Onion. Las siguientes URLs funcionarán: La razón para este comportamiento es que Cockpit emplea WebSockets para conectar con el servidor de backend. Por seguridad se deben evitar las peticiones a WebSockets con servidores cruzados. Para implementar esto Cockpit maintiene una lista de todos los dominios desde los que se admiten peticiones. FreedomBox configura automaticamente esta lista cuando añades o borras un dominio. Sin embargo, como no podemos fiarnos de las direcciones IP, FreedomBox no las añade a esta lista. Puedes mirar la lista actual de dominios aceptados administrada por FreedomBox en /etc/cockpit/cockpit.conf. Puedes editarla pero hazlo solo si comprendes sus consecuencias para la seguridad web. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +https://exampletorhs.onion/cockpit/]]>
La razón para este comportamiento es que Cockpit emplea WebSockets para conectar con el servidor de backend. Por seguridad se deben evitar las peticiones a WebSockets con servidores cruzados. Para implementar esto Cockpit maintiene una lista de todos los dominios desde los que se admiten peticiones. FreedomBox configura automaticamente esta lista cuando añades o borras un dominio. Sin embargo, como no podemos fiarnos de las direcciones IP, FreedomBox no las añade a esta lista. Puedes mirar la lista actual de dominios aceptados administrada por FreedomBox en /etc/cockpit/cockpit.conf. Puedes editarla pero hazlo solo si comprendes sus consecuencias para la seguridad web. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Configure.raw.xml b/doc/manual/es/Configure.raw.xml index ab656b1d3..1dade56e4 100644 --- a/doc/manual/es/Configure.raw.xml +++ b/doc/manual/es/Configure.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Configure22019-06-18 15:50:11fioddorCorrección menor12019-06-18 15:46:38fioddorSe crea la versión española.
ConfigurarConfigurar tiene algunas opciones generales de configuración:
HostnameHostname es el nombre local por el que otros dispositivos pueden alcanzar tu FreedomBox desde la red local. El hostname por defecto es freedombox.
Nombre de DominioEl Nombre de Dominio es el nombre global por el que otros dispositivos pueden alcanzar tu FreedomBox desde la Internet. El valor que se asigne aquí es el que usarán Chat Server (XMPP), Matrix Synapse, Certificates (Let's Encrypt), y Monkeysphere.
Página Principal (home) del Servidor WebEsta es una opción avanzada que te permite establecer como home algo diferente al servicio FreedomBox (Plinth) para que se sirva a quien acceda con el navegador al nombre de dominio de FreedomBox. Por ejemplo, si el nombre de dominio de tu FreedomBox es y estableces a MediaWiki como home, al visitar te llevará a en vez de a . Puedes asignar la home a cualquier aplicación web, los wikis y blogs de Ikiwiki o la página index.html por defecto de Apache. Una vez asignada como home otra aplicación, ya solo puedes navegar al servicio FreedomBox (Plinth) tecleando en el navegador . /freedombox también se puede usar como alias para /plinth Consejo: Guarda la URL del servicio FreedomBox (Plinth) antes de asignar la home a otra app. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Configure32020-05-23 23:06:23fioddorSe alinea con la versión 11 en inglés del 23 de mayo de 202022019-06-18 15:50:11fioddorCorrección menor12019-06-18 15:46:38fioddorSe crea la versión española.
ConfigurarConfigurar tiene algunas opciones generales de configuración:
HostnameHostname es el nombre local por el que otros dispositivos pueden alcanzar tu FreedomBox desde la red local. El hostname por defecto es freedombox.
Nombre de DominioEl Nombre de Dominio es el nombre global por el que otros dispositivos pueden alcanzar tu FreedomBox desde la Internet. El valor que se asigne aquí es el que usarán Chat Server (XMPP), Matrix Synapse, Certificates (Let's Encrypt), y Monkeysphere.
Página Principal (home) del Servidor WebEsta es una opción avanzada que te permite establecer como home algo diferente al servicio FreedomBox para que se sirva a quien acceda con el navegador al nombre de dominio de FreedomBox. Por ejemplo, si el nombre de dominio de tu FreedomBox es y estableces a MediaWiki como home, al visitar te llevará a en vez de a . Puedes asignar la home a cualquier aplicación web, los wikis y blogs de Ikiwiki o la página index.html por defecto de Apache. Una vez asignada como home otra aplicación, ya solo puedes navegar al servicio FreedomBox tecleando en el navegador . /freedombox también se puede usar como alias para /plinth Consejo: Guarda la URL del servicio FreedomBox antes de asignar la home a otra app. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Coquelicot.raw.xml b/doc/manual/es/Coquelicot.raw.xml index c84e7d402..6d9be5378 100644 --- a/doc/manual/es/Coquelicot.raw.xml +++ b/doc/manual/es/Coquelicot.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Coquelicot32020-04-13 16:17:26fioddorSe alinea con la versión 08 en inglés del 12 de abril de 202022019-09-11 10:34:42fioddorCorrecciones menores.12019-09-11 10:27:55fioddorSe crea la versión española.
Compartición de Archivos (Coquelicot)
Acerca de CoquelicotCoquelicot es aplicación web para compartir archivos enfocada a proteger la privacidad de sus usuarios. El principio básico es simple: los usuarios pueden subir un archivo al servidor y a cambio reciben una URL única para descargarlo que se puede compartir con terceros. Además se puede establecer una contraseña para reforzar el acceso. Más información acerca de Coquelicot en su LEEME Disponible desde: versión 0.24.0
Cuando usar CoquelicotEl mejor uso de Coquelicot es para compartir rápidamente un archivo suelto. Si quieres compartir una carpeta... ...para usar y tirar, comprime la carpeta y compartela como archivo con Coquelicot ...que deba mantenerse sincronizada entre ordenadores usa mejor Syncthing Coquelicot también puede proporcionar un grado de privacidad razonable. Si se necesita anonimato mejor sopesas emplear la aplicación de escritorio Onionshare. Como Coquelicot carga todo el archivo al servidor tu FreedomBox consumirá ancho de banda tanto para la subida como para la descarga. Para archivos muy grandes sopesa compartirlos creando un fichero BitTorrent privado. Si se necesita anonimato usa Onionshare. Es P2P y no necesita servidor.
Coquelicot en FreedomBoxCon Coquelicot instalado puedes subir archivos a tu servidor FreedomBox y compartirlos en privado. Tras la instalación la página de Coquelicot ofrece 2 preferencias. Contraseña de Subida: Actualmente y por facilidad de uso Coquelicot está configurado en FreedomBox para usar autenticación simple por contraseña. Recuerda que se trata de una contraseña global para esta instancia de Coquelicot y no tu contraseña de usuario para FreedomBox. Tienes que acordarte de esta contraseña. Puedes establecer otra en cualquier momento desde el interfaz Plinth. Tamaño Máximo de Archivo: Puedes alterar el tamaño máximo de los archivos a transferir mediante Coquelicot usando esta preferencia. El tamaño se expresa en Mebibytes y el máximo solo está limitado por el espacio en disco de tu FreedomBox.
PrivacidadAlguien que monitorice tu tráfico de red podría averiguar que se está transfiriendo un archivo en tu FreedomBox y posiblemente también su tamaño pero no sabrá su nombre. Coquelicot cifra los archivos en el servidor y sobrescribe los contenidos con 0s al borrarlos, eliminando el riesgo de que se desvelen los contenidos del fichero si tu FreedomBox resultara confiscada o robada. El riesgo real que hay que mitigar es que además del destinatario legítimo un tercero también descargue tu fichero.
Compartir mediante mensajería instantáneaAlgunas aplicaciones de mensajería instantánea con vista previa de sitios web podrían descargar tu fichero para mostrarla (su vista previa) en la conversación. Si configuras la opción de descarga única para un archivo podrías notar que la aplicación de mensajería consume la única descarga. Si compartes mediante estas aplicaciones usa una contraseña de descarga en combinación con la opción de descarga única.
Compartir en privado enlaces de descargaSe recomienda compartir las contraseñas y los enlaces de descarga de tus archivos por canales cifrados. Puedes evitar todos los problemas anteriores con las vistas previas de la mensajería instantánea símplemente empleando aplicaciones de mensajería que soporten conversaciones cifradas como Riot con Matrix Synapse o XMPP (servidor ejabberd en FreedomBox) con clientes que soporten cifrado punto a punto. Envía la contraseña y el enlace de descarga separados en 2 mensajes distintos (ayuda que tu aplicación de mensajería soporte perfect forward secrecy como XMPP con OTR). También puedes compartir tus enlaces por correo electrónico cifrado con PGP usando Thunderbird. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Coquelicot52020-05-30 19:32:53SunilMohanAdapaUpdate the title to emphasize app name over its generic name42020-05-24 06:45:44fioddorSe alinea con la versión 10 en inglés del 23 de mayo de 202032020-04-13 16:17:26fioddorSe alinea con la versión 08 en inglés del 12 de abril de 202022019-09-11 10:34:42fioddorCorrecciones menores.12019-09-11 10:27:55fioddorSe crea la versión española.
Coquelicot (Compartición de Archivos)
Acerca de CoquelicotCoquelicot es aplicación web para compartir archivos enfocada a proteger la privacidad de sus usuarios. El principio básico es simple: los usuarios pueden subir un archivo al servidor y a cambio reciben una URL única para descargarlo que se puede compartir con terceros. Además se puede establecer una contraseña para reforzar el acceso. Más información acerca de Coquelicot en su LEEME Disponible desde: versión 0.24.0
Cuando usar CoquelicotEl mejor uso de Coquelicot es para compartir rápidamente un archivo suelto. Si quieres compartir una carpeta... ...para usar y tirar, comprime la carpeta y compartela como archivo con Coquelicot ...que deba mantenerse sincronizada entre ordenadores usa mejor Syncthing Coquelicot también puede proporcionar un grado de privacidad razonable. Si se necesita anonimato mejor sopesas emplear la aplicación de escritorio Onionshare. Como Coquelicot carga todo el archivo al servidor tu FreedomBox consumirá ancho de banda tanto para la subida como para la descarga. Para archivos muy grandes sopesa compartirlos creando un fichero BitTorrent privado. Si se necesita anonimato usa Onionshare. Es P2P y no necesita servidor.
Coquelicot en FreedomBoxCon Coquelicot instalado puedes subir archivos a tu servidor FreedomBox y compartirlos en privado. Tras la instalación la página de Coquelicot ofrece 2 preferencias. Contraseña de Subida: Actualmente y por facilidad de uso Coquelicot está configurado en FreedomBox para usar autenticación simple por contraseña. Recuerda que se trata de una contraseña global para esta instancia de Coquelicot y no tu contraseña de usuario para FreedomBox. Tienes que acordarte de esta contraseña. Puedes establecer otra en cualquier momento desde el interfaz de FreedomBox. Tamaño Máximo de Archivo: Puedes alterar el tamaño máximo de los archivos a transferir mediante Coquelicot usando esta preferencia. El tamaño se expresa en Mebibytes y el máximo solo está limitado por el espacio en disco de tu FreedomBox.
PrivacidadAlguien que monitorice tu tráfico de red podría averiguar que se está transfiriendo un archivo en tu FreedomBox y posiblemente también su tamaño pero no sabrá su nombre. Coquelicot cifra los archivos en el servidor y sobrescribe los contenidos con 0s al borrarlos, eliminando el riesgo de que se desvelen los contenidos del fichero si tu FreedomBox resultara confiscada o robada. El riesgo real que hay que mitigar es que además del destinatario legítimo un tercero también descargue tu fichero.
Compartir mediante mensajería instantáneaAlgunas aplicaciones de mensajería instantánea con vista previa de sitios web podrían descargar tu fichero para mostrarla (su vista previa) en la conversación. Si configuras la opción de descarga única para un archivo podrías notar que la aplicación de mensajería consume la única descarga. Si compartes mediante estas aplicaciones usa una contraseña de descarga en combinación con la opción de descarga única.
Compartir en privado enlaces de descargaSe recomienda compartir las contraseñas y los enlaces de descarga de tus archivos por canales cifrados. Puedes evitar todos los problemas anteriores con las vistas previas de la mensajería instantánea símplemente empleando aplicaciones de mensajería que soporten conversaciones cifradas como Riot con Matrix Synapse o XMPP (servidor ejabberd en FreedomBox) con clientes que soporten cifrado punto a punto. Envía la contraseña y el enlace de descarga separados en 2 mensajes distintos (ayuda que tu aplicación de mensajería soporte perfect forward secrecy como XMPP con OTR). También puedes compartir tus enlaces por correo electrónico cifrado con PGP usando Thunderbird. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Coturn.raw.xml b/doc/manual/es/Coturn.raw.xml index 64e57742f..333ae77c9 100644 --- a/doc/manual/es/Coturn.raw.xml +++ b/doc/manual/es/Coturn.raw.xml @@ -1,4 +1,4 @@ -
es/FreedomBox/Manual/Coturn32020-05-10 10:31:28fioddorImprovement22020-05-10 10:30:35fioddorCorrection12020-05-10 10:10:39fioddorNueva página traducida
Asistente para VoIP (Coturn)Coturn es un servidor para facilitar llamadas y conferencias de audio/video proporcionando una implementación de los protocolos TURN y STUN. Los servidores de comunicación por WebRTC, SIP y otros pueden usarlo para establecer una llamada entre partes que de otro modo no podrían conectarse entre si. No está pensado para que lo usen diréctamente los usuarios. Los servidores como Matrix Synapse necesitan configurarse con los datos proporcionados en la página de app de Coturn. Además de Matrix Synapse, Jitsi, Ejabberd, Nexcloud Talk, etc. pueden usar el servidor Coturn para llamadas y conferencias de audio/video. No hace falta que los servidores se ejecuten en la misma máquina que FreedomBox. Los servidores externos pueden usar un Coturn ejecutado en FreedomBox. Coturn está disponible en FreedomBox desde la version 20.8 como app avanzada. Esto implica que para ver el icono de Coturn en la sección "Apps" necesitas marcar en "Mostrar apps y funcionalidades avanzadas" en "Configuración General".
Cómo funcionaAl hacer una llamada de audio/video lo mejor es enrutar los flujos multimedia directamente entre los pares porque minimiza la latencia (mejor calidad de señal) y evita depender de un servidor centralizado (privacidad). Esto escala bien porque un servidor de chat simple puede albergar miles de llamadas sin involucrarse de ningún otro modo que para establecer la llamada. Sin embargo este enfoque no suele funcionar la mayoría de las veces por cómo se configuran las redes. La mayoría de los pares de la red carecen de una dirección IP propia reservada para ellos y suelen operar detrás de un dispositivo de red que les traduce las direcciones de red (NAT: "Network Address Translation"). Esto significa que en realidad estos pares no tienen modo de alcanzarse entre sí directamente. Para abordar este problema se introdujo una técnica simple conocida como STUN. Con ayuda de un servidor STUN los pares pueden prescindir de los dispositivos NAT para transmitir entre ellos. Desafortunadamente este truco solo funciona un 80% de las ocasiones. Así que si STUN falla, los pares no tienen más opción que enrutar su comunicación a través de un intermediario llamado servidor TURN. Todo el mecanismo de intentar primero con STUN y recaer en TURN se describe en un protocolo llamado ICE. En FreedomBox, Coturn proporciona servidores STUN y TURN. Ambos servicios se proporcionan tanto sobre TCP como sobre UDP y tanto en canales cifrados (que tienen mayor probabilidad de éxito) como sin cifrar. Como los servidores STUN son baratos y no consumen muchos recursos no se necesita autenticación para usarlos. Por otra parte los servidores TURN sí la necesitan. Esta autenticación está altamente simplificada y no requiere mantener una base de datos de usuarios. Un servidor como matrix-synapse que vaya a establecer una llamada de audio/video entre dos pares generará un nombre de usuario y contraseña empleando un secreto compartido. Cuando los pares usen el servidor TURN se les validará usando estas credenciales porque el servidor TURN conoce este secreto. En resumen, un servidor de comunicaciones necesita saber las URLs de los servidores STUN/TURN junto con el secreto de autenticación para TURN. Después, durante el establecimiento de la llamada de audio/video guiarán a los pares a usar los servidores STUN/TURN. La app Coturn de FreedomBox proporciona exactamente ésta información, que se puede usar para configurar un servidor de comunicaciones independientemente de que se ejecute en la misma máquina que FreedomBox o en otro servidor.
Configurar Matrix SynapseEl servidor de Matrix Synapse de FreedomBox se puede configurar para que use el servidor de TURN/STUN Coturn. En el futuro, cuando instales Matrix Synapse FreedomBox instalará Coturn automáticamente y configurará sus parámetros en Matrix Synapse. Para configurar Matrix Synapse, edita el fichero /etc/matrix-synapse/homeserver.yaml con las siguientes líneas:
es/FreedomBox/Manual/Coturn62020-05-30 20:00:26SunilMohanAdapaUpdate the title to emphasize app name over its generic name52020-05-24 07:12:27fioddorSe alinea con la versión 09 en inglés del 23 de mayo de 202042020-05-19 20:56:07fioddorSe alinea con la versión 08 en inglés del 19 de mayo de 202032020-05-10 10:31:28fioddorImprovement22020-05-10 10:30:35fioddorCorrection12020-05-10 10:10:39fioddorNueva página traducida
Coturn (Asistente para VoIP)Coturn es un servidor para facilitar llamadas y conferencias de audio/video proporcionando una implementación de los protocolos TURN y STUN. Los servidores de comunicación por WebRTC, SIP y otros pueden usarlo para establecer una llamada entre partes que de otro modo no podrían conectarse entre si. No está pensado para que lo usen diréctamente los usuarios. Los servidores como Matrix Synapse necesitan configurarse con los datos proporcionados en la página de app de Coturn. Además de Matrix Synapse, Jitsi, Ejabberd, Nextcloud Talk, etc. pueden usar el servidor Coturn para llamadas y conferencias de audio/video. No hace falta que los servidores se ejecuten en la misma máquina que FreedomBox. Los servidores externos pueden usar un Coturn ejecutado en FreedomBox. Coturn está disponible en FreedomBox desde la version 20.8 como app avanzada. Esto implica que para ver el icono de Coturn en la sección "Apps" necesitas marcar en "Mostrar apps y funcionalidades avanzadas" en "Configuración General".
Cómo funcionaAl hacer una llamada de audio/video lo mejor es enrutar los flujos multimedia directamente entre los pares porque minimiza la latencia (mejor calidad de señal) y evita depender de un servidor centralizado (privacidad). Esto escala bien porque un servidor de chat simple puede albergar miles de llamadas sin involucrarse de ningún otro modo que para establecer la llamada. Sin embargo este enfoque no suele funcionar la mayoría de las veces por cómo se configuran las redes. La mayoría de los pares de la red carecen de una dirección IP propia reservada para ellos y suelen operar detrás de un dispositivo de red que les traduce las direcciones de red (NAT: "Network Address Translation"). Esto significa que en realidad estos pares no tienen modo de alcanzarse entre sí directamente. Para abordar este problema se introdujo una técnica simple conocida como STUN. Con ayuda de un servidor STUN los pares pueden prescindir de los dispositivos NAT para transmitir entre ellos. Desafortunadamente este truco solo funciona un 80% de las ocasiones. Así que si STUN falla, los pares no tienen más opción que enrutar su comunicación a través de un intermediario llamado servidor TURN. Todo el mecanismo de intentar primero con STUN y recaer en TURN se describe en un protocolo llamado ICE. En FreedomBox, Coturn proporciona servidores STUN y TURN. Ambos servicios se proporcionan tanto sobre TCP como sobre UDP y tanto en canales cifrados (que tienen mayor probabilidad de éxito) como sin cifrar. Como los servidores STUN son baratos y no consumen muchos recursos no se necesita autenticación para usarlos. Por otra parte los servidores TURN sí la necesitan. Esta autenticación está altamente simplificada y no requiere mantener una base de datos de usuarios. Un servidor como matrix-synapse que vaya a establecer una llamada de audio/video entre dos pares generará un nombre de usuario y contraseña empleando un secreto compartido. Cuando los pares usen el servidor TURN se les validará usando estas credenciales porque el servidor TURN conoce este secreto. En resumen, un servidor de comunicaciones necesita saber las URLs de los servidores STUN/TURN junto con el secreto de autenticación para TURN. Después, durante el establecimiento de la llamada de audio/video guiarán a los pares a usar los servidores STUN/TURN. La app Coturn de FreedomBox proporciona exactamente ésta información, que se puede usar para configurar un servidor de comunicaciones independientemente de que se ejecute en la misma máquina que FreedomBox o en otro servidor.
Configurar Matrix SynapseEl servidor de Matrix Synapse de FreedomBox se puede configurar para que use el servidor de TURN/STUN Coturn. En el futuro, cuando instales Matrix Synapse FreedomBox instalará Coturn automáticamente y configurará sus parámetros en Matrix Synapse. Para configurar Matrix Synapse, edita el fichero /etc/matrix-synapse/homeserver.yaml con las siguientes líneas: Y luego reinicia el servidor matrix-synapse deshabilitando y rehabilitando la app de matrix-synapse. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +turn_allow_guests: True]]>
Y luego reinicia el servidor matrix-synapse deshabilitando y rehabilitando la app de matrix-synapse. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/DateTime.raw.xml b/doc/manual/es/DateTime.raw.xml index 86af2e521..1de8c7b27 100644 --- a/doc/manual/es/DateTime.raw.xml +++ b/doc/manual/es/DateTime.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/DateTime42020-04-11 10:24:24fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_15425832020-04-03 18:15:29fioddorSe usa imagen traducida y más actual.22020-04-03 17:08:45fioddorSe alinea con la versión 03 en inglés del 30 de marzo de 202012019-06-19 10:26:32fioddorSe crea la versión española.
Fecha y horaEste servidor de hora de red es un programa que mantiene el tiempo del sistema sincronizado con servidores de Internet. Puedes seleccionar el huso horario escogiendo una capital cercana (están ordenadas por Continente/Ciudad) o seleccionando directamente el huso en relación a GMT (Greenwich Mean Time). DateTime_es_v01.png Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/DateTime42020-04-11 10:24:24fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_15425832020-04-03 18:15:29fioddorSe usa imagen traducida y más actual.22020-04-03 17:08:45fioddorSe alinea con la versión 03 en inglés del 30 de marzo de 202012019-06-19 10:26:32fioddorSe crea la versión española.
Fecha y horaEste servidor de hora de red es un programa que mantiene el tiempo del sistema sincronizado con servidores de Internet. Puedes seleccionar el huso horario escogiendo una capital cercana (están ordenadas por Continente/Ciudad) o seleccionando directamente el huso en relación a GMT (Greenwich Mean Time). DateTime_es_v01.png Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Deluge.raw.xml b/doc/manual/es/Deluge.raw.xml index fa5b449f7..cb918d080 100644 --- a/doc/manual/es/Deluge.raw.xml +++ b/doc/manual/es/Deluge.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Deluge22019-09-04 09:35:32fioddorCorrección menor12019-09-04 09:33:21fioddorSe crea la versión española.
BitTorrent (Deluge)
¿Qué es Deluge?BitTorrent es un protocolo de comunicaciones para compartir ficheros entre pares (P2P = peer-to-peer). No es anónimo; debes asumir que otros puedan ver qué ficheros estás comprtiendo. Hay 2 clientes web para BitTorrent disponibles en FreedomBox: Transmission y Deluge. Tienen funcionalidades similares pero quizá prefieras uno sobre otro. Deluge es un cliente BitTorrent altamente configurable. Se puede añadir funcionalidad adicional instalando extensiones (plugins).
Captura de pantallaDeluge Web UI
Configuración InicialTras instalar Deluge se puede acceder apuntando tu navegador a https://<tu freedombox>/deluge. Necesitarás introducir una contraseña para ingresar: Deluge Login La contraseña inicial es deluge. La primera vez que ingreses Deluge te preguntará si quieres cambiarla. Debes cambiarla por algo más dificil de adivinar. A continuación se te mostrará el administrador de conexiones. Haz clic sobre la primera entrada (Offline - 127.0.0.1:58846). Luego pulsa "Arrancar el Demonio" para que arranque el servicio Deluge service que se ejecutará en segundo plano. Deluge Connection Manager (Offline) Ahora debería poner "Online". Haz clic en "Conectar" para completar la configuración. Deluge Connection Manager (Online) En este punto ya estás usando Deluge. Puedes hacer más cambios en las Preferencias o añadir un fichero o una URL de torrent. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Deluge52020-05-30 20:00:52SunilMohanAdapaMatch title with FreedomBox interface42020-05-30 19:33:24SunilMohanAdapaUpdate the title to emphasize app name over its generic name32020-05-24 06:26:30fioddorSe alinea con la versión 12 en inglés del 23 de mayo de 202022019-09-04 09:35:32fioddorCorrección menor12019-09-04 09:33:21fioddorSe crea la versión española.
Deluge (Cliente web de BitTorrent)
¿Qué es Deluge?BitTorrent es un protocolo de comunicaciones para compartir ficheros entre pares (P2P = peer-to-peer). No es anónimo; debes asumir que otros puedan ver qué ficheros estás comprtiendo. Hay 2 clientes web para BitTorrent disponibles en FreedomBox: Transmission y Deluge. Tienen funcionalidades similares pero quizá prefieras uno sobre otro. Deluge es un cliente BitTorrent altamente configurable. Se puede añadir funcionalidad adicional instalando extensiones (plugins).
Captura de pantallaDeluge Web UI
Configuración InicialTras instalar Deluge se puede acceder apuntando tu navegador a https://<tu freedombox>/deluge. Necesitarás introducir una contraseña para ingresar: Deluge Login La contraseña inicial es deluge. La primera vez que ingreses Deluge te preguntará si quieres cambiarla. Debes cambiarla por algo más dificil de adivinar. A continuación se te mostrará el administrador de conexiones. Haz clic sobre la primera entrada (Offline - 127.0.0.1:58846). Luego pulsa "Arrancar el Demonio" para que arranque el servicio Deluge service que se ejecutará en segundo plano. Deluge Connection Manager (Offline) Ahora debería poner "Online". Haz clic en "Conectar" para completar la configuración. Deluge Connection Manager (Online) En este punto ya estás usando Deluge. Puedes hacer más cambios en las Preferencias o añadir un fichero o una URL de torrent. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Diagnostics.raw.xml b/doc/manual/es/Diagnostics.raw.xml index 92296528d..ccbb38132 100644 --- a/doc/manual/es/Diagnostics.raw.xml +++ b/doc/manual/es/Diagnostics.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Diagnostics12019-06-19 10:39:40fioddorSe crea la versión española.
DiagnósticosLa prueba de diagnóstico del sistema ejecutará varias verificaciones sobre tu sistema para confirmar que las aplicaciones y servicios están funcionando como se espera. Sólo haz clic Ejecutar Diagnósticos. Esto puede llevar varios minutos. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Diagnostics12019-06-19 10:39:40fioddorSe crea la versión española.
DiagnósticosLa prueba de diagnóstico del sistema ejecutará varias verificaciones sobre tu sistema para confirmar que las aplicaciones y servicios están funcionando como se espera. Sólo haz clic Ejecutar Diagnósticos. Esto puede llevar varios minutos. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/DynamicDNS.raw.xml b/doc/manual/es/DynamicDNS.raw.xml index fb2892290..7b70afafb 100644 --- a/doc/manual/es/DynamicDNS.raw.xml +++ b/doc/manual/es/DynamicDNS.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/DynamicDNS52019-08-20 10:59:21fioddorSe incorpora la traducción de una sección nueva.42019-08-20 10:52:54fioddorSe incorpora la traducción de una sección nueva.32019-08-20 10:35:42fioddorSe incorpora la traducción de una sección nueva.22019-08-20 10:26:28fioddorSe incorpora la traducción de una sección nueva.12019-08-20 10:15:28fioddorSe crea la versión española (traducción incompleta).
Cliente de DNS Dinamico
¿Qué es DNS Dinamico?Para que se pueda llegar a un servidor desde Internet este necesita tener una dirección pública permanente, también conocida como dirección IP estática o fija. Muchos proveedores de servicio de Internet no otorgan IP fija a sus usuarios normales o la cobran. En su lugar les otorgan una IP temporal diferente cada vez que el usuario se conecta a internet. O una que cambia de vez en cuando. Si es tu caso los clientes que quieran contactar con tu servidor tendrán dificultades. Los proveedores de servicio de DNS Dinamico ayudan a solventar este problema. Primero te dan un nombre de dominio, como 'miservidor.ejemplo.org' y te permiten asociar tu dirección IP temporal a este nombre de dominio cada vez que esta cambia. De este modo quien quiera llegar a tu servidor empleará el nombre de dominio 'miservidor.ejemplo.org' que siempre apuntará a la última dirección IP de tu servidor. Para que esto funcione cada vez que te conectes a Internet tendrás que decirle a tu proveedor de servicio de DNS Dinamico cual es tu dirección IP provisional actual. Por esto necesitas tener un software especial en tu servidor que haga esto. La funcionalidad DNS Dinamico de tu FreedomBox permite a los usuarios sin dirección IP pública fija mantener su dirección IP pública temporal actualizada en el servicio de DNS Dinamico. Esto te permite exponer servicios de tu FreedomBox, como ownCloud, a Internet.
GnuDIP vs. Update URLEisten 2 mecanismos principales para notificar al the servicio de DNS Dinamico cual es tu dirección IP provisional actual: empleando el protocolo GnuDIP o empleando el mecanismo URL de actualización. Si un servicio expuesto usando URL de actualización no se securiza apropiadamente mediante HTTPS, tus credenciales podrían quedar expuestas. Una vez que un atacante accede a tus credenciales podrá reproducir tus comunicaciones con el servicio de DNS Dinamico y suplantar tu dominio. Por otra parte el protocolo GnuDIP solo transportará un valor MD5 salpimentado de tu contraseña de tal forma que es seguro contra ataques de este tipo.
Emplear el protocolo GnuDIPRegistra una cuenta en cualquier proveedor de servicio de DNS Dinamico. Hay un servicio gratuito provisto por la comunidad FreedomBox disponible en . Habilita el Servicio de DNS Dinamico en el interfaz de usuario de FreedomBox. Selecciona GnuDIP como tipo de servicio, introduce la dirección de tu proveedor de servicio de DNS Dinamico (por ejemplo, gnudip.datasystems24.net) en el campo Dirección del servidor GnuDIP. Dynamic DNS Settings Completa la información que te ha dado tu proveedor en los campos correspondientes Nombre de Dominio, Usuario y Contraseña.
Emplear URL de actualizaciónSe implementa esta funcionalidad porque los proveedores de servicio de DNS Dinamico más populares están empleando el mecanismo URL de actualización. Registra una cuenta en el proveedor de servicio de DNS Dinamico que emplea el mecanismo Update URL. Se listan algunos proveedores de ejemplo en la propia página de configuración. Habilita el Servicio de DNS Dinamico en el interfaz de usuario de FreedomBox. Selecciona URL de actualización como tipo de servicio, introduce la URL de actualización que te ha dado tu proveedor de servicio de DNS Dinamico en el campo URL de actualización. Si vas a la URL de actualización con tu navegador de Internet y te muestra un aviso acerca de un certificado no confiable, activa aceptar todos los certificados SSL. AVISO: ¡Tus credenciales podrían quedar expuestas en este punto a un ataque MIM (man-in-the-middle)! Valora la posibilidad de elegir otro proveedor de servicio mejor. Si vas a la URL de actualización con tu navegador de Internet y te muestra la caja de usuario/contraseña, selecciona usar autenticación HTTP basica e introduce el usuario y la contraseña. Si la URL de actualización contiene tu dirección IP temporal actual reemplaza la dirección IP por la cadena de texto <Ip>.
Comprobar si funcionaAsegúrate de que los servicios externos que has habilitado como /jwchat, /roundcube o /ikiwiki están disponibles en tu dirección de dominio. Ve a la página Estado y asegúrate de que el tipo de NAT se detecta correctamente. Si tu FreedomBox está detrás de un dispositivo NAT debería detectarse en este punto (Texto: Detrás de NAT). Si tu FreedomBox tiene una dirección IP pública asignada el texto debería ser "Conexión directa a Internet". Comprueba que el último estado de actualización no sea fallida.
Recap: How to create a DNS name with GnuDIPto delete or to replace the old text Access to GnuIP login page (answer Yes to all pop ups) Click on "Self Register" Fill the registration form (Username and domain will form the public IP address [username.domain]) Take note of the username/hostname and password that will be used on the FreedomBox app. Save and return to the GnuDIP login page to verify your username, domain and password (enter the datas, click login). Login output should display your new domain name along with your current public IP address (this is a unique address provided by your router for all your local devices). Leave the GnuDIP interface and open the Dynamic DNS Client app page in your FreedomBox. Click on "Set Up" in the top menu. Activate Dynamic DNS Choose GnuDIP service. Add server address (gnudip.datasystems24.net) Add your fresh domain name (username.domain, ie [username].freedombox.rocks) Add your fresh username (the one used in your new IP address) and password Add your GnuDIP password Fill the option with (try this url in your browser, you will figure out immediately) Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/DynamicDNS62020-05-24 07:27:37fioddorSe alinea con la versión 17 en inglés del 23 de mayo de 202052019-08-20 10:59:21fioddorSe incorpora la traducción de una sección nueva.42019-08-20 10:52:54fioddorSe incorpora la traducción de una sección nueva.32019-08-20 10:35:42fioddorSe incorpora la traducción de una sección nueva.22019-08-20 10:26:28fioddorSe incorpora la traducción de una sección nueva.12019-08-20 10:15:28fioddorSe crea la versión española (traducción incompleta).
Cliente de DNS Dinamico
¿Qué es DNS Dinamico?Para que se pueda llegar a un servidor desde Internet este necesita tener una dirección pública permanente, también conocida como dirección IP estática o fija. Muchos proveedores de servicio de Internet no otorgan IP fija a sus usuarios normales o la cobran. En su lugar les otorgan una IP temporal diferente cada vez que el usuario se conecta a internet. O una que cambia de vez en cuando. Si es tu caso los clientes que quieran contactar con tu servidor tendrán dificultades. Los proveedores de servicio de DNS Dinamico ayudan a solventar este problema. Primero te dan un nombre de dominio, como 'miservidor.ejemplo.org' y te permiten asociar tu dirección IP temporal a este nombre de dominio cada vez que esta cambia. De este modo quien quiera llegar a tu servidor empleará el nombre de dominio 'miservidor.ejemplo.org' que siempre apuntará a la última dirección IP de tu servidor. Para que esto funcione cada vez que te conectes a Internet tendrás que decirle a tu proveedor de servicio de DNS Dinamico cual es tu dirección IP provisional actual. Por esto necesitas tener un software especial en tu servidor que haga esto. La funcionalidad DNS Dinamico de tu FreedomBox permite a los usuarios sin dirección IP pública fija mantener su dirección IP pública temporal actualizada en el servicio de DNS Dinamico. Esto te permite exponer servicios de tu FreedomBox, como ownCloud, a Internet.
GnuDIP vs. Update URLEisten 2 mecanismos principales para notificar al the servicio de DNS Dinamico cual es tu dirección IP provisional actual: empleando el protocolo GnuDIP o empleando el mecanismo URL de actualización. Si un servicio expuesto usando URL de actualización no se securiza apropiadamente mediante HTTPS, tus credenciales podrían quedar expuestas. Una vez que un atacante accede a tus credenciales podrá reproducir tus comunicaciones con el servicio de DNS Dinamico y suplantar tu dominio. Por otra parte el protocolo GnuDIP solo transportará un valor MD5 salpimentado de tu contraseña de tal forma que es seguro contra ataques de este tipo.
Emplear el protocolo GnuDIPRegistra una cuenta en cualquier proveedor de servicio de DNS Dinamico. Hay un servicio gratuito provisto por la comunidad FreedomBox disponible en . Habilita el Servicio de DNS Dinamico en el interfaz de usuario de FreedomBox. Selecciona GnuDIP como tipo de servicio, introduce la dirección de tu proveedor de servicio de DNS Dinamico (por ejemplo, gnudip.datasystems24.net) en el campo Dirección del servidor GnuDIP. Dynamic DNS Settings Completa la información que te ha dado tu proveedor en los campos correspondientes Nombre de Dominio, Usuario y Contraseña.
Emplear URL de actualizaciónSe implementa esta funcionalidad porque los proveedores de servicio de DNS Dinamico más populares están empleando el mecanismo URL de actualización. Registra una cuenta en el proveedor de servicio de DNS Dinamico que emplea el mecanismo Update URL. Se listan algunos proveedores de ejemplo en la propia página de configuración. Habilita el Servicio de DNS Dinamico en el interfaz de usuario de FreedomBox. Selecciona URL de actualización como tipo de servicio, introduce la URL de actualización que te ha dado tu proveedor de servicio de DNS Dinamico en el campo URL de actualización. Si vas a la URL de actualización con tu navegador de Internet y te muestra un aviso acerca de un certificado no confiable, activa aceptar todos los certificados SSL. AVISO: ¡Tus credenciales podrían quedar expuestas en este punto a un ataque MIM (man-in-the-middle)! Valora la posibilidad de elegir otro proveedor de servicio mejor. Si vas a la URL de actualización con tu navegador de Internet y te muestra la caja de usuario/contraseña, selecciona usar autenticación HTTP basica e introduce el usuario y la contraseña. Si la URL de actualización contiene tu dirección IP temporal actual reemplaza la dirección IP por la cadena de texto <Ip>.
Comprobar si funcionaAsegúrate de que los servicios externos que has habilitado como /jwchat, /roundcube o /ikiwiki están disponibles en tu dirección de dominio. Ve a la página Estado y asegúrate de que el tipo de NAT se detecta correctamente. Si tu FreedomBox está detrás de un dispositivo NAT debería detectarse en este punto (Texto: Detrás de NAT). Si tu FreedomBox tiene una dirección IP pública asignada el texto debería ser "Conexión directa a Internet". Comprueba que el último estado de actualización no sea fallida.
Recap: How to create a DNS name with GnuDIPto delete or to replace the old text Access to GnuIP login page (answer Yes to all pop ups) Click on "Self Register" Fill the registration form (Username and domain will form the public IP address [username.domain]) Take note of the username/hostname and password that will be used on the FreedomBox app. Save and return to the GnuDIP login page to verify your username, domain and password (enter the datas, click login). Login output should display your new domain name along with your current public IP address (this is a unique address provided by your router for all your local devices). Leave the GnuDIP interface and open the Dynamic DNS Client app page in your FreedomBox. Click on "Set Up" in the top menu. Activate Dynamic DNS Choose GnuDIP service. Add server address (gnudip.datasystems24.net) Add your fresh domain name (username.domain, ie [username].freedombox.rocks) Add your fresh username (the one used in your new IP address) and password Add your GnuDIP password Fill the option with (try this url in your browser, you will figure out immediately) Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Firewall.raw.xml b/doc/manual/es/Firewall.raw.xml index 6a4d889d1..29942f015 100644 --- a/doc/manual/es/Firewall.raw.xml +++ b/doc/manual/es/Firewall.raw.xml @@ -1,4 +1,4 @@ -
es/FreedomBox/Manual/Firewall132020-05-10 00:57:07fioddorSe alinea con la versión 29 en inglés del 03 de mayo de 2020122020-04-13 16:15:55fioddorSe alinea con la versión 27 en inglés del 12 de abril de 2020112020-04-11 10:25:56fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_154258102020-04-04 16:56:41fioddorMejora menor. Algo más claro.92020-04-04 16:52:56fioddorEnlace a página traducida.82020-04-04 16:49:56fioddorSe usan imágenes traducidas y más actuales.72019-10-21 15:03:44fioddorCorrección menor62019-10-21 14:58:42fioddorCorrección menor52019-08-20 12:16:19fioddorS42019-08-20 12:07:57fioddorSe incorpora la traducción de una sección nueva.32019-08-20 11:59:19fioddorSe incorpora la traducción de una sección nueva.22019-08-20 11:54:54fioddorSe incorpora la traducción de una sección nueva.12019-08-20 11:39:24fioddorSe crea la versión española (traducción incompleta).
CortafuegosUn cortafuegos es un sistema de seguridad de red que controla el tráfico de entrada y salida desde/a la red. Mantener un cortafuegos habilitado y apropiadamente configurado reduce el riesgo de amenazas a la seguridad desde Internet. La operación del cortafuegos desde el interfaz web de FreedomBox es automática. Cuando habilitas un servicio se le abre automáticamente el cortafuegos y cuando lo deshabilitas se le cierra también automáticamente. Para servicios habilitados por defecto en FreedomBox los puertos se abren en el cortafuegos por defecto durante el proceso de la primera ejecución. Firewall La administración del cortafuegos en FreedomBox se hace empleando FirewallD.
InterfacesCada interfaz de red necesita asignarse a 1 (y sólo 1) zona. Las reglas que tenga activas la zona se aplicarán al interfaz. Por ejemplo, si se permite el trafico HTTP en una zona en particular las peticiones web se acceptarán en todas las direcciones configuradas para todos los interfaces asignados a esa zona. Principalmente se emplean 2 zonas de cortafuegos. La zona interna está pensada para servicios ofrecidos a todas las máquinas de la red local. Esto podría incluir servicios como streaming multimedia o compartición simple de archivos. La zona externa está pensada para servicios públicamente expuestos a Internet. Esto podría incluir servicios como blog, sitio web, cliente web de correo electrónico etc. Para más detalles acerca de como se configuran por defecto los interfaces de red mira la sección Redes.
Puertos/ServiciosLa siguiente tabla trata de documentar los puertos, servicios y sus estados por defecto en FreedomBox. Si encuentras esta página desactualizada mira la página de estado del cortafuegos en el interfaz web de FreedomBox. ServicioPuerto ExternoHabilitado por defectoEstado mostrado en FreedomBoxAdministrado por FreedomBox Minetest 30000/udp {*} {X} (./) (./) XMPP Client 5222/tcp {*} {X} (./) (./) XMPP Server 5269/tcp {*} {X} (./) (./) XMPP Bosh 5280/tcp {*} {X} (./) (./) NTP 123/udp {o} (./) (./) (./) Interfaz web de FreedomBox 443/tcp {*} (./) (./) {X} Quassel 4242/tcp {*} {X} (./) (./) SIP 5060/tcp {*} {X} (./) (./) SIP 5060/udp {*} {X} (./) (./) SIP-TLS 5061/tcp {*} {X} (./) (./) SIP-TLS 5061/udp {*} {X} (./) (./) RTP 1024-65535/udp {*} {X} (./) (./) SSH 22/tcp {*} (./) (./) {X} mDNS 5353/udp {o} (./) (./) (./) Tor (Socks) 9050/tcp {o} {X} (./) (./) Obfsproxy <random>/tcp {*} {X} (./) (./) OpenVPN 1194/udp {*} {X} (./) (./) Mumble 64378/tcp {*} {X} (./) (./) Mumble 64378/udp {*} {X} (./) (./) Privoxy 8118/tcp {o} {X} (./) (./) JSXC 80/tcp {*} {X} {X} {X} JSXC 443/tcp {*} {X} {X} {X} DNS 53/tcp {o} {X} {X} {X} DNS 53/udp {o} {X} {X} {X} DHCP 67/udp {o} (./) {X} {X} Bootp 67/tcp {o} {X} {X} {X} Bootp 67/udp {o} {X} {X} {X} Bootp 68/tcp {o} {X} {X} {X} Bootp 68/udp {o} {X} {X} {X} LDAP 389/tcp {o} {X} {X} {X} LDAPS 636/tcp {o} {X} {X} {X}
Operación ManualPara completar información acerca de los conceptos basicos o más allá, mira la documentación de FirewallD.
Habilitar/deshabilitar el cortafuegosPara deshabilitar el cortafuegos o con systemd Para vover a habilitar el cortafuegos o con systemd
Modificar servicios/puertosPuedes añadir o eliminar un servicio de una zona manualmente. Para ver la lista de servicios habilitados: --list-services]]>Ejemplo: Para ver la lista de puertos habilitados: --list-ports]]>Ejemplo: Para eliminar un servicio de una zona: --remove-service= +
es/FreedomBox/Manual/Firewall162020-06-01 23:33:56JamesValleroyadd TableOfContents152020-05-24 08:59:22fioddorSe alinea con la versión 32 en inglés del 24 de mayo de 2020142020-05-24 08:56:37fioddorSe alinea con la versión 31 en inglés del 24 de mayo de 2020132020-05-10 00:57:07fioddorSe alinea con la versión 29 en inglés del 03 de mayo de 2020122020-04-13 16:15:55fioddorSe alinea con la versión 27 en inglés del 12 de abril de 2020112020-04-11 10:25:56fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_154258102020-04-04 16:56:41fioddorMejora menor. Algo más claro.92020-04-04 16:52:56fioddorEnlace a página traducida.82020-04-04 16:49:56fioddorSe usan imágenes traducidas y más actuales.72019-10-21 15:03:44fioddorCorrección menor62019-10-21 14:58:42fioddorCorrección menor52019-08-20 12:16:19fioddorS42019-08-20 12:07:57fioddorSe incorpora la traducción de una sección nueva.32019-08-20 11:59:19fioddorSe incorpora la traducción de una sección nueva.22019-08-20 11:54:54fioddorSe incorpora la traducción de una sección nueva.12019-08-20 11:39:24fioddorSe crea la versión española (traducción incompleta).
CortafuegosUn cortafuegos es un sistema de seguridad de red que controla el tráfico de entrada y salida desde/a la red. Mantener un cortafuegos habilitado y apropiadamente configurado reduce el riesgo de amenazas a la seguridad desde Internet. La operación del cortafuegos desde el interfaz web de FreedomBox es automática. Cuando habilitas un servicio se le abre automáticamente el cortafuegos y cuando lo deshabilitas se le cierra también automáticamente. Para servicios habilitados por defecto en FreedomBox los puertos se abren en el cortafuegos por defecto durante el proceso de la primera ejecución. Firewall La administración del cortafuegos en FreedomBox se hace empleando FirewallD.
InterfacesCada interfaz de red necesita asignarse a 1 (y sólo 1) zona. Si no se le establece zona, automáticamente se le asigna la zona externa. Las reglas que tenga activas la zona se aplicarán al interfaz. Por ejemplo, si se permite el trafico HTTP en una zona en particular las peticiones web se acceptarán en todas las direcciones configuradas para todos los interfaces asignados a esa zona. Principalmente se emplean 2 zonas de cortafuegos. La zona interna está pensada para servicios ofrecidos a todas las máquinas de la red local. Esto podría incluir servicios como streaming multimedia o compartición simple de archivos. La zona externa está pensada para servicios públicamente expuestos a Internet. Esto podría incluir servicios como blog, sitio web, cliente web de correo electrónico etc. Para más detalles acerca de como se configuran por defecto los interfaces de red mira la sección Redes.
Abrir Puertos PropiosCockpit proporciona administración avanzada de cortafuegos. Ambos, FreedomBox y Cockpit operan sobre firewalld y son por tanto compatibles entre sí. En particular, Cockpit se puede usar en FreedomBox para abrir servicios o puertos. Esto resulta útil si además de los servicios proporcionados por FreedomBox estás ejecutando manualmente tus propios servicios en la misma máquina. firewalld-cockpit.png
Puertos/Servicios de FreedomBoxLa siguiente tabla trata de documentar los puertos, servicios y sus estados por defecto en FreedomBox. Si encuentras esta página desactualizada mira la página de estado del cortafuegos en el interfaz web de FreedomBox. ServicioPuerto ExternoHabilitado por defectoEstado mostrado en FreedomBoxAdministrado por FreedomBox Minetest 30000/udp {*} {X} (./) (./) XMPP Client 5222/tcp {*} {X} (./) (./) XMPP Server 5269/tcp {*} {X} (./) (./) XMPP Bosh 5280/tcp {*} {X} (./) (./) NTP 123/udp {o} (./) (./) (./) Interfaz web de FreedomBox 443/tcp {*} (./) (./) {X} Quassel 4242/tcp {*} {X} (./) (./) SIP 5060/tcp {*} {X} (./) (./) SIP 5060/udp {*} {X} (./) (./) SIP-TLS 5061/tcp {*} {X} (./) (./) SIP-TLS 5061/udp {*} {X} (./) (./) RTP 1024-65535/udp {*} {X} (./) (./) SSH 22/tcp {*} (./) (./) {X} mDNS 5353/udp {o} (./) (./) (./) Tor (Socks) 9050/tcp {o} {X} (./) (./) Obfsproxy <random>/tcp {*} {X} (./) (./) OpenVPN 1194/udp {*} {X} (./) (./) Mumble 64378/tcp {*} {X} (./) (./) Mumble 64378/udp {*} {X} (./) (./) Privoxy 8118/tcp {o} {X} (./) (./) JSXC 80/tcp {*} {X} {X} {X} JSXC 443/tcp {*} {X} {X} {X} DNS 53/tcp {o} {X} {X} {X} DNS 53/udp {o} {X} {X} {X} DHCP 67/udp {o} (./) {X} {X} Bootp 67/tcp {o} {X} {X} {X} Bootp 67/udp {o} {X} {X} {X} Bootp 68/tcp {o} {X} {X} {X} Bootp 68/udp {o} {X} {X} {X} LDAP 389/tcp {o} {X} {X} {X} LDAPS 636/tcp {o} {X} {X} {X}
Operación ManualPara completar información acerca de los conceptos basicos o más allá, mira la documentación de FirewallD.
Habilitar/deshabilitar el cortafuegosPara deshabilitar el cortafuegos o con systemd Para vover a habilitar el cortafuegos o con systemd
Modificar servicios/puertosPuedes añadir o eliminar un servicio de una zona manualmente. Para ver la lista de servicios habilitados: --list-services]]>Ejemplo: Para ver la lista de puertos habilitados: --list-ports]]>Ejemplo: Para eliminar un servicio de una zona: --remove-service= firewall-cmd --permanent --zone= --remove-service=]]>Ejemplo: Para eliminar un puerto de una zona: / firewall-cmd --permanent --zone=internal --remove-port=/]]>Ejemplo: --remove-interface=]]>Ejemplo: Para añadir un interfaz a una zona: --add-interface= firewall-cmd --permanent --zone= --add-interface=]]>Ejemplo: Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +firewall-cmd --permanent --zone=internal --add-interface=eth0]]>
Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/GitWeb.raw.xml b/doc/manual/es/GitWeb.raw.xml index 07d78122e..3fb302150 100644 --- a/doc/manual/es/GitWeb.raw.xml +++ b/doc/manual/es/GitWeb.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/GitWeb32020-01-29 06:49:24fioddorSe alinea con la versión 7 en inglés del 29 de enero de 202022019-12-17 21:25:32fioddorSe alinea con la versión 04 en inglés del 17 de diciembre de 201912019-12-15 19:00:01fioddorSe traduce una página nueva
Alojamiento Git Simple (GitWeb)GitWeb proporciona alojamiento Git en FreedomBox. Proporciona un interfaz web simple para realizar acciones comunes como ver archivos, diferencias, descripciones de cambio, etc. Disponible desde versión: 19.19
Autenticación básica HTTPActualmente el GitWeb de FreedomBox solo soporta remotos HTTP. Para evitar tener que introducir la contraseña cada vez que haces pull/push al repositorio puedes editar tu remoto para incluír credenciales. Ejemplo: Tu nombre de usuario y contraseña se cifrarán. Quien monitorize el tráfico de la red solo apreciará el nombre de dominio. Nota: Al usar este método tu contraseña se almacenará en claro en el fichero .git/config del repositorio local. Por este motivo debes crear un usuario FreedomBox que solo tenga acceso a gitweb y no usar nunca una cuenta de administrador.
Réplicas EspejoAunque tus repositorios se albergan principalmente en tu propia FreedomBox puedes configurar un repositorio en otro servicio de alojamiento Git como GitLab a modo de copia espejo. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/GitWeb62020-05-30 19:35:09SunilMohanAdapaMatch title with FreedomBox interface52020-05-30 19:34:33SunilMohanAdapaUpdate the title to emphasize app name over its generic name42020-05-24 07:04:04fioddorSe alinea con la versión 08 en inglés del 23 de mayo de 202032020-01-29 06:49:24fioddorSe alinea con la versión 7 en inglés del 29 de enero de 202022019-12-17 21:25:32fioddorSe alinea con la versión 04 en inglés del 17 de diciembre de 201912019-12-15 19:00:01fioddorSe traduce una página nueva
GitWeb (Alojamiento simple para Git)GitWeb proporciona alojamiento Git en FreedomBox. Proporciona un interfaz web simple para realizar acciones comunes como ver archivos, diferencias, descripciones de cambio, etc. Disponible desde versión: 19.19
Autenticación básica HTTPActualmente el GitWeb de FreedomBox solo soporta remotos HTTP. Para evitar tener que introducir la contraseña cada vez que haces pull/push al repositorio puedes editar tu remoto para incluír credenciales. Ejemplo: Tu nombre de usuario y contraseña se cifrarán. Quien monitorize el tráfico de la red solo apreciará el nombre de dominio. Nota: Al usar este método tu contraseña se almacenará en claro en el fichero .git/config del repositorio local. Por este motivo debes crear un usuario FreedomBox que solo tenga acceso a gitweb y no usar nunca una cuenta de administrador.
Réplicas EspejoAunque tus repositorios se albergan principalmente en tu propia FreedomBox puedes configurar un repositorio en otro servicio de alojamiento Git como GitLab a modo de copia espejo. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/I2P.raw.xml b/doc/manual/es/I2P.raw.xml index 172a69db3..1c683bfe8 100644 --- a/doc/manual/es/I2P.raw.xml +++ b/doc/manual/es/I2P.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/I2P62019-09-17 13:59:23fioddorCorrección52019-09-17 13:58:00fioddorCorrecciones menores.42019-09-17 13:56:45fioddorCorrección32019-09-17 13:55:36fioddorMejora menor22019-09-17 13:54:52fioddorSe crea la versión española.12019-09-17 12:37:09fioddorSe crea la versión española (traducción incompleta).
Red de Anonimato (I2P)
Acerca de I2PEl Proyecto Internet Invisible (I2P) es una capa anonimizadora de red concebida para protejer las comunicaciones de la censura y la vigilancia. I2P proporciona anonimato enviando tráfico cifrado a través de una red distribuída alrededor del mundo gestionada por voluntarios. Más información acerca de I2P en la página principal del proyecto.
Servicios OfrecidosLos siguientes servicios se ofrecen en FreedomBox a través de I2P de serie. Se pueden habilitar más servicios desde la consola de enrutado I2P que se puede abrir desde el interfaz web de FreedomBox. Navegación web anónima: I2P se puede usar para navegar por la web de forma anónima. Para ello configura tu navegador (preferíblemente un navegador Tor) para conectar al proxy I2P. Esto se puede hacer estableciendo los proxies HTTP y HTTPS a freedombox.local (o la IP local de tu FreedomBox) con sus respectivos puertos a 4444 y 4445. Este servicio está disponible sólo cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de navegación web anónima a través de I2P. Acceso a eepsites: La red I2P puede albergar sitios web anónimos llamados eepsites cuyo nombre de dominio acaba en .i2p. Por ejemplo, http://i2p-projekt.i2p/ es el sitio web del proyecto I2P en la red I2P. Los eepsites son inaccesibles a un navegador normal a través de una conexión Internet normal. Para navegar a los eepsites tu navegador necesita configurarse para usar los proxies HTTP y HTTPS como se describió antes. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de acceso a eepsites a través de I2P. Descargas anónima de torrentes: I2PSnark, una aplicación para descargar y compartir archivos anónimamente mediante la red BitTorrent está disponible y habilitada por defecto en FreedomBox. Esta aplicación se controla mediante un interfaz web que se puede abrir desde la sección Torrentes Anonimos de la app I2P en el interfaz web de FreedomBox o de la consola de enrutado I2P. Solo los usuarios ingresados pertenecientes al grupo Manage I2P application pueden usar este servicio. Red IRC: La red I2P contiene una red IRC llamada Irc2P. Esta red alberga el canal IRC oficial del proyecto I2P, entre otros. Este servicio viene habilitdo de serie en FreedomBox. Para usarlo abre tu cliente IRC favorito y configuralo para conectar con freedombox.local (o la IP local de tu FreedomBox) en el puerto 6668. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de IRC a través de I2P. Consola de enrutado I2P: Este es el interfaz central de administración de I2P. Muestra el estado actual de I2P, estadísticas de ancho de banda y permite modificar varias preferencias de configuración. Puedes adecuar tu participación en la red I2P y usar/editar una lista con tus sitios I2P (eepsites) favoritos. Solo los usuarios ingresados pertenecientes al grupo Manage I2P application pueden usar este servicio. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0).
\ No newline at end of file +
es/FreedomBox/Manual/I2P82020-05-30 19:35:54SunilMohanAdapaUpdate the title to emphasize app name over its generic name, match with FreedomBox interface72020-05-24 07:21:04fioddorSe alinea con la versión 02 en inglés del 23 de mayo de 202062019-09-17 13:59:23fioddorCorrección52019-09-17 13:58:00fioddorCorrecciones menores.42019-09-17 13:56:45fioddorCorrección32019-09-17 13:55:36fioddorMejora menor22019-09-17 13:54:52fioddorSe crea la versión española.12019-09-17 12:37:09fioddorSe crea la versión española (traducción incompleta).
I2P (Red anónima)
Acerca de I2PEl Proyecto Internet Invisible (I2P) es una capa anonimizadora de red concebida para protejer las comunicaciones de la censura y la vigilancia. I2P proporciona anonimato enviando tráfico cifrado a través de una red distribuída alrededor del mundo gestionada por voluntarios. Más información acerca de I2P en la página principal del proyecto.
Servicios OfrecidosLos siguientes servicios se ofrecen en FreedomBox a través de I2P de serie. Se pueden habilitar más servicios desde la consola de enrutado I2P que se puede abrir desde el interfaz web de FreedomBox. Navegación web anónima: I2P se puede usar para navegar por la web de forma anónima. Para ello configura tu navegador (preferíblemente un navegador Tor) para conectar al proxy I2P. Esto se puede hacer estableciendo los proxies HTTP y HTTPS a freedombox.local (o la IP local de tu FreedomBox) con sus respectivos puertos a 4444 y 4445. Este servicio está disponible sólo cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de navegación web anónima a través de I2P. Acceso a eepsites: La red I2P puede albergar sitios web anónimos llamados eepsites cuyo nombre de dominio acaba en .i2p. Por ejemplo, http://i2p-projekt.i2p/ es el sitio web del proyecto I2P en la red I2P. Los eepsites son inaccesibles a un navegador normal a través de una conexión Internet normal. Para navegar a los eepsites tu navegador necesita configurarse para usar los proxies HTTP y HTTPS como se describió antes. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de acceso a eepsites a través de I2P. Descargas anónima de torrentes: I2PSnark, una aplicación para descargar y compartir archivos anónimamente mediante la red BitTorrent está disponible y habilitada por defecto en FreedomBox. Esta aplicación se controla mediante un interfaz web que se puede abrir desde la sección Torrentes Anonimos de la app I2P en el interfaz web de FreedomBox o de la consola de enrutado I2P. Solo los usuarios ingresados pertenecientes al grupo Manage I2P application pueden usar este servicio. Red IRC: La red I2P contiene una red IRC llamada Irc2P. Esta red alberga el canal IRC oficial del proyecto I2P, entre otros. Este servicio viene habilitdo de serie en FreedomBox. Para usarlo abre tu cliente IRC favorito y configuralo para conectar con freedombox.local (o la IP local de tu FreedomBox) en el puerto 6668. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de IRC a través de I2P. Consola de enrutado I2P: Este es el interfaz central de administración de I2P. Muestra el estado actual de I2P, estadísticas de ancho de banda y permite modificar varias preferencias de configuración. Puedes adecuar tu participación en la red I2P y usar/editar una lista con tus sitios I2P (eepsites) favoritos. Solo los usuarios ingresados pertenecientes al grupo Manage I2P application pueden usar este servicio. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0).
\ No newline at end of file diff --git a/doc/manual/es/Ikiwiki.raw.xml b/doc/manual/es/Ikiwiki.raw.xml index 9833ebbc9..7495a7edf 100644 --- a/doc/manual/es/Ikiwiki.raw.xml +++ b/doc/manual/es/Ikiwiki.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Ikiwiki32019-09-17 12:09:26fioddorMejora menor22019-09-17 12:07:08fioddorMejora menor12019-09-17 12:05:55fioddorSe crea la versión española.
Wiki y Blog (Ikiwiki)
¿Qué es Ikiwiki?Ikiwiki convierte páginas wiki a páginas HTML listas para publicar en un sitio web. En particular, proporciona blogs, podcasts, calendarios y una amplia selección de extensiones (plugins).
Inicio rápidoTras instalar la app en el interfaz de administración de tu FreedomBox: Ve a la sección Crear y crea un wiki o un blog. Vuelve a la sección Configurar y haz clic en el enlace /ikiwiki. Haz clic en el nombre de tu nuevo wiki o blog bajo Directorio Padre. Disfruta de tu nueva página de publicación.
Crear un wiki o blogPuedes crear un wiki o blog para albergarlo en tu FreedomBox mediante la página Wiki y Blog (Ikiwiki) de Plinth. La primera vez que visites esta página te pedirá instalar paquetes requiridos por Ikiwiki. Tras completar la instalación de paquetes selecciona la solapa Crear. Puedes elegir el tipo: Wiki o Blog. Teclea también un nombre para el wiki o blog, y el usuario y contraseña para su cuenta de administrador. Al hacer clic en Actualizar configuración verás el wiki/blog añadido a tu lista. Observa que cada wiki/blog tiene su propia cuenta de administrador. ikiwiki: Create
Acceder a tu wiki o blogDesde la página de Wiki y Blog (Ikiwiki) selecciona la solapa Administrar y verás una lista de tus wikis y blogs. Haz clic en un nombre para navegar a ese wiki o blog. ikiwiki: Manage Desde aquí, si le das a Editar o a Preferencias se te llevará a una página de ingreso. Para ingresar con la cuenta de administrador que creaste antes selecciona la solapa Otros, introduce el usuario y la contraseña y haz clic en Ingresar.
Ingreso único de usuarios (SSO)Se puede dar permiso para editar a otros usuarios de FreedomBox además de al administrador del wiki/blog. Sin embargo no tendrán todos los permisos del administrador. Podrán añadir o editar páginas pero no podrán cambiar la configuración del wiki. Para añadir a un usuario al wiki ve a la página Usuarios y Grupos de Plinth (bajo Configuración del Sistema, el icono del engranaje de la esquina superior derecha de la página). Crea o modifica un usuario y añádele al grupo wiki. (Los usuarios del grupo admin tendrán también acceso al wiki.) Para ingresar como usuario FreedomBox ve a la página de ingreso del wiki/blog y selecciona la solapa Otros. Luego haz clic en el botón Ingresar con autenticación HTTP. El navegador mostrá un diálogo emergente en el que podrás introducir el usuario y la contraseña del usuario de FreedomBox.
Añadir usuarios FreedomBox como admnistradores de wikiIngresa al wiki con su cuenta de administrador. Haz clic en Preferencias y luego en Configurar. Debajo de Principal, en usuarios administradores de algún wiki, añade el nombre de un usuario de FreedomBox. (Opcional) Desmarca la opción habilitar autenticación mediante contraseña de extensión de autenticación: autenticación mediante contraseña. (Nota: Esto deshabilitará el ingreso con la cuenta de administrador anterior. Solo se podrá ingresar mediante ingreso único usando autenticación HTTP.) Haz clic en Grabar Configuración. Pulsa Preferencias y a continuación Salir. Ingresa como el nuevo usuario administrador usando Ingresar con autenticación HTTP. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Ikiwiki52020-05-30 19:36:25SunilMohanAdapaUpdate the title to emphasize app name over its generic name42020-05-24 07:17:47fioddorSe alinea con la versión 11 en inglés del 23 de mayo de 202032019-09-17 12:09:26fioddorMejora menor22019-09-17 12:07:08fioddorMejora menor12019-09-17 12:05:55fioddorSe crea la versión española.
Ikiwiki (Wiki y Blog)
¿Qué es Ikiwiki?Ikiwiki convierte páginas wiki a páginas HTML listas para publicar en un sitio web. En particular, proporciona blogs, podcasts, calendarios y una amplia selección de extensiones (plugins).
Inicio rápidoTras instalar la app en el interfaz de administración de tu FreedomBox: Ve a la sección Crear y crea un wiki o un blog. Vuelve a la sección Configurar y haz clic en el enlace /ikiwiki. Haz clic en el nombre de tu nuevo wiki o blog bajo Directorio Padre. Disfruta de tu nueva página de publicación.
Crear un wiki o blogPuedes crear un wiki o blog para albergarlo en tu FreedomBox mediante la página Wiki y Blog (Ikiwiki). La primera vez que visites esta página te pedirá instalar paquetes requiridos por Ikiwiki. Tras completar la instalación de paquetes selecciona la solapa Crear. Puedes elegir el tipo: Wiki o Blog. Teclea también un nombre para el wiki o blog, y el usuario y contraseña para su cuenta de administrador. Al hacer clic en Actualizar configuración verás el wiki/blog añadido a tu lista. Observa que cada wiki/blog tiene su propia cuenta de administrador. ikiwiki: Create
Acceder a tu wiki o blogDesde la página de Wiki y Blog (Ikiwiki) selecciona la solapa Administrar y verás una lista de tus wikis y blogs. Haz clic en un nombre para navegar a ese wiki o blog. ikiwiki: Manage Desde aquí, si le das a Editar o a Preferencias se te llevará a una página de ingreso. Para ingresar con la cuenta de administrador que creaste antes selecciona la solapa Otros, introduce el usuario y la contraseña y haz clic en Ingresar.
Ingreso único de usuarios (SSO)Se puede dar permiso para editar a otros usuarios de FreedomBox además de al administrador del wiki/blog. Sin embargo no tendrán todos los permisos del administrador. Podrán añadir o editar páginas pero no podrán cambiar la configuración del wiki. Para añadir a un usuario al wiki ve a la página Usuarios y Grupos de FreedomBox (bajo Configuración del Sistema, el icono del engranaje de la esquina superior derecha de la página). Crea o modifica un usuario y añádele al grupo wiki. (Los usuarios del grupo admin tendrán también acceso al wiki.) Para ingresar como usuario FreedomBox ve a la página de ingreso del wiki/blog y selecciona la solapa Otros. Luego haz clic en el botón Ingresar con autenticación HTTP. El navegador mostrá un diálogo emergente en el que podrás introducir el usuario y la contraseña del usuario de FreedomBox.
Añadir usuarios FreedomBox como admnistradores de wikiIngresa al wiki con su cuenta de administrador. Haz clic en Preferencias y luego en Configurar. Debajo de Principal, en usuarios administradores de algún wiki, añade el nombre de un usuario de FreedomBox. (Opcional) Desmarca la opción habilitar autenticación mediante contraseña de extensión de autenticación: autenticación mediante contraseña. (Nota: Esto deshabilitará el ingreso con la cuenta de administrador anterior. Solo se podrá ingresar mediante ingreso único usando autenticación HTTP.) Haz clic en Grabar Configuración. Pulsa Preferencias y a continuación Salir. Ingresa como el nuevo usuario administrador usando Ingresar con autenticación HTTP. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Infinoted.raw.xml b/doc/manual/es/Infinoted.raw.xml index abe8ca2bc..2e91e22c6 100644 --- a/doc/manual/es/Infinoted.raw.xml +++ b/doc/manual/es/Infinoted.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Infinoted22019-09-12 11:09:53fioddorMejora menor12019-09-12 11:08:05fioddorSe crea la versión española.
Servidor Gobby (infinoted)Infinoted es un servidor de edición colaborativa de textos para Gobby. Para usarlo descarga el cliente Gobby para escritorio e instalalo. Inicialo, selecciona "Conectar a un Servidor" e introduce el nombre de dominio de tu FreedomBox.
Redirección de PuertosSi tu FreedomBox está detras de un router necesitarás configurar la redirección de puertos en tu router. Redirije los siguientes puertos de infinoted: TCP 6523 Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Infinoted42020-05-30 19:37:00SunilMohanAdapaUpdate the title to emphasize app name over its generic name32020-05-24 06:57:06fioddorSe alinea con la versión 02 en inglés del 23 de mayo de 202022019-09-12 11:09:53fioddorMejora menor12019-09-12 11:08:05fioddorSe crea la versión española.
infinoted (Servidor Gobby)Infinoted es un servidor de edición colaborativa de textos para Gobby. Para usarlo descarga el cliente Gobby para escritorio e instalalo. Inicialo, selecciona "Conectar a un Servidor" e introduce el nombre de dominio de tu FreedomBox.
Redirección de PuertosSi tu FreedomBox está detras de un router necesitarás configurar la redirección de puertos en tu router. Redirije los siguientes puertos de infinoted: TCP 6523 Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/LetsEncrypt.raw.xml b/doc/manual/es/LetsEncrypt.raw.xml index b02f9ee94..4d745eacc 100644 --- a/doc/manual/es/LetsEncrypt.raw.xml +++ b/doc/manual/es/LetsEncrypt.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/LetsEncrypt32020-04-04 17:19:32fioddorCorrección.22019-08-20 12:56:47fioddorSe incorpora la traducción de una sección nueva.12019-08-20 12:48:05fioddorSe incorpora la traducción de una sección nueva.
Certificados (Let's Encrypt)Un certificado digital permite a los usuarios de un servicio web verificar la identidad del servicio y comunicar con él de modo seguro. FreedomBox puede obtener y configurar automaticamente certificados digitales para cada dominio disponible. Lo hace probando a Let's Encrypt, una authoridad de certificación (CA) ser el dueño de un dominio. Let's Encrypt es una autoridad de certificación abierta, automatizada, libre y gratuita administrada para beneficio público por el Internet Security Research Group (ISRG). Por favor, lee y acepta los términos del Acuerdo de Suscripción de Let's Encrypt antes de usar este servicio.
Por Qué Usar CertificadosLa comunicación con tu FreedomBox se puede asegurar de modo que se imposibilite interceptar los contenidos que tus servicios intercambian con sus usuarios.
Cómo configurarSi tu FreedomBox está detrás de un router, necesitarás configurar la redirección de puertos en tu router. Debes redirigir los siguientes puertos: TCP 80 (http) TCP 443 (https) Publica tu nombre de dominio: En Configurar inserta tu nombre de dominio, p.ej. MiWeb.com Let's Encrypt Verifica que se aceptó tu nombre de dominio Comprueba que está habilitado en Servicio de Nombres Let's Encrypt Name Services Ve a la página de los Certificados (Let's Encrypt) y completa la instalación del modulo si hace falta. Entonces haz clic en el botón "Obtain" de tu nombre de dominio. Tras algunos minutos estará disponible un certificado válido Let's Encrypt Verifica en tu navegador comprobando https://MiWeb.com Let's Encrypt Certificate Screencast: Let's Encrypt
UsarEl certificado es válido por 3 meses. Se renueva automáticamente y también se puede volcer a obtener o revocar manualmente. Ejecutando diagnostics se puede también verificar el certificado. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/LetsEncrypt52020-05-30 19:48:56SunilMohanAdapaUpdate the title to emphasize app name over its generic name42020-05-24 07:38:10fioddorSe alinea con la versión 11 en inglés del 23 de mayo de 202032020-04-04 17:19:32fioddorCorrección.22019-08-20 12:56:47fioddorSe incorpora la traducción de una sección nueva.12019-08-20 12:48:05fioddorSe incorpora la traducción de una sección nueva.
Let's Encrypt (Certificados)Un certificado digital permite a los usuarios de un servicio web verificar la identidad del servicio y comunicar con él de modo seguro. FreedomBox puede obtener y configurar automaticamente certificados digitales para cada dominio disponible. Lo hace probando a Let's Encrypt, una authoridad de certificación (CA) ser el dueño de un dominio. Let's Encrypt es una autoridad de certificación abierta, automatizada, libre y gratuita administrada para beneficio público por el Internet Security Research Group (ISRG). Por favor, lee y acepta los términos del Acuerdo de Suscripción de Let's Encrypt antes de usar este servicio.
Por Qué Usar CertificadosLa comunicación con tu FreedomBox se puede asegurar de modo que se imposibilite interceptar los contenidos que tus servicios intercambian con sus usuarios.
Cómo configurarSi tu FreedomBox está detrás de un router, necesitarás configurar la redirección de puertos en tu router. Debes redirigir los siguientes puertos: TCP 80 (http) TCP 443 (https) Publica tu nombre de dominio: En Configurar inserta tu nombre de dominio, p.ej. MiWeb.com Let's Encrypt Verifica que se aceptó tu nombre de dominio Comprueba que está habilitado en Servicio de Nombres Let's Encrypt Name Services Ve a la página de los Certificados (Let's Encrypt) y completa la instalación del modulo si hace falta. Entonces haz clic en el botón "Obtain" de tu nombre de dominio. Tras algunos minutos estará disponible un certificado válido Let's Encrypt Verifica en tu navegador comprobando https://MiWeb.com Let's Encrypt Certificate Screencast: Let's Encrypt
UsarEl certificado es válido por 3 meses. Se renueva automáticamente y también se puede volcer a obtener o revocar manualmente. Ejecutando diagnostics se puede también verificar el certificado. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/MLDonkey.raw.xml b/doc/manual/es/MLDonkey.raw.xml index 44399cf6a..5d296da4c 100644 --- a/doc/manual/es/MLDonkey.raw.xml +++ b/doc/manual/es/MLDonkey.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/MLDonkey22019-09-11 14:51:57fioddorCorrecciones menores.12019-09-11 14:46:33fioddorSe crea la versión española.
Compartición de Archivos (MLDonkey)
¿Qué es MLDonkey?MLDonkey es una aplicación libre y multiprotocolo para compartir archivos entre pares (P2P) que ejecuta un servidor back-end sobre muchas plataformas. Se puede controlar mediante algún interfaz front-end, ya sea web, telnet o cualquier otro de entre una docena de programas cliente nativos. Originalmente era un cliente Linux para el protocolo eDonkey pero ahora se ejecuta en multiples sabores de Unix y derivados, OS X, Microsoft Windows y MorphOS. Y soporta muchos protocolos P2P, incluyendo ED2K (y Kademlia sobre Overnet), BitTorrent, DC++ y más. Más información acerca de MLDonkey en el Wiki del Proyecto MLDonkey Disponible desde: versión 0.48.0
Captura de PantallaMLDonkey Web Interface
Usar el Interfaz Web MLDonkeyTras instalar MLDonkey su interfaz web está accesible a los usuarios de los grupos ed2k y admin en https://<tu_freedombox>/mldonkey.
Usar el Interfaz para Escritorio/MóvilSe pueden usar muchas aplicaciones de escritorio y móviles para controlar a MLDonkey. El servidor MLDonkey estará ejecutándose siempre en la FreedomBox y (cargará o) descargará archivos y los mantendrá almacenados incluso cuando tu máquina local esté apagada o desconectada del MLDonkey de FreedomBox. Por restricciones de acceso via SSH a la FreedomBox solo los usuarios del grupo admin pueden acceder a su MLDonkey. Crea un usuario nuevo en el grupo admin o usa uno que ya esté allí. En tu máquina de escritorio abre una terminal y ejecuta el siguiente comando. Para este paso se recomienda que configures y uses claves SSH en vez de contraseñas. Arranca la aplicación gráfica y conéctala a MLDonkey como si MLDonkey se estuviera ejecutando en la máquina local de escritorio. Cuando hayas terminado mata el proceso SSH pulsando Control-C. Para más información lee acerca de los túneles SSH en la documentación MLDonkey. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/MLDonkey42020-05-30 19:40:24SunilMohanAdapaUpdate the title to emphasize app name over its generic name, match with FreedomBox interface32020-05-24 06:51:48fioddorSe alinea con la versión 13 en inglés del 23 de mayo de 202022019-09-11 14:51:57fioddorCorrecciones menores.12019-09-11 14:46:33fioddorSe crea la versión española.
MLDonkey (Compartir archivos entre pares)
¿Qué es MLDonkey?MLDonkey es una aplicación libre y multiprotocolo para compartir archivos entre pares (P2P) que ejecuta un servidor back-end sobre muchas plataformas. Se puede controlar mediante algún interfaz front-end, ya sea web, telnet o cualquier otro de entre una docena de programas cliente nativos. Originalmente era un cliente Linux para el protocolo eDonkey pero ahora se ejecuta en multiples sabores de Unix y derivados, OS X, Microsoft Windows y MorphOS. Y soporta muchos protocolos P2P, incluyendo ED2K (y Kademlia sobre Overnet), BitTorrent, DC++ y más. Más información acerca de MLDonkey en el Wiki del Proyecto MLDonkey Disponible desde: versión 0.48.0
Captura de PantallaMLDonkey Web Interface
Usar el Interfaz Web MLDonkeyTras instalar MLDonkey su interfaz web está accesible a los usuarios de los grupos ed2k y admin en https://<tu_freedombox>/mldonkey.
Usar el Interfaz para Escritorio/MóvilSe pueden usar muchas aplicaciones de escritorio y móviles para controlar a MLDonkey. El servidor MLDonkey estará ejecutándose siempre en la FreedomBox y (cargará o) descargará archivos y los mantendrá almacenados incluso cuando tu máquina local esté apagada o desconectada del MLDonkey de FreedomBox. Por restricciones de acceso via SSH a la FreedomBox solo los usuarios del grupo admin pueden acceder a su MLDonkey. Crea un usuario nuevo en el grupo admin o usa uno que ya esté allí. En tu máquina de escritorio abre una terminal y ejecuta el siguiente comando. Para este paso se recomienda que configures y uses claves SSH en vez de contraseñas. Arranca la aplicación gráfica y conéctala a MLDonkey como si MLDonkey se estuviera ejecutando en la máquina local de escritorio. Cuando hayas terminado mata el proceso SSH pulsando Control-C. Para más información lee acerca de los túneles SSH en la documentación MLDonkey. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/MatrixSynapse.raw.xml b/doc/manual/es/MatrixSynapse.raw.xml index ad19de38f..f8d507881 100644 --- a/doc/manual/es/MatrixSynapse.raw.xml +++ b/doc/manual/es/MatrixSynapse.raw.xml @@ -1,7 +1,7 @@ -
es/FreedomBox/Manual/MatrixSynapse82020-03-25 19:19:30fioddorSe alinea con la versión 17 en inglés del 21 de marzo de 202072020-01-03 12:50:08fioddorSe alinea con la versión 15 en inglés de hoy62019-09-26 06:27:14fioddorSe actualiza a la versión inglesa 11 del 25 de septiembre de 2019.52019-09-11 08:05:05fioddorCorrecciones menores.42019-09-11 07:28:27fioddorSe crea la versión española.32019-09-11 07:20:22fioddorSe crea la versión española (traducción incompleta).22019-09-11 07:19:53fioddor12019-09-11 07:18:36fioddorSe crea la versión española (traducción incompleta).
Servidor de Mensajería Instantánea (chat) (Matrix Synapse)
¿Qué es Matrix?Matrix es un estándar abierto para comunicaciones sobre IP en tiempo real interoperables y descentralizadas. Synapse es la implementación de referencia de un servidor Matrix. Se puede usar para montar mensajería instantánea sobre FreedomBox para albergar grandes salones de chat, comunicaciones cifradas punto a punto y llamadas de audio/vídeo. Matrix Synapse es una aplicación federada en la que puede haber salas de chat en un servidor y los usuarios de cualquier otro servidor de la red federada pueden unirse a ellas. Más información acerca de Matrix. Disponible desde: versión 0.14.0
¿Cómo acceder a tu servidor Matrix Synapse?Para acceder al servidor Matrix Synapse recomendamos el cliente Riot. Puedes descargar Riot para escritorio. Las aplicaciones para Android e iOS están disponibles en sus tiendas (app stores) respectivas.
Configurar Matrix Synapse en tu FreedomBoxPara habilitar Matrix, primero navega a la página de tu servidor de chat (Matrix Synapse) e instálalo. Matrix necesita un nombre de dominio válido configurado. Tras la instalación, se te pedirá que lo configures seleccionandolo de entre un menú desplegable con dominios disponibles. Los dominios se configuran en la página Sistema -> Configuración y actualmente no podrás cambiar el dominio una vez esté configurado. Tras configurar un dominio verás que el servicio se está ejecutando. El servicio estará accesible en el dominio de FreedomBox configurado. Tendrás que configurar tu router para que reenvíe el puerto 8448 a tu FreedomBox. Todos los usuarios registrados en tu FreedomBox tendrán sus IDs Matrix @usuario:dominio. Si está habilitado el registro público tu cliente se puede usar también para registrar una cuenta de usuario nueva.
Federarse con otras instancias MatrixPodrás interactuar con cualquier otra persona que ejecute otra instancia de Matrix. Esto se hace simplemente iniciando una conversación con ellos usando su matrix ID que seguirá el formato @su-usuario:su-dominio. También podrás unirte a salas de otros servidores y tener llamadas de audio/video con contactos de otros servidores.
Uso de MemoriaEl servidor de referencia Synapse implementado en Python es conocido por consumir mucha RAM, especialmente al cargar salones grandes con miles de participantes como #matrix:matrix.org. Se recomienda evitar unirse a estos salones si tu dispositivo FreedomBox solo tiene 1 GiB RAM o menos. Debería ser seguro unirse a salas con hasta 100 participantes. El equipo de Matrix está trabajando en una implementación de servidor Matrix escrita en Go llamada Dendrite que debería tener mejor rendimiento en entornos con poca memoria. Algunos salones públicos muy grandes de la red Matrix están también disponibles como canales IRC (p.ej. #freedombox:matrix.org está disponible también como #freedombox en irc.debian.org). Es mejor usar IRC en vez de Matrix para estos salones tán grandes. Puedes unirte a los canales de IRC usando Quassel.
Uso AvanzadoSi quieres crear una gran cantidad de usuarios en tu servidor de Matrix Synapse usa los siguientes comandos en una shell remota como usuario root: /etc/matrix-synapse/conf.d/registration_shared_secret.yaml +
es/FreedomBox/Manual/MatrixSynapse102020-05-30 19:37:48SunilMohanAdapaUpdate the title to emphasize app name over its generic name92020-05-24 06:37:15fioddorSe alinea con la versión 18 en inglés del 23 de mayo de 202082020-03-25 19:19:30fioddorSe alinea con la versión 17 en inglés del 21 de marzo de 202072020-01-03 12:50:08fioddorSe alinea con la versión 15 en inglés de hoy62019-09-26 06:27:14fioddorSe actualiza a la versión inglesa 11 del 25 de septiembre de 2019.52019-09-11 08:05:05fioddorCorrecciones menores.42019-09-11 07:28:27fioddorSe crea la versión española.32019-09-11 07:20:22fioddorSe crea la versión española (traducción incompleta).22019-09-11 07:19:53fioddor12019-09-11 07:18:36fioddorSe crea la versión española (traducción incompleta).
Matrix Synapse (Servidor de Mensajería Instantánea (chat))
¿Qué es Matrix?Matrix es un estándar abierto para comunicaciones sobre IP en tiempo real interoperables y descentralizadas. Synapse es la implementación de referencia de un servidor Matrix. Se puede usar para montar mensajería instantánea sobre FreedomBox para albergar grandes salones de chat, comunicaciones cifradas punto a punto y llamadas de audio/vídeo. Matrix Synapse es una aplicación federada en la que puede haber salas de chat en un servidor y los usuarios de cualquier otro servidor de la red federada pueden unirse a ellas. Más información acerca de Matrix. Disponible desde: versión 0.14.0
¿Cómo acceder a tu servidor Matrix Synapse?Para acceder al servidor Matrix Synapse recomendamos el cliente Riot. Puedes descargar Riot para escritorio. Las aplicaciones para Android e iOS están disponibles en sus tiendas (app stores) respectivas.
Configurar Matrix Synapse en tu FreedomBoxPara habilitar Matrix, primero navega a la página de tu servidor de chat (Matrix Synapse) e instálalo. Matrix necesita un nombre de dominio válido configurado. Tras la instalación, se te pedirá que lo configures seleccionandolo de entre un menú desplegable con dominios disponibles. Los dominios se configuran en la página Sistema -> Configuración y actualmente no podrás cambiar el dominio una vez esté configurado. Tras configurar un dominio verás que el servicio se está ejecutando. El servicio estará accesible en el dominio de FreedomBox configurado. Tendrás que configurar tu router para que reenvíe el puerto 8448 a tu FreedomBox. Todos los usuarios registrados en tu FreedomBox tendrán sus IDs Matrix @usuario:dominio. Si está habilitado el registro público tu cliente se puede usar también para registrar una cuenta de usuario nueva.
Federarse con otras instancias MatrixPodrás interactuar con cualquier otra persona que ejecute otra instancia de Matrix. Esto se hace simplemente iniciando una conversación con ellos usando su matrix ID que seguirá el formato @su-usuario:su-dominio. También podrás unirte a salas de otros servidores y tener llamadas de audio/video con contactos de otros servidores.
Uso de MemoriaEl servidor de referencia Synapse implementado en Python es conocido por consumir mucha RAM, especialmente al cargar salones grandes con miles de participantes como #matrix:matrix.org. Se recomienda evitar unirse a estos salones si tu dispositivo FreedomBox solo tiene 1 GiB RAM o menos. Debería ser seguro unirse a salas con hasta 100 participantes. El equipo de Matrix está trabajando en una implementación de servidor Matrix escrita en Go llamada Dendrite que debería tener mejor rendimiento en entornos con poca memoria. Algunos salones públicos muy grandes de la red Matrix están también disponibles como canales IRC (p.ej. #freedombox:matrix.org está disponible también como #freedombox en irc.debian.org). Es mejor usar IRC en vez de Matrix para estos salones tán grandes. Puedes unirte a los canales de IRC usando Quassel.
Uso AvanzadoSi quieres crear una gran cantidad de usuarios en tu servidor de Matrix Synapse usa los siguientes comandos en una shell remota como usuario root: /etc/matrix-synapse/conf.d/registration_shared_secret.yaml chmod 600 /etc/matrix-synapse/conf.d/registration_shared_secret.yaml chown matrix-synapse:nogroup /etc/matrix-synapse/conf.d/registration_shared_secret.yaml systemctl restart matrix-synapse register_new_matrix_user -c /etc/matrix-synapse/conf.d/registration_shared_secret.yaml]]>Si quieres ver la lista de usuarios registrados en Matrix Syanpse haz lo siguiente como usuario root: Para crear una comunidad en Matrix Synapse se necesita un usuario Matrix con privilegios de admin en el servidor. Para dárselos a miusuario ejecuta los siguientes comandos como usuario root: Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +echo "UPDATE users SET admin=1 WHERE name='@miusuario:dominio'" | sudo sqlite3 /var/lib/matrix-synapse/homeserver.db ]]>
Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/MediaWiki.raw.xml b/doc/manual/es/MediaWiki.raw.xml index 2ae71f0ef..61ecdc713 100644 --- a/doc/manual/es/MediaWiki.raw.xml +++ b/doc/manual/es/MediaWiki.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/MediaWiki102020-04-13 16:22:33fioddorSe alinea con la versión 14 en inglés del 12 de abril de 202092020-01-29 06:38:07fioddorSe alinea con la versión 13 en inglés del 24 de enero de 202082020-01-21 08:10:38fioddorSe alinea con la versión 11 en inglés del 21 de enero de 202072020-01-21 08:07:02fioddorSe alinea con la versión 10 en inglés del 18 de enero de 202062019-10-14 08:01:12fioddorEnlace a nueva página traducida.52019-10-11 00:38:07SunilMohanAdapaRemove formatting on link to MediaWiki page that is causing issues with PDF conversion42019-09-17 11:26:11fioddorMejora menor32019-09-17 11:24:09fioddorCorrección menor22019-09-17 11:22:32fioddorMejora menor12019-09-17 11:21:21fioddorSe crea la versión española.
Wiki (MediaWiki)
Acerca de MediaWikiMediaWiki es el software de base de la gama de wikis Wikimedia. Lee más acerca de MediaWiki en Wikipedia Disponible desde: versión 0.20.0
MediaWiki en FreedomBoxMediaWiki viene configurado en FreedomBox para ser públicamente legible y editable en privado. Sólo los usuarios ingresados pueden editar el wiki. Esta configuración evita publicidad indeseada (spam) y otros vandalismos en tu wiki.
Administración de UsuariosSolo el administrador de MediaWiki (usuario "admin") puede crear los usuarios. El usuario "admin" puede usarse también para restablecer contraseñas de usuarios MediaWiki. Si se olvida la contraseña del administrador se puede restablecer desde la página de MediaWiki del interfaz web de FreedomBox.
Casos de usoMediaWiki es muy versátil y se puede emplear para muchos usos creativos. También es áltamente adaptable y viene con un montón de extensiones (plugins) y estilos estéticos.
Repositorio Personal de ConocimientoEl MediaWiki de FreedomBox puede ser tu propio repositorio de conocimiento personal. Como MediaWiki tiene buen soporte multimedia puedes escribir notas, almacenar imágenes, crear listas de comprobación, guardar referencias y enlaces, etc. de manera organizada. Puedes almacenar el conocimiento de una vida en tu instancia de MediaWiki.
Wiki ComunitarioUna comunidad de usuarios podría usar MediaWiki como su repositorio común de conocimiento y material de referencia. Se puede emplear como un tablón de anunciós de universidad, como un servidor de documentación para una pequeña empresa, como un bloc de notas para grupos de estudio o como un wiki de fans al estilo de wikia.
Sitio Web Personal implementado mediante un WikiVarios sitios web de internet son sólo instancias de MediaWiki. El MediaWiki de FreedomBox es de solo lectura para visitantes. Se puede por tanto adaptar para servir como tu sitio web y/o blog personal. El contenido de MediaWiki es fácil de exportar y puede moverse después a otro motor de blogs.
Editar Contenido del WikiFreedomBox monta MediaWiki con un editor básico con una barra de herramientas con opciones de uso habitual como negrita, cursiva etc. Haz clic en la sección Avanzadas para acceder a más opciones como cabaceras, listas con viñetas, etc. mediawiki-toolbar.png
Editor VisualComo su nombre indica, el nuevo Editor Visual de MediaWiki ofrece un interfaz de usuario visual (WYSIWYG) para crear páginas del wiki. Pero esta funcionalidad está todavía en pruebas y MediaWiki no la trae de serie. Una solución temporal posible sería escribir tu contenido con el Editor Visual del borrador de Wikipedia, cambiar el modo de edición a texto y copiarlo a tu wiki.
Otros FormatosNo es imprescindible que aprendas el lenguaje de formateo de MediaWiki. Puedes escribir en tu formato favorito (Markdown, Org-mode, LaTeX etc.) y convertirlo al formato de MediaWiki usando Pandoc.
Cargar ImágenesSe puede habilitar la carga de imágenes desde FreedomBox versión 0.36.0. También puedes usar directamente imágenes de Wikimedia Commons mediante una funcionalidad llamada Instant Commons.
Personalización
Temas de estiloEl tema por defecto de MediaWiki suele ser Vector. El de FreedomBox es Timeless. Vector es un tema optimizado para visualizarlo en pantallas grandes pero no se adecúa bien a los tamaños de pantalla de los móviles. Wikimedia usa otro sitio específico para móviles. Para instalaciones pequeñas como las de FreedomBox no merece la pena un segundo sitio dedicado. Usar un tema de estilo más polivalente como Timeless es una solución más eficiente al problema. Los administradores pueden elegir el tema por defecto desde la configuración de la app. Los usuarios del sitio tienen también la opción de visualizarlo con temas diferentes. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/MediaWiki122020-05-30 19:38:23SunilMohanAdapaUpdate the title to emphasize app name over its generic name112020-05-24 07:15:06fioddorSe alinea con la versión 15 en inglés del 23 de mayo de 2020102020-04-13 16:22:33fioddorSe alinea con la versión 14 en inglés del 12 de abril de 202092020-01-29 06:38:07fioddorSe alinea con la versión 13 en inglés del 24 de enero de 202082020-01-21 08:10:38fioddorSe alinea con la versión 11 en inglés del 21 de enero de 202072020-01-21 08:07:02fioddorSe alinea con la versión 10 en inglés del 18 de enero de 202062019-10-14 08:01:12fioddorEnlace a nueva página traducida.52019-10-11 00:38:07SunilMohanAdapaRemove formatting on link to MediaWiki page that is causing issues with PDF conversion42019-09-17 11:26:11fioddorMejora menor32019-09-17 11:24:09fioddorCorrección menor22019-09-17 11:22:32fioddorMejora menor12019-09-17 11:21:21fioddorSe crea la versión española.
MediaWiki (Wiki)
Acerca de MediaWikiMediaWiki es el software de base de la gama de wikis Wikimedia. Lee más acerca de MediaWiki en Wikipedia Disponible desde: versión 0.20.0
MediaWiki en FreedomBoxMediaWiki viene configurado en FreedomBox para ser públicamente legible y editable en privado. Sólo los usuarios ingresados pueden editar el wiki. Esta configuración evita publicidad indeseada (spam) y otros vandalismos en tu wiki.
Administración de UsuariosSolo el administrador de MediaWiki (usuario "admin") puede crear los usuarios. El usuario "admin" puede usarse también para restablecer contraseñas de usuarios MediaWiki. Si se olvida la contraseña del administrador se puede restablecer desde la página de MediaWiki del interfaz web de FreedomBox.
Casos de usoMediaWiki es muy versátil y se puede emplear para muchos usos creativos. También es áltamente adaptable y viene con un montón de extensiones (plugins) y estilos estéticos.
Repositorio Personal de ConocimientoEl MediaWiki de FreedomBox puede ser tu propio repositorio de conocimiento personal. Como MediaWiki tiene buen soporte multimedia puedes escribir notas, almacenar imágenes, crear listas de comprobación, guardar referencias y enlaces, etc. de manera organizada. Puedes almacenar el conocimiento de una vida en tu instancia de MediaWiki.
Wiki ComunitarioUna comunidad de usuarios podría usar MediaWiki como su repositorio común de conocimiento y material de referencia. Se puede emplear como un tablón de anunciós de universidad, como un servidor de documentación para una pequeña empresa, como un bloc de notas para grupos de estudio o como un wiki de fans al estilo de wikia.
Sitio Web Personal implementado mediante un WikiVarios sitios web de internet son sólo instancias de MediaWiki. El MediaWiki de FreedomBox es de solo lectura para visitantes. Se puede por tanto adaptar para servir como tu sitio web y/o blog personal. El contenido de MediaWiki es fácil de exportar y puede moverse después a otro motor de blogs.
Editar Contenido del WikiFreedomBox monta MediaWiki con un editor básico con una barra de herramientas con opciones de uso habitual como negrita, cursiva etc. Haz clic en la sección Avanzadas para acceder a más opciones como cabaceras, listas con viñetas, etc. mediawiki-toolbar.png
Editor VisualComo su nombre indica, el nuevo Editor Visual de MediaWiki ofrece un interfaz de usuario visual (WYSIWYG) para crear páginas del wiki. Pero esta funcionalidad está todavía en pruebas y MediaWiki no la trae de serie. Una solución temporal posible sería escribir tu contenido con el Editor Visual del borrador de Wikipedia, cambiar el modo de edición a texto y copiarlo a tu wiki.
Otros FormatosNo es imprescindible que aprendas el lenguaje de formateo de MediaWiki. Puedes escribir en tu formato favorito (Markdown, Org-mode, LaTeX etc.) y convertirlo al formato de MediaWiki usando Pandoc.
Cargar ImágenesSe puede habilitar la carga de imágenes desde FreedomBox versión 0.36.0. También puedes usar directamente imágenes de Wikimedia Commons mediante una funcionalidad llamada Instant Commons.
Personalización
Temas de estiloEl tema por defecto de MediaWiki suele ser Vector. El de FreedomBox es Timeless. Vector es un tema optimizado para visualizarlo en pantallas grandes pero no se adecúa bien a los tamaños de pantalla de los móviles. Wikimedia usa otro sitio específico para móviles. Para instalaciones pequeñas como las de FreedomBox no merece la pena un segundo sitio dedicado. Usar un tema de estilo más polivalente como Timeless es una solución más eficiente al problema. Los administradores pueden elegir el tema por defecto desde la configuración de la app. Los usuarios del sitio tienen también la opción de visualizarlo con temas diferentes. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Minetest.raw.xml b/doc/manual/es/Minetest.raw.xml index 46e2257c0..60958d959 100644 --- a/doc/manual/es/Minetest.raw.xml +++ b/doc/manual/es/Minetest.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Minetest32020-05-10 00:36:41fioddorSe alinea con la versión 04 en inglés del 03 de mayo de 202022019-09-04 09:50:46fioddorCorrección menor12019-09-04 09:50:27fioddorSe crea la versión española.
Block Sandbox (Minetest)Minetest es un Block Sandbox multijugador para mundos infinitos. Este módulo permite ejecutar el servidor Minetest en esta FreedomBox, en su puerto por defecto (30000). Para conectar al servidor se necesita un cliente de Minetest.
Enrutado de PuertosSi tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos en tu router para los siguientes puertos de Minetest: UDP 30000 Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Minetest52020-05-30 19:38:57SunilMohanAdapaUpdate the title to emphasize app name over its generic name, match with FreedomBox interface42020-05-24 06:30:24fioddorSe alinea con la versión 05 en inglés del 23 de mayo de 202032020-05-10 00:36:41fioddorSe alinea con la versión 04 en inglés del 03 de mayo de 202022019-09-04 09:50:46fioddorCorrección menor12019-09-04 09:50:27fioddorSe crea la versión española.
Minetest (Sandbox de bloques)Minetest es un Block Sandbox multijugador para mundos infinitos. Este módulo permite ejecutar el servidor Minetest en esta FreedomBox, en su puerto por defecto (30000). Para conectar al servidor se necesita un cliente de Minetest.
Enrutado de PuertosSi tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos en tu router para los siguientes puertos de Minetest: UDP 30000 Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/MiniDLNA.raw.xml b/doc/manual/es/MiniDLNA.raw.xml index 2c7784071..b3923ffb7 100644 --- a/doc/manual/es/MiniDLNA.raw.xml +++ b/doc/manual/es/MiniDLNA.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/MiniDLNA12019-12-25 21:05:55fioddorSe traduce una página nueva
MiniDLNAMiniDLNA es un servidor multimedia que intenta ser compatible con clientes DLNA/UPnP.
¿Qué es UPnP/DLNA?UPnP (Universal plug & play) es un conjunto de protocolos de red que permite a los dispositivos de una red, como PCs, TVs, impresoras etc, reconocerse entre sí y establecer comunicación para compartir datos. Es un protocolo con cero configuración y require solo un servidor multimedia y un reproductor multimedia compatibles con el protocolo. DLNA se deriva de UPnP como una forma de estandarizar interoperabilidad entre medios. Conforma un estándar/certificación que cumplen muchos dispositivos electrónicos de consumo.
Desplegando MiniDLNA en tu FreedomBox.Para instalar/habilitar el servidor multimedia necesitas navegar a la página MiniDLNA y habilitarlo. Se intenta que la aplicación esté disponible en la red interna y por ello requiere asignarle un interfaz de red configurado para tráfico interno. Tras la instalación queda disponible una página web en . Incluye información de cuántos ficheros detecta el servidor, cuántas conexiones existen etc. Esto resulta muy útil cuando conectas discos externos con contenido para para verificar que detecta los nuevos archivos como debe. Si no ocurre así, desconectar y activar el servidor lo arreglará.
Sistemas de archivo para discos externos.Al usar un disco externo que se usa también desde sistemas Windows el mejor formato para el sistema de archivos es NTFS. NTFS conservará los permisos de acceso de Linux y la codificación UTF-8 para los nombres de fichero. Esto es útil si los nombres de archivos tienen tildes, eñes u otros signos raros.
Enlaces externos (en) Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/MiniDLNA62020-05-30 19:39:39SunilMohanAdapaUpdate the title to emphasize app name over its generic name, match with FreedomBox interface52020-05-28 20:42:49fioddorSe alinea con la versión 07 en inglés del 27 de mayo de 202042020-05-26 13:29:06fioddorMejora menor. Algo más claro.32020-05-26 13:26:16fioddorSe alinea con la versión 04 en inglés del 26 de mayo de 202022020-05-24 06:59:45fioddorSe alinea con la versión 03 en inglés del 23 de mayo de 202012019-12-25 21:05:55fioddorSe traduce una página nueva
MiniDLNA (Servidor multimedia básico)MiniDLNA es un servidor multimedia que intenta ser compatible con clientes DLNA/UPnP. Nota: Este servicio solo está disponible en redes configuradas como zona "interna". Tampoco está disponble a través de OpenVPN (es incompatible).
¿Qué es UPnP/DLNA?UPnP (Universal plug & play) es un conjunto de protocolos de red que permite a los dispositivos de una red, como PCs, TVs, impresoras etc, reconocerse entre sí y establecer comunicación para compartir datos. Es un protocolo con cero configuración y require solo un servidor multimedia y un reproductor multimedia compatibles con el protocolo. DLNA se deriva de UPnP como una forma de estandarizar interoperabilidad entre medios. Conforma un estándar/certificación que cumplen muchos dispositivos electrónicos de consumo.
Desplegando MiniDLNA en tu FreedomBox.Para instalar/habilitar el servidor multimedia necesitas navegar a la página MiniDLNA y habilitarlo. Se intenta que la aplicación esté disponible en la red interna y por ello requiere asignarle un interfaz de red configurado para tráfico interno. Tras la instalación queda disponible una página web en . Incluye información de cuántos ficheros detecta el servidor, cuántas conexiones existen etc. Esto resulta muy útil cuando conectas discos externos con contenido para para verificar que detecta los nuevos archivos como debe. Si no ocurre así, desconectar y activar el servidor lo arreglará.
Usar MiniDLNA para reproducir contenidos multimedia en tus dispositivosCualquier dispositivo compatible con DLNA debiera ser capaz de detectar, hojear y reproducir automáticamente contenido multimedia de MiniDLNA en FreedomBox. Los siguientes dispositivos y reproductores se han probado: GNOME Videos: Videos es el reproductor multimedia por defecto en el popular entorno de escritorio GNU/Linux GNOME. Abre Videos, cambia a 'Canales'. Deberías ver un canal denominado 'freedombox: minidlna'. Deberías poder hojear y reproducir su contenido. VLC media player: VLC es un reproductor multimedia para GNU/Linux, Android, Windows y macOS muy popular. Abre VLC y haz clic en 'Ver -> Lista de reproducción'. En la barra lateral de la lista de reproducción que aparece selecciona 'Universal Plug'n'Play'. Deberías ver un elemento denominado 'freedombox: minidlna'. Deberías poder hojear y reproducir su contenido. Kodi: Kodi es un software popular de centro multimedia con un interfaz de usuario diseñado para televisores. Abre Kodi, ve a 'Sistema -> Configuración del Servicio -> UPnP/DLNA' y 'Habilitar soporte UPnP'. Visita entonces 'Home -> Videos -> Archivos -> Añadir videos... -> Navegar -> dispositivos UPnP'. Deberías ver 'freedombox: minidlna'. Selecciónalo y elige 'OK'. Entonces, elige 'OK en el diálogo 'Anadir entrada de video'. A partir de ahora , deberías ver 'freedombox: minidlna' en la sección 'Videos -> Archivos'. Deberías poder hojear y reproducir su contenido. Para más información mira la documentación de Kodi. Roku: Roku es un aparato conectado a una TV para reproducir contenido de servicios de retransmisión por Internet. También hay muchas TVs que llevan a Roku integrado. Encuentra en el interfaz de Roku un canal denominado 'Roku Media Player' y ábrelo. Deberías ver un elemento denominado 'freedombox: minidlna'. Deberías poder hojear y reproducir su contenido. Rhythmbox: Rhythmbox es el reproductor de sonido por defecto en el popular entorno de escritorio GNU/Linux GNOME. Abre Rhythmbox y asegura que el panel lateral esté abierto pulsando en 'Menú de Aplicación -> Ver -> Panel Lateral'. En el panel lateral deberías ver 'freedombox:minidlna' bajo la sección 'Compartidos'. Deberías poder hojear y reproducir sus archivos de sonido. Los archivos de video no aparecerán.
Formatos multimedia soportadosMiniDLNA soporta una amplia variedad de formatos de archivo de video y sonido. Video: Archivos terminados en .avi, .mp4, .mkv, .mpg, .mpeg, .wmv, .m4v, .flv, .mov, .3gp, etc. Sonido: Archivos terminados en .mp3, .ogg, .flac, .wav, .pcm, .wma, .fla, .aac, etc. Imágen: Archivos terminados en .jpg, .jpeg Listas de Reproducción: Archivos terminados enh .m3u, .pls Subtítulos: Archivos terminados en .srt, .smi Obsérvese que no soporta archivos con las siguientes extensiones. Parece que renombrar el archivo a una extensión reconocida funciona el la mayoría de casos. Video: Archivos terminados en .webm Además del soporte al formato de archivo por parte de MiniDLNA, tu dispositivo o reproductor de medios necesita soportar el codec de sonido/video con el que se haya codificado tu contenido. MiniDLNA carece de la habilidad de traducir archivos a un codec compatible con el reproductor. Si te topas con problemas en la reproducción de contenido, usa VLC para identificar el codec empleado en el contenido y comprueba en la documentación de tu dispositivo o reproductor de medios si lo soporta.
Sistemas de archivo para discos externos.Al usar un disco externo que se usa también desde sistemas Windows el mejor formato para el sistema de archivos es NTFS. NTFS conservará los permisos de acceso de Linux y la codificación UTF-8 para los nombres de fichero. Esto es útil si los nombres de archivos tienen tildes, eñes u otros signos raros.
Enlaces externos (en) Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Monkeysphere.raw.xml b/doc/manual/es/Monkeysphere.raw.xml index 683787221..5cb7ae395 100644 --- a/doc/manual/es/Monkeysphere.raw.xml +++ b/doc/manual/es/Monkeysphere.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Monkeysphere22020-04-04 17:28:08fioddorCorrección.12019-08-23 10:48:17fioddorSe crea la versión española.
MonkeysphereCon Monkeysphere se puede generar una clave OpenPGP para cada dominio configurado para servir SSH. La clave pública OpenPGP se puede subir entonces a los servidores de claves OpenPGP. Los usuarios que se conecten mediante SSH podrán verificar que se están conectando a la máquina correcta. Para que los usuarios puedan confiar en la clave alguien (generalmente el dueño de la máquina) tiene que firmarla siguiendo el proceso normal de firmado de claves OpenPGP. Para más detalles, ver la documentación de Monkeysphere SSH. Monkeysphere también puede generar una clave OpenPGP para cada certificado de servidor web seguro (HTTPS) instalado en esta máquina. La clave pública OpenPGP se puede subir entonces a los servidores de claves OpenPGP. Los usuarios que se conecten mediante HTTPS podrán verificar que se están conectando a la máquina correcta. Para validar el certificado el usuario deberá instalar cierto software disponible en el sitio web de Monkeysphere. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Monkeysphere22020-04-04 17:28:08fioddorCorrección.12019-08-23 10:48:17fioddorSe crea la versión española.
MonkeysphereCon Monkeysphere se puede generar una clave OpenPGP para cada dominio configurado para servir SSH. La clave pública OpenPGP se puede subir entonces a los servidores de claves OpenPGP. Los usuarios que se conecten mediante SSH podrán verificar que se están conectando a la máquina correcta. Para que los usuarios puedan confiar en la clave alguien (generalmente el dueño de la máquina) tiene que firmarla siguiendo el proceso normal de firmado de claves OpenPGP. Para más detalles, ver la documentación de Monkeysphere SSH. Monkeysphere también puede generar una clave OpenPGP para cada certificado de servidor web seguro (HTTPS) instalado en esta máquina. La clave pública OpenPGP se puede subir entonces a los servidores de claves OpenPGP. Los usuarios que se conecten mediante HTTPS podrán verificar que se están conectando a la máquina correcta. Para validar el certificado el usuario deberá instalar cierto software disponible en el sitio web de Monkeysphere. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Mumble.raw.xml b/doc/manual/es/Mumble.raw.xml index 27666e5d0..5516983d8 100644 --- a/doc/manual/es/Mumble.raw.xml +++ b/doc/manual/es/Mumble.raw.xml @@ -1,2 +1,2 @@ -
es/FreedomBox/Manual/Mumble32019-11-14 16:30:35fioddorCorrecciones menores22019-11-14 16:29:09fioddorSe alinea con la versión 09 del 07 de noviembre de 201912019-09-16 10:58:59fioddorSe crea la versión española.
Conversaciones de Voz (Mumble)
¿Qué es Mumble?Mumble es un software de conversaciones de voz. Principalmente diseñado para uso con juegos multijugador por red, sirve para hablar con alta calidad de audio, cancelación de ruido, comunicación cifrada, autenticación de interlocutores por defecto mediante par de claves pública/privada, y "asistentes" para configurar tu micrófono, por ejemplo. Se puede marcar a un usuario dentro de un canal como "interlocutor prioritario".
Usar MumbleFreedomBox incluye el servidor Mumble. Para conectar con el servidor los usuarios pueden descargar algún cliente de entre los disponibles para plataformas de escritorio y móviles.
Redirección de PuertosSi tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos de tu router. Deberías redirigir los siguientes puertos para Mumble: TCP 64738 UDP 64738
Administrar PermisosEn Mumble un supeusuario puede crear cuentas de administrador que a su vez pueden administrar permisos a grupos y canales. Esto se puede hacer tras ingresar con el usuario "SuperUser" y la contraseña de superusuario. Ver la Guía de Mumble para obtener información respecto a cómo hacer esto. Actualmente FreedomBox no ofrece una interfaz gráfica para obtener o establecer la contraseña de superusuario en Mumble. Se genera una contraseña de superusuario automáticamente durante la instalación de Mumble. Para obtenerla ingresa en el terminal como admin usando Cockpit , la Shell Segura o la consola. Y ejecuta el siguiente comando: Deberás ver una salida como esta: 2019-11-06 02:47:41.313 1 => Password for 'SuperUser' set to 'noo8Dahwiesh']]>O puedes establecer una contraseña nueva así: Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Mumble52020-05-30 19:41:05SunilMohanAdapaUpdate the title to emphasize app name over its generic name, match with FreedomBox interface42020-05-24 07:11:26fioddorSe alinea con la versión 10 en inglés del 23 de mayo de 202032019-11-14 16:30:35fioddorCorrecciones menores22019-11-14 16:29:09fioddorSe alinea con la versión 09 del 07 de noviembre de 201912019-09-16 10:58:59fioddorSe crea la versión española.
Mumble (Chat de voz)
¿Qué es Mumble?Mumble es un software de conversaciones de voz. Principalmente diseñado para uso con juegos multijugador por red, sirve para hablar con alta calidad de audio, cancelación de ruido, comunicación cifrada, autenticación de interlocutores por defecto mediante par de claves pública/privada, y "asistentes" para configurar tu micrófono, por ejemplo. Se puede marcar a un usuario dentro de un canal como "interlocutor prioritario".
Usar MumbleFreedomBox incluye el servidor Mumble. Para conectar con el servidor los usuarios pueden descargar algún cliente de entre los disponibles para plataformas de escritorio y móviles.
Redirección de PuertosSi tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos de tu router. Deberías redirigir los siguientes puertos para Mumble: TCP 64738 UDP 64738
Administrar PermisosEn Mumble un supeusuario puede crear cuentas de administrador que a su vez pueden administrar permisos a grupos y canales. Esto se puede hacer tras ingresar con el usuario "SuperUser" y la contraseña de superusuario. Ver la Guía de Mumble para obtener información respecto a cómo hacer esto. Actualmente FreedomBox no ofrece una interfaz gráfica para obtener o establecer la contraseña de superusuario en Mumble. Se genera una contraseña de superusuario automáticamente durante la instalación de Mumble. Para obtenerla ingresa en el terminal como admin usando Cockpit , la Shell Segura o la consola. Y ejecuta el siguiente comando: Deberás ver una salida como esta: 2019-11-06 02:47:41.313 1 => Password for 'SuperUser' set to 'noo8Dahwiesh']]>O puedes establecer una contraseña nueva así: Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/NameServices.raw.xml b/doc/manual/es/NameServices.raw.xml index 83941f704..210a1859a 100644 --- a/doc/manual/es/NameServices.raw.xml +++ b/doc/manual/es/NameServices.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/NameServices22019-11-14 18:09:00fioddorSe alinea con la versión 04 en inglés del 11 de noviembre de 201912019-06-20 15:23:22fioddorSe crea la versión española.
Servicios de NombreLos Servicios de Nombre proporcionan una vista general a las formas de acceder desde la Internet pública a tu !Freedombox: nombre de dominio, servicio Tor Onion y cometa (Pagekite). Para cada tipo de nombre se indica si los servicios HTTP, HTTPS, y SSH están habilitados o deshabilitados para conexiones entrantes. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/NameServices22019-11-14 18:09:00fioddorSe alinea con la versión 04 en inglés del 11 de noviembre de 201912019-06-20 15:23:22fioddorSe crea la versión española.
Servicios de NombreLos Servicios de Nombre proporcionan una vista general a las formas de acceder desde la Internet pública a tu !Freedombox: nombre de dominio, servicio Tor Onion y cometa (Pagekite). Para cada tipo de nombre se indica si los servicios HTTP, HTTPS, y SSH están habilitados o deshabilitados para conexiones entrantes. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Networks.raw.xml b/doc/manual/es/Networks.raw.xml index 0ae282832..afa04e8b2 100644 --- a/doc/manual/es/Networks.raw.xml +++ b/doc/manual/es/Networks.raw.xml @@ -1,5 +1,5 @@ -
es/FreedomBox/Manual/Networks162020-04-13 16:23:26fioddorSe alinea con la versión 10 en inglés del 12 de abril de 2020152020-04-04 17:43:48fioddorCorrección menor142020-04-04 17:41:35fioddorCorrección menor132020-04-04 17:40:01fioddorCorrección menor122020-04-04 17:33:37fioddorCorrección.112019-08-28 07:38:21fioddorCorrección menor102019-08-28 07:34:37fioddorCorrección menor92019-08-28 07:32:06fioddorCorrección menor82019-08-28 07:31:14fioddorSe incorpora la traducción de una sección nueva.72019-08-28 07:12:51fioddorSe incorpora la traducción de una sección nueva.62019-08-27 13:09:22fioddorCorrección menor52019-08-27 13:06:19fioddorSe incorpora la traducción de una sección nueva.42019-08-27 12:27:43fioddorSe incorpora la traducción de una sección nueva.32019-08-23 13:02:33fioddorSe incorpora la traducción de una sección nueva.22019-08-23 12:32:31fioddorSe incorpora la traducción de una sección nueva.12019-08-23 11:53:13fioddorSe crea la versión española (traducción incompleta).
RedesEsta sección describe como se configura por defecto la red en FreedomBox y como se puede adaptar. Ver también la sección Cortafuegos para más información acerca de cómo funciona éste.
Configuración por defectoEn una imágen fresca de FreedomBox la red no está configurada. La configuración se realiza cuando la imágen se graba en una tarjeta SD y el dispositivo arranca. Durante el primer arranque el paquete FreedomBox setup detecta los interfaces (tarjetas) de red e intenta configurarlos automáticamente de modo que la FreedomBox quede disponible para seguir configurandola a través del interfaz web desde otra máquina, sin necesidad de conectar un monitor a la FreedomBox. La configuración automática también procura dejar la FreedomBox operativa para sus escenarios de uso más importantes. Trata 2 escenarios: cuando hay 1 único interfaz (tarjeta) ethernet cuando hay múltiples interfaces (tarjetas) ethernet
interfaz (tarjeta) ethernet únicoCuando el dispositivo hardware solo tiene 1 único interfaz (tarjeta) ethernet hay poco margen para que haga de router. En tal caso se asume que el dispositivo es solo una máquina más en la red. En consecuencia el único interfaz (tarjeta) disponible se configura para ser un interfaz interno en modo de configuración automática. Esto significa que se conecta a Internet empleando la configuración provista por un router de la red y que hace todos sus servicios (internos y externos) accesibles a todos los clientes que haya en esta red. network_single.png
Múltiples interfaces (tarjetas) ethernetCuando el dispositivo hardware tiene múltiples interfaces (tarjetas) ethernet el dispositivo puede actuar como router. Entonces los interfaces se configuran para ejecutar esta función. El primer interfaz (tarjeta) de red se configura para ser una WAN o interfaz externo en modo de configuración automático. Esto significa que se conecta a Internet empleando la configuración provista por el proveedor de servicio de internet (ISP). En este interfaz solo se expondrán los servicios concebidos para consumo desde Internet (servicios externos). Tu conexión a Internet tiene que llegar por el puerto de este interfaz (tarjeta) ethernet. Si quieres que tu router de siempre siga administrando tu conexión por tí conecta un cable desde tu router al puerto de este interfaz. Los demás interfaces de red se configuran como clientes de router, como LAN o interfaces internos en modo de configuración compartido. Esto significa que todos sus servicios (internos y externos) se exponen a todos los clientes que entren desde esta red. Compartido implica además que los clientes podrán recibir detalles para conexión automática a la red. En concreto, la configuración DHCP y los servidores DNS se exponen en este interfaz. La conexión a Internet disponible para el dispositivo a través del primer interfaz se compartirá con los clientes que usen este interfaz. Todo esto implica que puedes conectar tus ordenadores a esta interfaz (tarjeta) de red y se configurarán automáticamente pudiendo acceder a Internet a través de tu FreedomBox. Aunque el proceso de asignación es determinista actualmente no está muy claro qué interfaz será WAN (los demás serán LAN). Así que averiguar cual es cual conllevará un poco de prueba y error. En el futuro esto estará bien documentado para cada dispositivo.
Configuración de la Wi-FiTodos los interfaces Wi-Fi se configuran para ser LAN o interfaces internos en modo de configuración compartido. También se configuran para ser puntos de acceso Wi-Fi con los siguientes datos: El nombre de cada punto de acceso será FreedomBox más el nombre del interfaz (para tratar el caso de que haya varios). La contraseña para conectar a los interfaces será freedombox123.
Compartición de la Conexión a InternetAunque la principal obligación de FreedomBox es proporcionar servicios descentralizados también puede ejercer como router casero. Por tanto en la mayoría de los casos FreedomBox se conecta a Internet y proporciona a otras máquinas de la red la posibilidad de usar esa conexión a Internet. FreedomBox puede hacer esto de 2 formas: usando un modo de conexión compartido o empleando una conexión interna. Cuando se configura un interfaz en modo compartido puedes conectarle tu máquina directamente, sea por cable desde este interfaz a tu máquina o conectando a través del punto de acceso Wi-Fi. Este caso es el más facil de usar porque FreedomBox automáticamente proporciona a tu máquina la configuración de red necesaria. Tu máquina conectará automáticamente a la red proporcionada por FreedomBox y podrá conectar a Internet ya que FreedomBox puede a su vez conectarse a Internet. En ocasiones la configuración anterior podría no ser posible porque el dispositivo hardware tenga un único interfaz de red o por otros motivos. Incluso en este caso tu máquina puede todavía conectarse a Internet a través de la FreedomBox. Para que esto funcione asegúrate de que el interfaz de red al que se está conectando tu máquina esté en modo interno. Entonces conecta tu máquina a la red en la que está la FreedomBox. Después de esto configura la red de tu máquina indicando como puerta de enlace la dirección IP de la FreedomBox. FreedomBox aceptará entonces el tráfico de red de tu maquina y lo enviará a Internet. Esto funciona porque los interfaces de red en modo interno están configurados para enmascarar hacia Internet los paquetes que lleguen desde máquinas locales, así como para recibir paquetes desde Internet y reenviarlos hacia las máquinas locales.
AdaptacionesLa configuración por defecto anterior podría no servir para tu caso. Puedes adecuar la configuración para ajustarla a tus necesidades desde el área Redes de la sección Configuración del interfaz web de tu FreedomBox.
Conexiones PPPoESi tu ISP no proporciona configuración de red automática via DHCP y te obliga a conectar por PPPoE, para configurarlo elimina toda conexión de red existente en el interfaz y añade una de tipo PPPoE. Aquí, si procede, indica el usuario y la contraseña que te ha dado tu ISP y activa la conexión.
Conectar a Internet mdiante Wi-FiPor defecto durante el primer arranque los dispositivos Wi-Fi se configurarán como puntos de acceso. Sin embargo se pueden reconfigurar como dispositivos Wi-Fi normales para conectar a la red local o a un router WiFi existente. Para hacer esto haz clic en la conexión Wi-Fi para editarla. Cambia el modo a Infraestructura en vez de Punto de Acceso y Método de direccionamiento IPv4 a Automático (DHCP) en vez de Modo compartido. SSID proporcionado significa el nombre de la red Wi-Fi a la que quieres conectar. Rellena la frase clave.
Problemas con la Funcionalidad de PrivacidadEl gestor de red que emplea FreedomBox para conectar con las redes Wi-Fi tienen una funcionalidad de privacidad que usa una identidad para buscar redes diferente de la que emplea para conectar con el punto de acceso Wi-Fi. Desafortunadamente esto causa problemas con algunos routers que rechazan estas conexiones. Tu conexión no se activará con éxito y se desconectará. Si tienes control sobre el comportamiento del router puedes desactivar esta funcionalidad. Si no la solución es desactivar la funcionalidad de privacidad: Entra a la FreedomBox por SSH o Cockpit. Edita el fichero /etc/NetworkManager/NetworkManager.conf: Añade la linea wifi.scan-rand-mac-address=no en la sección [device]: Luego reinicia la FreedomBox.
Añadir un nuevo dispositivo de redAl añadir un nuevo dispositivo de red network manager lo configurará automáticamente. En la mayoría de los casos esto no funcionará. Borra la configuración creada automáticamente en el interfaz y crea una conexión de red nueva. Selecciona tu interfaz recién creado en la página "añadir conexión". Configura la zona del cortafuegos como corresponda. Puedes configurar los interfaces para conectar a la red o proporcionar configuración de red a cualquier máquina que se le conecte. De modo similar, si es un interfaz Wi-Fi puedes configurarlo para ser un punto de acceso Wi-FI o para conectarse a puntos de acceso existentes en la red.
Configurar una red MeshFreedomBox tiene un soporte rudimentario para participar en redes mesh basadas en BATMAN-Adv. Es posible unirse a una red existe en tu zona o crear una red mesh nueva y compartir tu conexión a Internet con el resto de nodos que se unan a tu red. Tanto para unirte a una red mesh como para crear otra, actualmente hay que crear 2 conexiones y activarlas manualmente.
Unirse a una red MeshPara unirse a una red mesh existente en tu zona primero consulta a sus organizadores y obtén información acerca de la red. Crea una conexión nueva y selecciona el tipo de conexión Wi-Fi. En el siguiente diálogo rellena los valores como se indica: Nombre del campoValor de ejemploExplicación Nombre de la Conexión Mesh Join - BATMAN El nombre tiene que acabar en BATMAN (con mayúsculas). Interfaz físico wlan0 El dispositivo Wi-Fi que quieres usar para conectar a la red mesh. Zona del cortafuegos Externa Ya que no quieres que los participantes en la red mesh usen dispositivos internos de tu FreedomBox. SSID ch1.freifunk.net Tal como te lo hayan dado los operadores de la red mesh. Esta red debería mostrarse en Redes Wi-Fi accesibles. Modo Ad-hoc Porque esta red es una red de pares (peer-to-peer). Banda de Frecuencia 2.4Ghz Tal como te lo hayan dado los operadores de la red mesh. Canal 1 Tal como te lo hayan dado los operadores de la red mesh. BSSID 12:CA:FF:EE:BA:BE Tal como te lo hayan dado los operadores de la red mesh. Autenticación Abierta Déjala abierta salvo que sepas que tu red mesh necesite otro valor. Contraseña Déjala en blanco salvo que sepas el valor que necesite tu red mesh. Método de direccionamiento IPv4 Deshabilitado Todavía no queremos pedir una configuración IP. Graba la conexión y únete a la red mesh activándola. Crea una segunda conexión nueva y selecciona el tipo Genérica. En el siguiente diálogo rellena los valores como se indica: Nombre del campoValor de ejemploExplicación Nombre de la Conexión Mesh Connect Cualquier nombre para identificar ésta conexión. Interfaz físico bat0 Este interfaz solo aparecerá tras activar con éxito la conexión del paso anterior. Zona del cortafuegos Externa Ya que no quieres que los participantes en la red mesh usen dispositivos internos de tu FreedomBox. Método de direccionamiento IPv4 Auto Generalmente las redes mesh tienen un servidor DHCP en algún sitio que le proporciona una configuración IP a tu máquina. Si no, consulta al operador y configura la dirección IP como te diga por el método manual. Graba la conexión. Configura tu maquina para participar en la red activando esta conexión. Actualmente hay que activarla manualmente cada vez que quieras unirte a la red. En el futuro FreedomBox lo hará automáticamente. Ahora debieras poder llegar a otros nodos de la red. También podrás conectar a Internet a través de la red mesh si los operadores han instalado algúna puerta de enlace.
Crear una red MeshPara crear tu propia red mesh y compartir tu conexión a Internet con el resto de los nodos de la red: Sigue las instrucciones del paso 1 de Unirse a una red Mesh empleando los valores válidos para tu red en SSID (un nombre para tu red Mesh), Banda de Frecuencia (generalmente 2.4Ghz), Canal (entre 1 y 11 para la banda de 2.4Ghz) y BSSID (una secuencia hexadecimal como 12:CA:DE:AD:BE:EF). Crea esta conexión y actívala. Sigue las instrucciones del paso 2 de Unirse a una red Mesh seleccionando Compartido para Método de direccionamiento IPv4d. Esto proporcionará automáticamente una configuración IP a otros nodos de la red y compartirá la conexión a Internet de tu maquina (ya sea mediante un segudo interfaz Wi-Fi, Ethernet, etc.) con el otros nodos de la red mesh. Corre la voz entre tus vecinos acerca de tu red mesh y pásales los parámetros que has empleado al crearla. Cuando otros nodos se conecten a esta red mesh tendrán que seguir las instrucciones del paso 1 de Unirse a una red Mesh empleando en SSID, Banda de Frecuencia y Canal los valores que has elegido para tu red mesh al crearla.
Operación de Red ManualFreedomBox configura redes automáticamente por defecto y proporciona un interfaz simplificado para personalizar la configuración a necesidades específicas. En la mayoría de los casos la operación manual no es necesaria. Los siguientes pasos describen cómo operar la configuración de red a mano en caso de que el interfaz de FreedomBox le resulte insuficiente a un usuario para realizar una tarea o para diagnosticar un problema que FreedomBox no identifique. En el interfaz de línea de comandos: Para acceder a un interfaz de configuración de conexiones de red basado en texto: Para ver la lista de dispositivos de red disponibles: Para ver la lista de conexiones configuradas: Para ver el estado actual de una conexión: ']]>Para ver la zona asignada actualmente en el cortafuegos a un interfaz de red: ' | grep zone]]>o
es/FreedomBox/Manual/Networks192020-06-01 23:34:30JamesValleroyadd TableOfContents182020-05-24 09:05:35fioddorCorrecciones menores172020-05-24 08:36:30fioddorSe alinea con la versión 12 en inglés del 24 de mayo de 2020162020-04-13 16:23:26fioddorSe alinea con la versión 10 en inglés del 12 de abril de 2020152020-04-04 17:43:48fioddorCorrección menor142020-04-04 17:41:35fioddorCorrección menor132020-04-04 17:40:01fioddorCorrección menor122020-04-04 17:33:37fioddorCorrección.112019-08-28 07:38:21fioddorCorrección menor102019-08-28 07:34:37fioddorCorrección menor92019-08-28 07:32:06fioddorCorrección menor82019-08-28 07:31:14fioddorSe incorpora la traducción de una sección nueva.72019-08-28 07:12:51fioddorSe incorpora la traducción de una sección nueva.62019-08-27 13:09:22fioddorCorrección menor52019-08-27 13:06:19fioddorSe incorpora la traducción de una sección nueva.42019-08-27 12:27:43fioddorSe incorpora la traducción de una sección nueva.32019-08-23 13:02:33fioddorSe incorpora la traducción de una sección nueva.22019-08-23 12:32:31fioddorSe incorpora la traducción de una sección nueva.12019-08-23 11:53:13fioddorSe crea la versión española (traducción incompleta).
RedesEsta sección describe como se configura por defecto la red en FreedomBox y como se puede adaptar. Ver también la sección Cortafuegos para más información acerca de cómo funciona éste.
Configuración por defectoEn una imágen fresca de FreedomBox la red no está configurada. La configuración se realiza cuando la imágen se graba en una tarjeta SD y el dispositivo arranca. Durante el primer arranque el paquete FreedomBox setup detecta los interfaces (tarjetas) de red e intenta configurarlos automáticamente de modo que la FreedomBox quede disponible para seguir configurandola a través del interfaz web desde otra máquina, sin necesidad de conectar un monitor a la FreedomBox. La configuración automática también procura dejar la FreedomBox operativa para sus escenarios de uso más importantes. Trata 2 escenarios: cuando hay 1 único interfaz (tarjeta) ethernet cuando hay múltiples interfaces (tarjetas) ethernet
Interfaz (tarjeta) ethernet únicoCuando el dispositivo hardware solo tiene 1 único interfaz (tarjeta) ethernet hay poco margen para que haga de router. En tal caso se asume que el dispositivo es solo una máquina más en la red. En consecuencia el único interfaz (tarjeta) disponible se configura para ser un interfaz interno en modo de configuración automática. Esto significa que se conecta a Internet empleando la configuración provista por un router de la red y que hace todos sus servicios (internos y externos) accesibles a todos los clientes que haya en esta red. network_single.png
Múltiples interfaces (tarjetas) ethernetCuando el dispositivo hardware tiene múltiples interfaces (tarjetas) ethernet el dispositivo puede actuar como router. Entonces los interfaces se configuran para ejecutar esta función. El primer interfaz (tarjeta) de red se configura para ser una WAN o interfaz externo en modo de configuración automático. Esto significa que se conecta a Internet empleando la configuración provista por el proveedor de servicio de internet (ISP). En este interfaz solo se expondrán los servicios concebidos para consumo desde Internet (servicios externos). Tu conexión a Internet tiene que llegar por el puerto de este interfaz (tarjeta) ethernet. Si quieres que tu router de siempre siga administrando tu conexión por tí conecta un cable desde tu router al puerto de este interfaz. Los demás interfaces de red se configuran como clientes de router, como LAN o interfaces internos en modo de configuración compartido. Esto significa que todos sus servicios (internos y externos) se exponen a todos los clientes que entren desde esta red. Compartido implica además que los clientes podrán recibir detalles para conexión automática a la red. En concreto, la configuración DHCP y los servidores DNS se exponen en este interfaz. La conexión a Internet disponible para el dispositivo a través del primer interfaz se compartirá con los clientes que usen este interfaz. Todo esto implica que puedes conectar tus ordenadores a esta interfaz (tarjeta) de red y se configurarán automáticamente pudiendo acceder a Internet a través de tu FreedomBox. Aunque el proceso de asignación es determinista actualmente no está muy claro qué interfaz será WAN (los demás serán LAN). Así que averiguar cual es cual conllevará un poco de prueba y error. En el futuro esto estará bien documentado para cada dispositivo.
Configuración de la Wi-FiTodos los interfaces Wi-Fi se configuran para ser LAN o interfaces internos en modo de configuración compartido. También se configuran para ser puntos de acceso Wi-Fi con los siguientes datos: El nombre de cada punto de acceso será FreedomBox más el nombre del interfaz (para tratar el caso de que haya varios). La contraseña para conectar a los interfaces será freedombox123.
Compartición de la Conexión a InternetAunque la principal obligación de FreedomBox es proporcionar servicios descentralizados también puede ejercer como router casero. Por tanto en la mayoría de los casos FreedomBox se conecta a Internet y proporciona a otras máquinas de la red la posibilidad de usar esa conexión a Internet. FreedomBox puede hacer esto de 2 formas: usando un modo de conexión compartido o empleando una conexión interna. Cuando se configura un interfaz en modo compartido puedes conectarle tu máquina directamente, sea por cable desde este interfaz a tu máquina o conectando a través del punto de acceso Wi-Fi. Este caso es el más facil de usar porque FreedomBox automáticamente proporciona a tu máquina la configuración de red necesaria. Tu máquina conectará automáticamente a la red proporcionada por FreedomBox y podrá conectar a Internet ya que FreedomBox puede a su vez conectarse a Internet. En ocasiones la configuración anterior podría no ser posible porque el dispositivo hardware tenga un único interfaz de red o por otros motivos. Incluso en este caso tu máquina puede todavía conectarse a Internet a través de la FreedomBox. Para que esto funcione asegúrate de que el interfaz de red al que se está conectando tu máquina esté en modo interno. Entonces conecta tu máquina a la red en la que está la FreedomBox. Después de esto configura la red de tu máquina indicando como puerta de enlace la dirección IP de la FreedomBox. FreedomBox aceptará entonces el tráfico de red de tu maquina y lo enviará a Internet. Esto funciona porque los interfaces de red en modo interno están configurados para enmascarar hacia Internet los paquetes que lleguen desde máquinas locales, así como para recibir paquetes desde Internet y reenviarlos hacia las máquinas locales.
AdaptacionesLa configuración por defecto anterior podría no servir para tu caso. Puedes adecuar la configuración para ajustarla a tus necesidades desde el área Redes de la sección Configuración del interfaz web de tu FreedomBox.
Conexiones PPPoESi tu ISP no proporciona configuración de red automática via DHCP y te obliga a conectar por PPPoE, para configurarlo elimina toda conexión de red existente en el interfaz y añade una de tipo PPPoE. Aquí, si procede, indica el usuario y la contraseña que te ha dado tu ISP y activa la conexión.
Conectar a Internet mediante Wi-FiPor defecto durante el primer arranque los dispositivos Wi-Fi se configurarán como puntos de acceso. Sin embargo se pueden reconfigurar como dispositivos Wi-Fi normales para conectar a la red local o a un router WiFi existente. Para hacer esto haz clic en la conexión Wi-Fi para editarla. Cambia el modo a Infraestructura en vez de Punto de Acceso y Método de direccionamiento IPv4 a Automático (DHCP) en vez de Modo compartido. SSID proporcionado significa el nombre de la red Wi-Fi a la que quieres conectar. Rellena la frase clave.
Problemas con la Funcionalidad de PrivacidadEl gestor de red que emplea FreedomBox para conectar con las redes Wi-Fi tienen una funcionalidad de privacidad que usa una identidad para buscar redes diferente de la que emplea para conectar con el punto de acceso Wi-Fi. Desafortunadamente esto causa problemas con algunos routers que rechazan estas conexiones. Tu conexión no se activará con éxito y se desconectará. Si tienes control sobre el comportamiento del router puedes desactivar esta funcionalidad. Si no la solución es desactivar la funcionalidad de privacidad: Entra a la FreedomBox por SSH o Cockpit. Edita el fichero /etc/NetworkManager/NetworkManager.conf: Añade la linea wifi.scan-rand-mac-address=no en la sección [device]: Luego reinicia la FreedomBox.
Añadir un nuevo dispositivo de redAl añadir un nuevo dispositivo de red network manager lo configurará automáticamente. En la mayoría de los casos esto no funcionará. Borra la configuración creada automáticamente en el interfaz y crea una conexión de red nueva. Selecciona tu interfaz recién creado en la página "añadir conexión". Configura la zona del cortafuegos como corresponda. Puedes configurar los interfaces para conectar a la red o proporcionar configuración de red a cualquier máquina que se le conecte. De modo similar, si es un interfaz Wi-Fi puedes configurarlo para ser un punto de acceso Wi-FI o para conectarse a puntos de acceso existentes en la red.
Configurar una red MeshFreedomBox tiene un soporte rudimentario para participar en redes mesh basadas en BATMAN-Adv. Es posible unirse a una red existe en tu zona o crear una red mesh nueva y compartir tu conexión a Internet con el resto de nodos que se unan a tu red. Tanto para unirte a una red mesh como para crear otra, actualmente hay que crear 2 conexiones y activarlas manualmente.
Unirse a una red MeshPara unirse a una red mesh existente en tu zona primero consulta a sus organizadores y obtén información acerca de la red. Crea una conexión nueva y selecciona el tipo de conexión Wi-Fi. En el siguiente diálogo rellena los valores como se indica: Nombre del campoValor de ejemploExplicación Nombre de la Conexión Mesh Join - BATMAN El nombre tiene que acabar en BATMAN (con mayúsculas). Interfaz físico wlan0 El dispositivo Wi-Fi que quieres usar para conectar a la red mesh. Zona del cortafuegos Externa Ya que no quieres que los participantes en la red mesh usen dispositivos internos de tu FreedomBox. SSID ch1.freifunk.net Tal como te lo hayan dado los operadores de la red mesh. Esta red debería mostrarse en Redes Wi-Fi accesibles. Modo Ad-hoc Porque esta red es una red de pares (peer-to-peer). Banda de Frecuencia 2.4Ghz Tal como te lo hayan dado los operadores de la red mesh. Canal 1 Tal como te lo hayan dado los operadores de la red mesh. BSSID 12:CA:FF:EE:BA:BE Tal como te lo hayan dado los operadores de la red mesh. Autenticación Abierta Déjala abierta salvo que sepas que tu red mesh necesite otro valor. Contraseña Déjala en blanco salvo que sepas el valor que necesite tu red mesh. Método de direccionamiento IPv4 Deshabilitado Todavía no queremos pedir una configuración IP. Graba la conexión y únete a la red mesh activándola. Crea una segunda conexión nueva y selecciona el tipo Genérica. En el siguiente diálogo rellena los valores como se indica: Nombre del campoValor de ejemploExplicación Nombre de la Conexión Mesh Connect Cualquier nombre para identificar ésta conexión. Interfaz físico bat0 Este interfaz solo aparecerá tras activar con éxito la conexión del paso anterior. Zona del cortafuegos Externa Ya que no quieres que los participantes en la red mesh usen dispositivos internos de tu FreedomBox. Método de direccionamiento IPv4 Auto Generalmente las redes mesh tienen un servidor DHCP en algún sitio que le proporciona una configuración IP a tu máquina. Si no, consulta al operador y configura la dirección IP como te diga por el método manual. Graba la conexión. Configura tu maquina para participar en la red activando esta conexión. Actualmente hay que activarla manualmente cada vez que quieras unirte a la red. En el futuro FreedomBox lo hará automáticamente. Ahora debieras poder llegar a otros nodos de la red. También podrás conectar a Internet a través de la red mesh si los operadores han instalado algúna puerta de enlace.
Crear una red MeshPara crear tu propia red mesh y compartir tu conexión a Internet con el resto de los nodos de la red: Sigue las instrucciones del paso 1 de Unirse a una red Mesh empleando los valores válidos para tu red en SSID (un nombre para tu red Mesh), Banda de Frecuencia (generalmente 2.4Ghz), Canal (entre 1 y 11 para la banda de 2.4Ghz) y BSSID (una secuencia hexadecimal como 12:CA:DE:AD:BE:EF). Crea esta conexión y actívala. Sigue las instrucciones del paso 2 de Unirse a una red Mesh seleccionando Compartido para Método de direccionamiento IPv4d. Esto proporcionará automáticamente una configuración IP a otros nodos de la red y compartirá la conexión a Internet de tu maquina (ya sea mediante un segudo interfaz Wi-Fi, Ethernet, etc.) con el otros nodos de la red mesh. Corre la voz entre tus vecinos acerca de tu red mesh y pásales los parámetros que has empleado al crearla. Cuando otros nodos se conecten a esta red mesh tendrán que seguir las instrucciones del paso 1 de Unirse a una red Mesh empleando en SSID, Banda de Frecuencia y Canal los valores que has elegido para tu red mesh al crearla.
Operación avanzada de RedCockpit proporciona muchas funcionalidades de red más avanzadas que las de FreedomBox. Ambos, FreedomBox y Cockpit, operan sobre Network Manager y son por ello compatibles entre sí. Entre las funciones de Cockpit se incluyen: Establer de la unidad máxima de transmisión (MTU) para una conexión de red. Cambiar de la dirección hardware (MAC) de un interfaz de red. Añadir más servidores DNS y configurar el enrutado de una conexión de red. Crear dispositivos coordinados para interfaces de red de alta disponibilidad. Crear dispositivos en puente para agregar redes diferentes en un mismo interfaz de red. Administrar VLAN para crear particiones virtuales en la red física. networks-cockpit.png
Operación manual de RedFreedomBox configura redes automáticamente por defecto y proporciona un interfaz simplificado para personalizar la configuración a necesidades específicas. En la mayoría de los casos la operación manual no es necesaria. Los siguientes pasos describen cómo operar la configuración de red a mano en caso de que el interfaz de FreedomBox le resulte insuficiente a un usuario para realizar una tarea o para diagnosticar un problema que FreedomBox no identifique. En el interfaz de línea de comandos: Para acceder a un interfaz de configuración de conexiones de red basado en texto: Para ver la lista de dispositivos de red disponibles: Para ver la lista de conexiones configuradas: Para ver el estado actual de una conexión: ']]>Para ver la zona asignada actualmente en el cortafuegos a un interfaz de red: ' | grep zone]]>o Para crear una conexión nueva: " ifname "" type ethernet nmcli con modify "" connection.autoconnect TRUE -nmcli con modify "" connection.zone internal]]>Para cambiarle la zona a una conexión en el cortafuegos: " connection.zone ""]]>Para más información acerca del uso del comando nmcli mira su página man. Para obtener una lista completa de configuraciones y tipos de conexión que acepta Network Manager mira: Para ver el estado actual del cortafuegos y operarlo manualmente lee la sección Cortafuegos. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +nmcli con modify "" connection.zone internal]]>
Para cambiarle la zona a una conexión en el cortafuegos: " connection.zone ""]]>Para más información acerca del uso del comando nmcli mira su página man. Para obtener una lista completa de configuraciones y tipos de conexión que acepta Network Manager mira: Para ver el estado actual del cortafuegos y operarlo manualmente lee la sección Cortafuegos. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/OpenVPN.raw.xml b/doc/manual/es/OpenVPN.raw.xml index 367ee59aa..7dd30f648 100644 --- a/doc/manual/es/OpenVPN.raw.xml +++ b/doc/manual/es/OpenVPN.raw.xml @@ -1,4 +1,4 @@ -
es/FreedomBox/Manual/OpenVPN52019-11-20 11:00:10fioddorSe alinea con la versión 16 en inglés del 18 de noviembre de 201942019-10-10 19:50:32JosephNuthalapatiFix FreedomBox Portal include in the footer32019-09-16 09:36:03fioddorCorrección menor22019-09-16 09:34:40fioddorCorrección menor12019-09-16 09:32:56fioddorSe crea la versión española.
Red Privada Virtual (OpenVPN)
¿Qué es OpenVPN?OpenVPN proporciona un servicio de red privada virtual a tu FreedomBox. Puedes usar este software para acceso remoto, VPNs punto-a-punto y seguridad Wi-Fi. OpenVPN incluye soporte para direcciones IP dinámicas y NAT.
Redirección de puertosSi tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos en tu router. Debes redirigir los siguientes puertos para OpenVPN: UDP 1194
ConfigurarEn el menú de apps de Plinth selecciona Red Privada Virtual (OpenVPN) y haz clic en Instalar. Tras instalar el módulo todavía queda un paso de configuración que puede llevar largo tiempo completar. Haz clic en "Iniciar configuración" para empezar. OpenVPN service page Espera a que termine la configuración. Puede tardar un rato. Una vez completada la configuración del servidor OpenVPN puedes descargar tu perfil. Esto descargará un archivo llamado <usuario>.ovpn, siendo <usuario> un usuario de FreedomBox. Todos los usuarios de FreedomBox podrán descargar un perfil propio y diferente. Los usuarios que no sean administradores pueden descargar el perfil desde la portada después de ingresar. El archivo ovpn contiene toda la información que necesita un cliente vpn para conectar con un servidor. El perfil descargado contiene el nombre de dominio de FreedomBox al que debe conectarse el cliente. Este se obtiene del dominio configurado en la sección 'Configuración' de la página de 'Sistema'. En caso de que tu dominio no esté configurado adecuadamente quizá necesites cambiar este valor después de descargar el perfil. Si tu cliente OpenVPN lo permite puedes hacer esto después de importar el perfil OpenVPN. De lo contrario puedes editar el perfil .ovpn con un editor de texto y cambiar la línea 'remote' para que contenga la dirección IP WAN o el hostname de tu FreedomBox como se indica aquí.
es/FreedomBox/Manual/OpenVPN72020-05-30 19:41:32SunilMohanAdapaUpdate the title to emphasize app name over its generic name62020-05-24 07:09:33fioddorSe alinea con la versión 18 en inglés del 23 de mayo de 202052019-11-20 11:00:10fioddorSe alinea con la versión 16 en inglés del 18 de noviembre de 201942019-10-10 19:50:32JosephNuthalapatiFix FreedomBox Portal include in the footer32019-09-16 09:36:03fioddorCorrección menor22019-09-16 09:34:40fioddorCorrección menor12019-09-16 09:32:56fioddorSe crea la versión española.
OpenVPN (Red Privada Virtual)
¿Qué es OpenVPN?OpenVPN proporciona un servicio de red privada virtual a tu FreedomBox. Puedes usar este software para acceso remoto, VPNs punto-a-punto y seguridad Wi-Fi. OpenVPN incluye soporte para direcciones IP dinámicas y NAT.
Redirección de puertosSi tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos en tu router. Debes redirigir los siguientes puertos para OpenVPN: UDP 1194
ConfigurarEn el menú de apps de FreedomBox selecciona Red Privada Virtual (OpenVPN) y haz clic en Instalar. Tras instalar el módulo todavía queda un paso de configuración que puede llevar largo tiempo completar. Haz clic en "Iniciar configuración" para empezar. OpenVPN service page Espera a que termine la configuración. Puede tardar un rato. Una vez completada la configuración del servidor OpenVPN puedes descargar tu perfil. Esto descargará un archivo llamado <usuario>.ovpn, siendo <usuario> un usuario de FreedomBox. Todos los usuarios de FreedomBox podrán descargar un perfil propio y diferente. Los usuarios que no sean administradores pueden descargar el perfil desde la portada después de ingresar. El archivo ovpn contiene toda la información que necesita un cliente vpn para conectar con un servidor. El perfil descargado contiene el nombre de dominio de FreedomBox al que debe conectarse el cliente. Este se obtiene del dominio configurado en la sección 'Configuración' de la página de 'Sistema'. En caso de que tu dominio no esté configurado adecuadamente quizá necesites cambiar este valor después de descargar el perfil. Si tu cliente OpenVPN lo permite puedes hacer esto después de importar el perfil OpenVPN. De lo contrario puedes editar el perfil .ovpn con un editor de texto y cambiar la línea 'remote' para que contenga la dirección IP WAN o el hostname de tu FreedomBox como se indica aquí.
Navegar por Internet tras conectar a una VPNTras conectar a la VPN el dispositivo cliente podrá navegar por Internet sin más configuración adicional. No obstante una pre-condición para que esto funcione es que necesitas tener al menos 1 interfaz (tarjeta) de red conectado a Internet en la zona Externa del cortafuegos. Usa la página de configuración de redes para editar la zona del cortafuegos con los interfaces (tarjetas) de red del dispositivo.
Uso
En Android/LineageOSVisita la página principal de FreedomBox. Ingresa con tu cuenta de usuario. Desde la página principal descarga el perfil OpenVPN. El archivo se llamará <usuario>.ovpn. OpenVPN Download Profile Descarga un cliente OpenVPN como OpenVPN for Android. Se recomienda el repositorio F-Droid. En la app, selecciona Importar perfil. OpenVPN App En el diálogo Seleccionar perfil elige el archivo <usuario>.opvn que acabas de descargar. Pon un nombre a la conexión y graba el perfil. OpenVPN import profile El perfil recién creado aparecera. Si hace falta edita el perfil y pon el nombre de dominio de tu FreedomBox como dirección de servidor. OpenVPN profile created OpenVPN edit domain name Conecta haciendo clic sobre el perfil. OpenVPN connect OpenVPN connected Cuando esté desconecta haciendo clic sobre el perfil. OpenVPN disconnect
En DebianInstala un cliente OpenVPN para tu sistema Abre el archivo ovpn con el cliente OpenVPN. .ovpn]]>
Comprobar si estás conectado
En DebianTrata de hacer ping a tu FreedomBox u otros dispositivos de tu red. El comando ip addr debe mostrar una conexión tun0. El comando traceroute freedombox.org debiera mostrar la dirección IP del servidor VPN como primer salto. Si usas Network Manager puedes crear una conexión nueva importando el fichero: .ovpn]]>
Enlaces Externos Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +$ sudo nmcli connection import type openvpn file /ruta/a/.ovpn]]>
Enlaces Externos Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/PageKite.raw.xml b/doc/manual/es/PageKite.raw.xml index 2c5d402ac..8e8c88d19 100644 --- a/doc/manual/es/PageKite.raw.xml +++ b/doc/manual/es/PageKite.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/PageKite22020-04-04 19:54:42fioddorEnlace a página traducida.12019-06-20 15:13:14fioddorSe crea la versión española.
Visibilidad Publica (PageKite)
¿Qué es PageKite?PageKite hace inmediata y públicamente accesibles desde internet a los sitios web y servicios locales sin tener que crear tu mismo una dirección IP pública. Lo hace tunelando protocolos como HTTPS o SSH a través de cortafuegos y NAT. Usar PageKite require ana cuenta en un servicio de repetidor de PageKite. es uno de de estos servicios. Un servicio de repetidor de PageKite te permitirá crear cometas (kites). Las cometas son similares a los nombres de dominio pero con ventajas y desventajas diferentes. Una cometa puede tener varios servicios configurados. Se sabe que PageKite funciona con HTTP, HTTPS, y SSH, y muchas funcionan con otros servicios, pero no todas.
Usar PageKiteCréate una cuenta en un servicio de repetidor de PageKite. Añade una cometa a tu cuenta. Anota el nombre y el sectreo de tu cometa. En Plinth, vé a la solapa "Configurar PageKite" de la página Visibilidad Publica (PageKite). Marca la caja "Habilitar PageKite" e introduce el nombre y el secreto de tu cometa. Haz clic en "Grabar propiedades". En la solapa "Servicios Estándar" puedes habilitar HTTP y HTTPS (recomendado) y SSH (opcional). HTTP se necesita para obtener el certificado Let's Encrypt. Puedes deshabilitarlo (HTTPS) más tarde. En la página Certificados (Let's Encrypt) puedes obtener un certificado Let's Encrypt para el nombre de tu cometa. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/PageKite42020-05-30 19:49:21SunilMohanAdapaUpdate the title to emphasize app name over its generic name32020-05-24 07:40:58fioddorSe alinea con la versión 14 en inglés del 23 de mayo de 202022020-04-04 19:54:42fioddorEnlace a página traducida.12019-06-20 15:13:14fioddorSe crea la versión española.
PageKite (Visibilidad Publica)
¿Qué es PageKite?PageKite hace inmediata y públicamente accesibles desde internet a los sitios web y servicios locales sin tener que crear tu mismo una dirección IP pública. Lo hace tunelando protocolos como HTTPS o SSH a través de cortafuegos y NAT. Usar PageKite require ana cuenta en un servicio de repetidor de PageKite. es uno de de estos servicios. Un servicio de repetidor de PageKite te permitirá crear cometas (kites). Las cometas son similares a los nombres de dominio pero con ventajas y desventajas diferentes. Una cometa puede tener varios servicios configurados. Se sabe que PageKite funciona con HTTP, HTTPS, y SSH, y muchas funcionan con otros servicios, pero no todas.
Usar PageKiteCréate una cuenta en un servicio de repetidor de PageKite. Añade una cometa a tu cuenta. Anota el nombre y el sectreo de tu cometa. En FreedomBox, vé a la solapa "Configurar PageKite" de la página Visibilidad Publica (PageKite). Marca la caja "Habilitar PageKite" e introduce el nombre y el secreto de tu cometa. Haz clic en "Grabar propiedades". En la solapa "Servicios Estándar" puedes habilitar HTTP y HTTPS (recomendado) y SSH (opcional). HTTP se necesita para obtener el certificado Let's Encrypt. Puedes deshabilitarlo (HTTPS) más tarde. En la página Certificados (Let's Encrypt) puedes obtener un certificado Let's Encrypt para el nombre de tu cometa. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Power.raw.xml b/doc/manual/es/Power.raw.xml index f0b9f0230..11d492f36 100644 --- a/doc/manual/es/Power.raw.xml +++ b/doc/manual/es/Power.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Power12019-06-18 15:25:34fioddorSe crea la versión española.
ApagadoPower proporciona un modo fácil de reiniciar o apagar tu FreedomBox. Después de seleccionar "Reiniciar" o "Apagar", se te pedirá confirmación. Se puede llegar también a las opciones "Reiniciar" y "Apagar" desde el menú desplegable del usuario en la esquina superior derecha. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Power12019-06-18 15:25:34fioddorSe crea la versión española.
ApagadoPower proporciona un modo fácil de reiniciar o apagar tu FreedomBox. Después de seleccionar "Reiniciar" o "Apagar", se te pedirá confirmación. Se puede llegar también a las opciones "Reiniciar" y "Apagar" desde el menú desplegable del usuario en la esquina superior derecha. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Privoxy.raw.xml b/doc/manual/es/Privoxy.raw.xml index 6c891429d..9a67232e3 100644 --- a/doc/manual/es/Privoxy.raw.xml +++ b/doc/manual/es/Privoxy.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Privoxy32020-05-10 00:49:54fioddorSe alinea con la versión 13 en inglés del 03 de mayo de 202022019-09-16 11:36:07fioddor12019-09-16 11:33:00fioddorSe crea la versión española.
Proxy Web (Privoxy)Un proxy web actúa como filtro para tráfico web entrante y saliente. Por tanto, puedes ofrecer a los ordenadores de tu red pasar su tráfico internet a través del proxy para eliminar anuncios y mecanismos de rastreo indeseados. Privoxy es un software para la seguridad, privacidad, y control certero sobre la web. Proporciona una navegación web mucho más controlada (y anónima) que la que te puede ofrecer tu navegador. Privoxy "es un proxy enfocado principalmente al aumento de la privacidad, eliminación de anuncios y morralla, y a liberar al usuario de las restricciones impuestas sobre sus propias actividades" (fuente: Preguntas frecuentes acerca de Privoxy).
VídeoMira el vídeo acerca de como configurar y usar Privoxy en FreedomBox.
ConfigurarInstala Proxy Web (Privoxy) desde Plinth Privoxy Installation Adapta las preferencias de proxy de tu navegador al hostname (o dirección IP) de tu FreedomBox con el puerto 8118. Observa por favor que Privoxy sólo puede tratar tráfico HTTP y HTTPS. No funciona con FTP u otros protocolos. Privoxy Browser Settings Vé a la página o . Si Privoxy está instalado adecuadamente podrás configurarlo en detalle y si no verás un mensaje de fallo. Si usas un portátil que tenga a veces que conectarse con FreedomBox y Privoxy pasando por routers de terceros quizá quieras instalar una extensión proxy switch que te permite activar y desactivar el proxy más fácilmente.
Usuarios AvanzadosLa instalación de serie debería proporcionar un punto de partida razonable para la mayoría de los usuarios. Indudablemente habrá ocasiones en las que quieras ajustar la configuración. Eso se puede afrontar cuando surja la necesidad. Con Privoxy activado puedes ver su documentación y los detalles de su configuración en http://config.privoxy.org/ o en http://p.p. Para habilitar los cambios en estas configuraciones primero tienes que cambiar el valor de habilitar-acciones-de-edición en /etc/privoxy/config a 1. Antes de hacerlo lee el manual con atención, especialmente: No se puede controlar por separado el accesso al editor por "ACLs" o authenticación HTTP, así que cualquiera con acceso a Privoxy puede modificar la configuración de todos los usuarios. Esta opción no se recomienda para entornos con usuarios no confiables. Nota que un código de cliente malicioso (p.ej. Java) también puede usar el editor de acciones y no deberías habilitar estas opciones a no ser que entiendas las consecuencias y estés seguro de que los navegadores están correctamente configurados. Ahora encontrarás un botón EDITAR en la pantalla de configuración de http://config.privoxy.org/. La Guía rápida es un buen punto de partida para leer acerca de cómo definir reglas de bloqueo y filtrado propias. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Privoxy52020-05-30 19:41:57SunilMohanAdapaUpdate the title to emphasize app name over its generic name42020-05-24 07:14:06fioddorSe alinea con la versión 15 en inglés del 23 de mayo de 202032020-05-10 00:49:54fioddorSe alinea con la versión 13 en inglés del 03 de mayo de 202022019-09-16 11:36:07fioddor12019-09-16 11:33:00fioddorSe crea la versión española.
Privoxy (Proxy Web)Un proxy web actúa como filtro para tráfico web entrante y saliente. Por tanto, puedes ofrecer a los ordenadores de tu red pasar su tráfico internet a través del proxy para eliminar anuncios y mecanismos de rastreo indeseados. Privoxy es un software para la seguridad, privacidad, y control certero sobre la web. Proporciona una navegación web mucho más controlada (y anónima) que la que te puede ofrecer tu navegador. Privoxy "es un proxy enfocado principalmente al aumento de la privacidad, eliminación de anuncios y morralla, y a liberar al usuario de las restricciones impuestas sobre sus propias actividades" (fuente: Preguntas frecuentes acerca de Privoxy).
VídeoMira el vídeo acerca de como configurar y usar Privoxy en FreedomBox.
ConfigurarInstala Proxy Web (Privoxy) desde FreedomBox Privoxy Installation Adapta las preferencias de proxy de tu navegador al hostname (o dirección IP) de tu FreedomBox con el puerto 8118. Observa por favor que Privoxy sólo puede tratar tráfico HTTP y HTTPS. No funciona con FTP u otros protocolos. Privoxy Browser Settings Vé a la página o . Si Privoxy está instalado adecuadamente podrás configurarlo en detalle y si no verás un mensaje de fallo. Si usas un portátil que tenga a veces que conectarse con FreedomBox y Privoxy pasando por routers de terceros quizá quieras instalar una extensión proxy switch que te permite activar y desactivar el proxy más fácilmente.
Usuarios AvanzadosLa instalación de serie debería proporcionar un punto de partida razonable para la mayoría de los usuarios. Indudablemente habrá ocasiones en las que quieras ajustar la configuración. Eso se puede afrontar cuando surja la necesidad. Con Privoxy activado puedes ver su documentación y los detalles de su configuración en http://config.privoxy.org/ o en http://p.p. Para habilitar los cambios en estas configuraciones primero tienes que cambiar el valor de habilitar-acciones-de-edición en /etc/privoxy/config a 1. Antes de hacerlo lee el manual con atención, especialmente: No se puede controlar por separado el accesso al editor por "ACLs" o authenticación HTTP, así que cualquiera con acceso a Privoxy puede modificar la configuración de todos los usuarios. Esta opción no se recomienda para entornos con usuarios no confiables. Nota que un código de cliente malicioso (p.ej. Java) también puede usar el editor de acciones y no deberías habilitar estas opciones a no ser que entiendas las consecuencias y estés seguro de que los navegadores están correctamente configurados. Ahora encontrarás un botón EDITAR en la pantalla de configuración de http://config.privoxy.org/. La Guía rápida es un buen punto de partida para leer acerca de cómo definir reglas de bloqueo y filtrado propias. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Quassel.raw.xml b/doc/manual/es/Quassel.raw.xml index 382d62094..56adce76d 100644 --- a/doc/manual/es/Quassel.raw.xml +++ b/doc/manual/es/Quassel.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Quassel112020-05-11 23:17:26fioddorSe alinea con la versión 09 en inglés del 12 de mayo de 2020102020-05-11 18:51:37fioddorImagen traducida92020-05-11 18:44:58fioddorLiteral alineado con la imágen (pero traducido)82020-05-11 18:42:24fioddorErrata72020-05-11 18:40:56fioddorLiterales alineados con las imágenes62020-05-11 18:16:52fioddorMás imágenes traducidas52020-05-11 17:36:30fioddorAlgunas imágenes traducidas42020-05-10 00:47:37fioddorenlace a la página en español32020-05-10 00:45:37fioddorSe alinea con la versión 08 en inglés del 03 de mayo de 202022019-09-12 12:18:51fioddorSe crea la versión española.12019-09-12 12:11:29fioddorSe crea la versión española.
Cliente IRC (Quassel)Quassel es una aplicación IRC separada en 2 partes: un "núcleo" y un "cliente". Esto permite que el núcleo permanezca conectado a los servidores IRC recibiendo mensajes aunque el cliente esté desconectado. Ejecutando el servicio nucleo de Quassel FreedomBox puede mantenerte siempre en línea. Se pueden usar uno o varios clentes Quassel para conectarse intermitentemente desde escritorios o dispositivos móviles.
¿Para qué ejecutar Quassel?Muchos debates acerca de FreedomBox tienen lugar en el canal IRC irc://irc.debian.org/freedombox. Si tu FreedomBox ejecuta Quassel recolectará todos ellos mientras estás ausente, capturando las respuestas a tus preguntas. Recuerda que el proyecto FreedomBox es mundial y participa gente de casi todos los husos horarios. Usarás tu cliente para conectar al núcleo de Quassel y leer y/o responder cuando tengas tiempo y disponibilidad.
¿Cómo activar Quassel?En el interfaz web de FreedomBox selecciona Aplicaciones ve a Cliente IRC (Quassel) e instala la aplicación y asegúrate de que está habilitada Quassel Installation tu núcleo de Quassel se está ejecutando
Redirección de PuertosSi tu FreedomBox está detras de un router necesitarás configurar la redirección de puertos en tu router. Redirije los siguientes puertos de Quassel: TCP 4242 Ejemplo de configuración en el router: Quassel_PortForwarding_es_v01.png
ClientesHay disponibles clientes para escritorio y dispositivos móviles para conectar a Quassel.
EscritorioEn un sistema Debian puedes, p. ej. usar quassel-client. Los siguientes pasos describen cómo conectar el Cliente Quassel con el Núcleo de Quassel de tu FreedomBox. La primera vez que te conectes el Núcleo de Quassel se inicializará también. Abre el Cliente Quassel. Te guiará paso a paso para Conectarse al núcleo. Connect to Core Haz clic en el botón Añadir para abrir el diálogo Añadir cuenta de núcleo. Add Core Account Rellena cualquier cosa en el campo Nombre de la cuenta. Introduce el hostname DNS de tu FreedomBox en el campo Servidor. El campo Puerto debe tener el valor 4242. Pon el usuario y la contraseña de la cuenta que quieres crear para conectar con el Núcleo de Quassel en los campos Usuario y Contraseña. Si no quieres que se te pida la contraseña cada vez que arranques el cliente de Quassel marca la opción Recordar. Tras pulsar OK en el diálogo Añadir cuenta de núcleo deberías ver la cuenta en el diálogo Conectarse al núcleo. Connect to Core Selecciona la cuenta del núcleo recién creada y dale a OK para conectar con él. Si es la primera vez que te conectas a este núcleo verás un aviso de Certificado de seguridad no confiable y necesitarás aceptar el certificado del servidor. Untrusted Security Certificate Selecciona Continuar. Se te preguntará si quieres aceptar el certificado permanentemente. Selecciona Para siempre. Untrusted Security Certificate Si nadie se ha conectado nunca antes a este Núcleo Quassel antes verás un diálogo por pasos Asistente de configuración del núcleo. Selecciona Siguiente. {{attachment:quassel-client-6-core-configuration-wizard_es_v01.png|Core Configuration Wizard|width=504}n En la página Crear usuario administrador introduce el usuario y la contraseña que has usado antes para crear la conexión al núcleo. Selecciona Recordar la contraseña para que recuerde la contraseña para futuras sesiones. Haz clic en Siguiente. Create Admin User Page En la página Seleccionar un motor de almacenamiento selecciona SQLite y haz clic en Enviar. Select Storage Backend La configuración del núcleo está completa y verás un asistente Quassel IRC para configurar tus conexiones IRC. Haz clic en Siguiente. Welcome Wizard A continuación en la página de Configurar identidad pon un nombre y múltiples pseudónimos. Te presentarás con estos a otros usuarios de IRC. No es necesario dar tu nombre real. Los pseudónimos múltipes son útiles como suplentes cuando el primero no se pueda usar por cualquier motivo. Tras aportar la información haz clic en Siguiente. Setup Identity A continuación en la página de Configurar conexión de red pon el nombre de red que quieras y una lista de servidores a los que se deba conectar el Núcleo de Quassel para unirte a esa red IRC (por ejemplo irc.debian.org:6667). Setup Network Connection Selecciona un servidor de la lista y dale a Editar. En el diálogo Información del servidor pon el puerto 6697 (consulta la lista real de servidores y sus puertos seguros en la documentación de tu red) y haz clic en Usar conexión cifrada. Clic en OK. Esto es para asegurar que la comunicación entre tu FreedomBox y el servidor de la red IRC va cifrada. Server Info Server Info SSL Ya de vuelta en el diálogo Configuración de Conexión de Red proporciona una lista de canales IRC (como #freedombox) a los que unirte al conectarte a la red. Dale a Grabar y Conectar. Setup Network Connection Deberías conectar con la red y ver la lista de canales a los que te has unido en el panel Todas las conversaciones de la izquierda de la ventana principal del Cliente Quassel. Quassel Main Window Selecciona un canal y empieza a recibir mensajes de otros participantes del canal y a enviar los tuyos.
AndroidPara dispositivos Android puedes usar p.ej. Quasseldroid obtenido desde F-Droid introduce el núcleo, usuario, etc. Quasseldroid.png Por cierto el verbo alemán quasseln significa hablar mucho, rajar. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Quassel132020-05-30 19:42:16SunilMohanAdapaUpdate the title to emphasize app name over its generic name122020-05-24 06:58:26fioddorSe alinea con la versión 11 en inglés del 23 de mayo de 2020112020-05-11 23:17:26fioddorSe alinea con la versión 09 en inglés del 12 de mayo de 2020102020-05-11 18:51:37fioddorImagen traducida92020-05-11 18:44:58fioddorLiteral alineado con la imágen (pero traducido)82020-05-11 18:42:24fioddorErrata72020-05-11 18:40:56fioddorLiterales alineados con las imágenes62020-05-11 18:16:52fioddorMás imágenes traducidas52020-05-11 17:36:30fioddorAlgunas imágenes traducidas42020-05-10 00:47:37fioddorenlace a la página en español32020-05-10 00:45:37fioddorSe alinea con la versión 08 en inglés del 03 de mayo de 202022019-09-12 12:18:51fioddorSe crea la versión española.12019-09-12 12:11:29fioddorSe crea la versión española.
Quassel (Cliente IRC)Quassel es una aplicación IRC separada en 2 partes: un "núcleo" y un "cliente". Esto permite que el núcleo permanezca conectado a los servidores IRC recibiendo mensajes aunque el cliente esté desconectado. Ejecutando el servicio nucleo de Quassel FreedomBox puede mantenerte siempre en línea. Se pueden usar uno o varios clentes Quassel para conectarse intermitentemente desde escritorios o dispositivos móviles.
¿Para qué ejecutar Quassel?Muchos debates acerca de FreedomBox tienen lugar en el canal IRC irc://irc.debian.org/freedombox. Si tu FreedomBox ejecuta Quassel recolectará todos ellos mientras estás ausente, capturando las respuestas a tus preguntas. Recuerda que el proyecto FreedomBox es mundial y participa gente de casi todos los husos horarios. Usarás tu cliente para conectar al núcleo de Quassel y leer y/o responder cuando tengas tiempo y disponibilidad.
¿Cómo activar Quassel?En el interfaz web de FreedomBox selecciona Aplicaciones ve a Cliente IRC (Quassel) e instala la aplicación y asegúrate de que está habilitada Quassel Installation tu núcleo de Quassel se está ejecutando
Redirección de PuertosSi tu FreedomBox está detras de un router necesitarás configurar la redirección de puertos en tu router. Redirije los siguientes puertos de Quassel: TCP 4242 Ejemplo de configuración en el router: Quassel_PortForwarding_es_v01.png
ClientesHay disponibles clientes para escritorio y dispositivos móviles para conectar a Quassel.
EscritorioEn un sistema Debian puedes, p. ej. usar quassel-client. Los siguientes pasos describen cómo conectar el Cliente Quassel con el Núcleo de Quassel de tu FreedomBox. La primera vez que te conectes el Núcleo de Quassel se inicializará también. Abre el Cliente Quassel. Te guiará paso a paso para Conectarse al núcleo. Connect to Core Haz clic en el botón Añadir para abrir el diálogo Añadir cuenta de núcleo. Add Core Account Rellena cualquier cosa en el campo Nombre de la cuenta. Introduce el hostname DNS de tu FreedomBox en el campo Servidor. El campo Puerto debe tener el valor 4242. Pon el usuario y la contraseña de la cuenta que quieres crear para conectar con el Núcleo de Quassel en los campos Usuario y Contraseña. Si no quieres que se te pida la contraseña cada vez que arranques el cliente de Quassel marca la opción Recordar. Tras pulsar OK en el diálogo Añadir cuenta de núcleo deberías ver la cuenta en el diálogo Conectarse al núcleo. Connect to Core Selecciona la cuenta del núcleo recién creada y dale a OK para conectar con él. Si es la primera vez que te conectas a este núcleo verás un aviso de Certificado de seguridad no confiable y necesitarás aceptar el certificado del servidor. Untrusted Security Certificate Selecciona Continuar. Se te preguntará si quieres aceptar el certificado permanentemente. Selecciona Para siempre. Untrusted Security Certificate Si nadie se ha conectado nunca antes a este Núcleo Quassel antes verás un diálogo por pasos Asistente de configuración del núcleo. Selecciona Siguiente. {{attachment:quassel-client-6-core-configuration-wizard_es_v01.png|Core Configuration Wizard|width=504}n En la página Crear usuario administrador introduce el usuario y la contraseña que has usado antes para crear la conexión al núcleo. Selecciona Recordar la contraseña para que recuerde la contraseña para futuras sesiones. Haz clic en Siguiente. Create Admin User Page En la página Seleccionar un motor de almacenamiento selecciona SQLite y haz clic en Enviar. Select Storage Backend La configuración del núcleo está completa y verás un asistente Quassel IRC para configurar tus conexiones IRC. Haz clic en Siguiente. Welcome Wizard A continuación en la página de Configurar identidad pon un nombre y múltiples pseudónimos. Te presentarás con estos a otros usuarios de IRC. No es necesario dar tu nombre real. Los pseudónimos múltipes son útiles como suplentes cuando el primero no se pueda usar por cualquier motivo. Tras aportar la información haz clic en Siguiente. Setup Identity A continuación en la página de Configurar conexión de red pon el nombre de red que quieras y una lista de servidores a los que se deba conectar el Núcleo de Quassel para unirte a esa red IRC (por ejemplo irc.debian.org:6667). Setup Network Connection Selecciona un servidor de la lista y dale a Editar. En el diálogo Información del servidor pon el puerto 6697 (consulta la lista real de servidores y sus puertos seguros en la documentación de tu red) y haz clic en Usar conexión cifrada. Clic en OK. Esto es para asegurar que la comunicación entre tu FreedomBox y el servidor de la red IRC va cifrada. Server Info Server Info SSL Ya de vuelta en el diálogo Configuración de Conexión de Red proporciona una lista de canales IRC (como #freedombox) a los que unirte al conectarte a la red. Dale a Grabar y Conectar. Setup Network Connection Deberías conectar con la red y ver la lista de canales a los que te has unido en el panel Todas las conversaciones de la izquierda de la ventana principal del Cliente Quassel. Quassel Main Window Selecciona un canal y empieza a recibir mensajes de otros participantes del canal y a enviar los tuyos.
AndroidPara dispositivos Android puedes usar p.ej. Quasseldroid obtenido desde F-Droid introduce el núcleo, usuario, etc. Quasseldroid.png Por cierto el verbo alemán quasseln significa hablar mucho, rajar. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Radicale.raw.xml b/doc/manual/es/Radicale.raw.xml index ecf5a6a48..aca1a3381 100644 --- a/doc/manual/es/Radicale.raw.xml +++ b/doc/manual/es/Radicale.raw.xml @@ -1,4 +1,4 @@ -
es/FreedomBox/Manual/Radicale102020-05-15 17:00:38fioddorSe alinea con la versión 54 en inglés del 15 de mayo de 202092020-05-10 00:39:59fioddorSe alinea con la versión 52 en inglés del 03 de mayo de 202082019-09-06 08:16:54fioddorSe mejoran las referencias a Debian Testing en línea con la nomenclatura de https://www.debian.org/releases/72019-09-04 13:36:27fioddorSe completa la traducción.62019-09-04 13:26:30fioddorSe incorpora la traducción de una sección nueva.52019-09-04 12:55:18fioddorSe incorpora la traducción de una sección nueva.42019-09-04 12:52:32fioddorSe incorpora la traducción de una sección nueva.32019-09-04 12:40:55fioddorSe incorpora la traducción de una sección nueva.22019-09-04 12:23:33fioddorSe incorpora la traducción de una sección nueva.12019-09-04 12:00:49fioddorSe crea la versión española (traducción incompleta).
Agenda (Radicale)Con Radicale puedes sincronizar tus calendarios, listas de tareas y agendas de contactos personales entre varios ordendores, tabletas, y/o teléfonos inteligentes y compartirlos con tus amistades. Todo sin tener que permitir a terceros que accedan a tu información privada.
¿Porque debería usar Radicale?Usando Radicale puedes evitar servicios centralizados como Google Calendar o Apple Calendar (iCloud) que explotan los datos de tus eventos y conexiones sociales.
¿Cómo configurar Radicale?Primero el servidor Radicale necesita estar activado en tu FreedomBox. En el servicio FreedomBox (Plinth) selecciona Apps ve a Radicale (Calendario y Libreta de contactos) e instala la aplicación. Tras completar la instalación asegúrate de que la aplicación está marcada como "habilitada" en el interfaz de FreedomBox. Habilitar la aplicación arranca el servidor CalDAV/CardDAV Radicale. define los permisos de acceso: Solo el dueño de un calendario/libreta de contactos puede ver o hacer cambios Cualquier usuario puede ver cualquier calendario/libreta de contactos pero solo el dueño puede hacer cambios Cualquier usuario puede ver o hacer cambios en cualquier calendario/libreta Nota: Solo los usuarios dados de alta en FreedomBox pueden acceder a Radicale. Radicale-Plinth.png Si quieres compartir un calendario solo con algunos usuarios determinados la manera más simple es crear un nuevo usuario común para ellos y compartir con ellos el nombre del usuario común y su contraseña. Radicale proporciona un interfaz web básico que solo soporta crear calendarios y libretas nuevos. Para añadir eventos o contactos se necesita una aplicación cliente soportada externa. radicale_web.png Crear calendarios y/o libretas usando el interfaz web Visita https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/ Ingresa con tu cuenta de FreedomBox Selecciona "Crear nuevo calendario o libreta" Proporciona un título y selecciona el tipo Opcionalmente, proporciona una descripción o selecciona un color Haz clic en "Crear" La página mostrará la URL de tu created nuevo calendario o libreta Ahora abre tu aplicación cliente para crear calendarios y/o libretas nuevos que usarán tu FreedomBox y servidor Radicale. El sitio web de Radicale proporciona una lista de clientes soportados pero no uses las URLs que se mencionan allí; sigue este manual porque FreedomBox usa otra configuración. A continuación se muestran los pasos para 2 ejemplos: Ejemplo de configuración con el cliente Evolution: Calendario Crea un calendario nuevo Selecciona el "Tipo" "CalDAV" Con "CalDAV" seleccionado aparecerán más opciones en el cuadro de diálogo. URL: https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/<usuario>/<nombre_del_calendario>.ics/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. nota: la / inicial de la ruta es importante. Habilita "Usar una conexión segura." Nombre del calendario Radicale-Evolution-Docu.png Lista de tareas: Añadir una lista de tareas es prácticamente igual que con un calendario. Contactos Sigue los mismos pasos anteriores reemplazando CalDAV por WebDAV y la extensión de la libreta por .vcf.
Sincronizar via TorConfigurar un calendario en FreedomBox con Radicale sobre Tor es lo mismo que sobre la red en claro, en resumen: Cuando hayas ingresado al interfaz web de FreedomBox desde Tor haz clic en Radicale e introduce un usuario de tu FreedomBox y su contraseña. Ingresa en el interfaz web de Radicale usando el usuario de tu FreedomBox y su contraseña. Haz clic en "Crear libreta o calendario nuevo", proporciona un título, selecciona un tipo y haz clic en "Crear". Anota la URL, p.ej. https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. Estas instrucciones son para Thunderbird/Lightning. Nota: necesitarás estar conectado a Tor con el Tor Browser Bundle. Abre Thunderbird, la extensión (add-on) Torbirdy y reinicia Thunderbird. (Quizá no haga falta.) En el interfaz Lightning, en el panel izquierdo bajo Calendario haz clic con el botón derecho del ratón y selecciona "Nuevo calendario". Selecciona "En la red" como localización de tu calendario. Selecciona "CalDAV" copia la URL, p.ej., https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/. como localización cambiando los elementos marcados entre <> de acuerdo a tu configuración. Proporciona un nombre, etc. Haz clic en "Siguiente". Tu calendario está ahora sincronizando con tu FreedomBox a través de Tor. Si no has generado un certificado con "Let's Encrypt" para tu FreedomBox quizá necesites seleccionar "Confirmar Excepción de Seguridad" cuando se te indique.
Sincronizar con tu teléfono AndroidHay varias Apps que admiten integración con el servidor Radicale. Este ejemplo usa DAVx5, que está disponible p.ej. en F-Droid. Si también quieres usar listas de tareas hay que instalar primero la app compatible OpenTasks. Sigue estos pasos para configurar tu cuanta con el servidor Radicale de tu FreedomBox. Instala DAVx5. Crea una cuenta nueva en DAVx5 haciendo clic en el botón flotante [+]. Selecciona la 2ª opción como se muestra en la primera imagen más abajo e introduce la URL base (no olvides la / del final). DAVx5 averiguará las cuentas CalDAV y WebDAV del usuario. Sigue este video del FAQ de DAVx5 para aprender cómo importar tus contactos existentes a Radicale. Sincronizar contactos Haz clic en los menús de hamburguesa de CalDAV y CardDAV y selecciona "Refrescar ..." en caso de cuentas existentes o "Crear ..." en caso de cuentas nuevas (ver la 2ª captura de pantalla más abajo). Marca las cajas de las libretas y/o contactos que quieras sincronizar y haz clic en el botón de sincronización de la cabecera. (ver la 3ª captura de pantalla más abajo) DAVx5 account setup DAVx5 refresh DAVx5 account sync
Usuarios Avanzados
Compartir recursosArriba se mostrá una manera fácil de crear un recurso para un grupo de gente creando una cuenta dedicada común. Aquí de describe un método alternativo con el que se otorga acceso a un calendario a 2 usuarios Usuario1 y Usuario2. Esto requiere acceso por SSH a la FreedomBox. crea un archivo /etc/radicale/rights
es/FreedomBox/Manual/Radicale132020-05-30 19:46:20SunilMohanAdapaUpdate the title to emphasize app name over its generic name122020-05-24 06:32:26fioddorSe alinea con la versión 57 en inglés del 23 de mayo de 2020112020-05-22 10:11:41fioddorSe alinea con la versión 55 en inglés del 22 de mayo de 2020102020-05-15 17:00:38fioddorSe alinea con la versión 54 en inglés del 15 de mayo de 202092020-05-10 00:39:59fioddorSe alinea con la versión 52 en inglés del 03 de mayo de 202082019-09-06 08:16:54fioddorSe mejoran las referencias a Debian Testing en línea con la nomenclatura de https://www.debian.org/releases/72019-09-04 13:36:27fioddorSe completa la traducción.62019-09-04 13:26:30fioddorSe incorpora la traducción de una sección nueva.52019-09-04 12:55:18fioddorSe incorpora la traducción de una sección nueva.42019-09-04 12:52:32fioddorSe incorpora la traducción de una sección nueva.32019-09-04 12:40:55fioddorSe incorpora la traducción de una sección nueva.22019-09-04 12:23:33fioddorSe incorpora la traducción de una sección nueva.12019-09-04 12:00:49fioddorSe crea la versión española (traducción incompleta).
Radicale (Calendario y Contactos)Con Radicale puedes sincronizar tus calendarios, listas de tareas y agendas de contactos personales entre varios ordendores, tabletas, y/o teléfonos inteligentes y compartirlos con tus amistades. Todo sin tener que permitir a terceros que accedan a tu información privada.
¿Porque debería usar Radicale?Usando Radicale puedes evitar servicios centralizados como Google Calendar o Apple Calendar (iCloud) que explotan los datos de tus eventos y conexiones sociales.
¿Cómo configurar Radicale?Primero el servidor Radicale necesita estar activado en tu FreedomBox. En el servicio FreedomBox selecciona Apps ve a Radicale (Calendario y Libreta de contactos) e instala la aplicación. Tras completar la instalación asegúrate de que la aplicación está marcada como "habilitada" en el interfaz de FreedomBox. Habilitar la aplicación arranca el servidor CalDAV/CardDAV Radicale. define los permisos de acceso: Solo el dueño de un calendario/libreta de contactos puede ver o hacer cambios Cualquier usuario puede ver cualquier calendario/libreta de contactos pero solo el dueño puede hacer cambios Cualquier usuario puede ver o hacer cambios en cualquier calendario/libreta Nota: Solo los usuarios dados de alta en FreedomBox pueden acceder a Radicale. Radicale-Plinth.png Si quieres compartir un calendario solo con algunos usuarios determinados la manera más simple es crear un nuevo usuario común para ellos y compartir con ellos el nombre del usuario común y su contraseña. Radicale proporciona un interfaz web básico que solo soporta crear calendarios y libretas nuevos. Para añadir eventos o contactos se necesita una aplicación cliente soportada externa. radicale_web.png Crear calendarios y/o libretas usando el interfaz web Visita https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/ Ingresa con tu cuenta de FreedomBox Selecciona "Crear nuevo calendario o libreta" Proporciona un título y selecciona el tipo Opcionalmente, proporciona una descripción o selecciona un color Haz clic en "Crear" La página mostrará la URL de tu created nuevo calendario o libreta Ahora abre tu aplicación cliente para crear calendarios y/o libretas nuevos que usarán tu FreedomBox y servidor Radicale. El sitio web de Radicale proporciona una lista de clientes soportados pero no uses las URLs que se mencionan allí; sigue este manual porque FreedomBox usa otra configuración. A continuación se muestran los pasos para 2 ejemplos: Ejemplo de configuración con el cliente Evolution: Calendario Crea un calendario nuevo Selecciona el "Tipo" "CalDAV" Con "CalDAV" seleccionado aparecerán más opciones en el cuadro de diálogo. URL: https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/<usuario>/<nombre_del_calendario>.ics/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. nota: la / inicial de la ruta es importante. Habilita "Usar una conexión segura." Nombre del calendario Radicale-Evolution-Docu.png Lista de tareas: Añadir una lista de tareas es prácticamente igual que con un calendario. Contactos Sigue los mismos pasos anteriores reemplazando CalDAV por WebDAV y la extensión de la libreta por .vcf.
Sincronizar via TorConfigurar un calendario en FreedomBox con Radicale sobre Tor es lo mismo que sobre la red en claro, en resumen: Cuando hayas ingresado al interfaz web de FreedomBox desde Tor haz clic en Radicale e introduce un usuario de tu FreedomBox y su contraseña. Ingresa en el interfaz web de Radicale usando el usuario de tu FreedomBox y su contraseña. Haz clic en "Crear libreta o calendario nuevo", proporciona un título, selecciona un tipo y haz clic en "Crear". Anota la URL, p.ej. https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. Estas instrucciones son para Thunderbird/Lightning. Nota: necesitarás estar conectado a Tor con el Tor Browser Bundle. Abre Thunderbird, la extensión (add-on) Torbirdy y reinicia Thunderbird. (Quizá no haga falta.) En el interfaz Lightning, en el panel izquierdo bajo Calendario haz clic con el botón derecho del ratón y selecciona "Nuevo calendario". Selecciona "En la red" como localización de tu calendario. Selecciona "CalDAV" copia la URL, p.ej., https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/. como localización cambiando los elementos marcados entre <> de acuerdo a tu configuración. Proporciona un nombre, etc. Haz clic en "Siguiente". Tu calendario está ahora sincronizando con tu FreedomBox a través de Tor. Si no has generado un certificado con "Let's Encrypt" para tu FreedomBox quizá necesites seleccionar "Confirmar Excepción de Seguridad" cuando se te indique.
Sincronizar con tu teléfono AndroidHay varias Apps que admiten integración con el servidor Radicale. Este ejemplo usa DAVx5, que está disponible p.ej. en F-Droid. Si también quieres usar listas de tareas hay que instalar primero la app compatible OpenTasks. Sigue estos pasos para configurar tu cuanta con el servidor Radicale de tu FreedomBox. Instala DAVx5. Crea una cuenta nueva en DAVx5 haciendo clic en el botón flotante [+]. Selecciona la 2ª opción como se muestra en la primera imagen más abajo e introduce la URL base (no olvides la / del final). DAVx5 averiguará las cuentas CalDAV y WebDAV del usuario. Sigue este video del FAQ de DAVx5 para aprender cómo importar tus contactos existentes a Radicale. Sincronizar contactos Haz clic en los menús de hamburguesa de CalDAV y CardDAV y selecciona "Refrescar ..." en caso de cuentas existentes o "Crear ..." en caso de cuentas nuevas (ver la 2ª captura de pantalla más abajo). Marca las cajas de las libretas y/o contactos que quieras sincronizar y haz clic en el botón de sincronización de la cabecera. (ver la 3ª captura de pantalla más abajo) DAVx5 account setup DAVx5 refresh DAVx5 account sync
Usuarios Avanzados
Compartir recursosArriba se mostrá una manera fácil de crear un recurso para un grupo de gente creando una cuenta dedicada común. Aquí de describe un método alternativo con el que se otorga acceso a un calendario a 2 usuarios Usuario1 y Usuario2. Esto requiere acceso por SSH a la FreedomBox. crea un archivo /etc/radicale/rights [calendario_de_mis_amigos] es solo un identificador, puede ser cualquier nombre. La sección [owner-write] asegura que los dueños tengan acceso a sus propios archivos. Edita el archivo /etc/radicale/config y haz los siguientes cambios en la sección [rights) [calendario_de_mis_amigos] es solo un identificador, puede ser cualquier nombre. La sección [owner-write] asegura que los dueños tengan acceso a sus propios archivos. Edita el archivo /etc/radicale/config y haz los siguientes cambios en la sección [rights] Reinicia el servidor Radicale o la FreedomBox
Importar archivosSi estás usando un archivo de contactos exportado desde otro servicio o aplicación hay que copiarlo a: /var/lib/radicale/collections/<usuario>/<nombre_del_archivo_de_contactos>'.vcf.
Migrar desde Radicale versión 1.x a versión 2.xEn Febrero de 2019 se actualizó Radicale en las versiones "en pruebas" (testing) de Debian desde la versión 1.x a la 2.x. La versión 2.x es mejor pero incompatible con los datos y la configuración empleados en la 1.x. El mecanismo automático de actualización de FreedomBox que emplean las actualizaciones desatendidas no actualiza automaticamente la version 2.x de Radicale debido a cambios en los archivos de configuración. No obstante la version 19.1 de FreedomBox, disponible en en las versiones "en pruebas" (testing) desde el 23 de Febrero de 2019, realizará la migración de los datos y la configuración a la versión 2.x de Radicale. No se requiere ninguna acción por parte de los usuarios típicos. Ocurrirá automáticamente. Si por algún motivo necesitas ejecutar a mano apt dist-upgrade en tu máquina Radicale se actualizará a 2.x y entonces tu FreedomBox no podrá ejecutar esta actualización (ya que el proyecto de origen decidió eliminar las herramientas de migración de la versión 2.x de Radicale). Para evitar esta situación se recomienda el siguiente procedimiento para actualizar. Notas: python-radicale es un paquete antigüo de la versión 1.x de Radicale que sigue disponible en las versiones "en pruebas" (testing) de Debian. Esto es un hack alternativo para emplear la funcionalidad --export-storage que es responsable de la migración de datos. Por desgracia esta funcionalidad ya no está disponible en Radicale 2.x. Los ficheros que acaban en .dpkg-dist solo existirán si has elegido "Conservar tu versión actualmente instalada" cuando se te preguntó durante la actualización a Radicale 2.x. El procedimiento anterior sobrescribirá la configuración antigüa con una nueva. No se necesitan cambios a los 2 ficheros de configuración salvo que hayas cambiado la preferencia de compartición de calendario. Nota: Durante la migración tus datos permanecen a salvo en el directorio /var/lib/radicale/collections. Los datos nuevos se crearán y usarán en el directorio /var/lib/radicale/collections/collections-root/. El comando tar hace una copia de seguridad de tu configuración y tus datos en /root/radicale_backup.tgz por si haces o algo va mal y quieres deshacer los cambios.
Resolución de Problemas1. Si estás usando FreedomBox Pioneer Edition o instalando FreedomBox sobre Debian Buster Radicale podría no estar operativo inmediatamente después de la instalación. Esto se debe a un defecto ya corregido posteriormente. Para superar el problema actualiza FreedomBox haciendo clic en 'Actualización Manual' desde la app 'Actualizaciones'. Otra opción es simplemente esperar un par de días y dejar que FreedomBox se actualice solo. Después instala Radicale. Si Radicale ya está instalado deshabilitalo y rehabilitalo después de que se complete la actualización. Esto arreglará el problema y dejará a Radicale trabajando correctamente. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +(Cuando FreedomBox 19.1 está disponble ve al interfaz web de FreedomBox y vuelve a configurar tu preferencia de compartición de calendario si no se muestra bien porque se habrá perdido durante la operación.)]]>
Notas: python-radicale es un paquete antigüo de la versión 1.x de Radicale que sigue disponible en las versiones "en pruebas" (testing) de Debian. Esto es un hack alternativo para emplear la funcionalidad --export-storage que es responsable de la migración de datos. Por desgracia esta funcionalidad ya no está disponible en Radicale 2.x. Los ficheros que acaban en .dpkg-dist solo existirán si has elegido "Conservar tu versión actualmente instalada" cuando se te preguntó durante la actualización a Radicale 2.x. El procedimiento anterior sobrescribirá la configuración antigüa con una nueva. No se necesitan cambios a los 2 ficheros de configuración salvo que hayas cambiado la preferencia de compartición de calendario. Nota: Durante la migración tus datos permanecen a salvo en el directorio /var/lib/radicale/collections. Los datos nuevos se crearán y usarán en el directorio /var/lib/radicale/collections/collections-root/. El comando tar hace una copia de seguridad de tu configuración y tus datos en /root/radicale_backup.tgz por si haces o algo va mal y quieres deshacer los cambios.
Resolución de Problemas1. Si estás usando FreedomBox Pioneer Edition o instalando FreedomBox sobre Debian Buster Radicale podría no estar operativo inmediatamente después de la instalación. Esto se debe a un defecto ya corregido posteriormente. Para superar el problema actualiza FreedomBox haciendo clic en 'Actualización Manual' desde la app 'Actualizaciones'. Otra opción es simplemente esperar un par de días y dejar que FreedomBox se actualice solo. Después instala Radicale. Si Radicale ya está instalado deshabilitalo y rehabilitalo después de que se complete la actualización. Esto arreglará el problema y dejará a Radicale trabajando correctamente. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Repro.raw.xml b/doc/manual/es/Repro.raw.xml index d7555a42b..9abd99afd 100644 --- a/doc/manual/es/Repro.raw.xml +++ b/doc/manual/es/Repro.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Repro12019-09-14 08:59:56fioddorSe crea la versión española (traducción incompleta).
Servidor SIP (Repro)App eliminada Repro ha sido eliminada de Debian 10 (Buster) y por tanto ya no está disponible en FreedomBox. Repro es un servidor de SIP, un estándar para llamadas de voz sobre IP (VoIP). Se requiere un cliente SIP de escritorio o móvil para usar Repro.
Cómo configurar el servidor SIPConfigura el dominio en la página /repro/domains.html de la FreedomBox. Repro Domains Añade usuarios en /repro/addUser.html. Repro Users Deshabilita y vuelve a habilitar la aplicaión Repro en Plinth.
Redirección de PuertosSi tu FreedomBox estrá detrás de un router necesitarás configurar la redirección de puertos de tu router. Deberías redirigir los siguientes puertos para Repro: TCP 5060 TCP 5061 UDP 5060 UDP 5061 Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Repro32020-05-30 20:02:13SunilMohanAdapaUpdate the title to emphasize app name over its generic name22020-05-24 07:04:52fioddorSe alinea con la versión 09 en inglés del 23 de mayo de 202012019-09-14 08:59:56fioddorSe crea la versión española (traducción incompleta).
Repro (Servidor SIP)App eliminada Repro ha sido eliminada de Debian 10 (Buster) y por tanto ya no está disponible en FreedomBox. Repro es un servidor de SIP, un estándar para llamadas de voz sobre IP (VoIP). Se requiere un cliente SIP de escritorio o móvil para usar Repro.
Cómo configurar el servidor SIPConfigura el dominio en la página /repro/domains.html de la FreedomBox. Repro Domains Añade usuarios en /repro/addUser.html. Repro Users Deshabilita y vuelve a habilitar la aplicaión Repro en Plinth.
Redirección de PuertosSi tu FreedomBox estrá detrás de un router necesitarás configurar la redirección de puertos de tu router. Deberías redirigir los siguientes puertos para Repro: TCP 5060 TCP 5061 UDP 5060 UDP 5061 Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Roundcube.raw.xml b/doc/manual/es/Roundcube.raw.xml index 32977e80a..bba72d692 100644 --- a/doc/manual/es/Roundcube.raw.xml +++ b/doc/manual/es/Roundcube.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Roundcube52019-09-11 09:40:48fioddorCorrección menor42019-09-11 09:40:18fioddorCorrección menor32019-09-11 09:39:03fioddorCorrección menor22019-09-11 09:37:31fioddor12019-09-11 09:35:26fioddorSe crea la versión española.
Cliente de Correo Electrónico (Email) (Roundcube)
¿Qué es Roundcube?Roundcube es un cliente de correo electrónico (email) para navegador con un interfaz de usuario parecido a una aplicación de escritorio. Admite varios lenguajes. Roundcube usa el protocolo de acceso a mensajes de Internet (IMAP = Internet Message Access Protocol) para acceder a los correos en un servidor remoto. Soporta MIME para enviar archivos adjuntos y en particular proporciona libreta de contactos, gestión de carpetas, búsquedas de mensajes y verificación ortográfica.
Usar RoundcubeTras instalar Roundcube se puede acceder a él en https://<tu_freedombox>/roundcube. Introduce tu usuario y contraseña. El usuario de muchos servicios de correo electrónico suele ser la propia dirección completa, como usuario_de_ejemplo@servicio_de_ejemplo.org, no solo el usuario usuario_de_ejemplo. Introduce la dirección del servidor IMAP de tu servicio de correo electrónico en el campo Servidor. Puedes probar a poner aquí tu nombre de dominio como servicio_de_ejemplo.org si la dirección es usuario_de_ejemplo@servicio_de_ejemplo.org y si esto no funciona consulta la dirección del servidor IMAP en la documentación de tu proveedor de correo electrónico. Se recomienda encarecidamente usar una conexión cifrada a tu servidor IMAP. Para ello inserta el prefijo "imaps://" al principio de la dirección del servidor IMAP. Por ejemplo, imaps://imap.servicio_de_ejemplo.org. Logging into your IMAP server
Usar Gmail con RoundcubeSi quieres usar Roundcube con tu cuenta Gmail necesitas habilitar primero el ingreso con contraseña en las preferencias de tu cuenta Google porque Gmail no va a permitir por defecto que ingresen aplicaciones mediante contraseña. Para hacerlo visita las preferencias de la Cuenta Google y habilita Apps Menos seguras. A continuación ingresa en Roundcube introduciendo tu dirección de Gmail como Usuario y tu contraseña. En el campo servidor pon imaps://imap.gmail.com. Logging into Gmail Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Roundcube72020-05-30 19:42:50SunilMohanAdapaUpdate the title to emphasize app name over its generic name62020-05-24 06:42:50fioddorSe alinea con la versión 09 en inglés del 23 de mayo de 202052019-09-11 09:40:48fioddorCorrección menor42019-09-11 09:40:18fioddorCorrección menor32019-09-11 09:39:03fioddorCorrección menor22019-09-11 09:37:31fioddor12019-09-11 09:35:26fioddorSe crea la versión española.
Roundcube (Cliente de Correo Electrónico (Email))
¿Qué es Roundcube?Roundcube es un cliente de correo electrónico (email) para navegador con un interfaz de usuario parecido a una aplicación de escritorio. Admite varios lenguajes. Roundcube usa el protocolo de acceso a mensajes de Internet (IMAP = Internet Message Access Protocol) para acceder a los correos en un servidor remoto. Soporta MIME para enviar archivos adjuntos y en particular proporciona libreta de contactos, gestión de carpetas, búsquedas de mensajes y verificación ortográfica.
Usar RoundcubeTras instalar Roundcube se puede acceder a él en https://<tu_freedombox>/roundcube. Introduce tu usuario y contraseña. El usuario de muchos servicios de correo electrónico suele ser la propia dirección completa, como usuario_de_ejemplo@servicio_de_ejemplo.org, no solo el usuario usuario_de_ejemplo. Introduce la dirección del servidor IMAP de tu servicio de correo electrónico en el campo Servidor. Puedes probar a poner aquí tu nombre de dominio como servicio_de_ejemplo.org si la dirección es usuario_de_ejemplo@servicio_de_ejemplo.org y si esto no funciona consulta la dirección del servidor IMAP en la documentación de tu proveedor de correo electrónico. Se recomienda encarecidamente usar una conexión cifrada a tu servidor IMAP. Para ello inserta el prefijo "imaps://" al principio de la dirección del servidor IMAP. Por ejemplo, imaps://imap.servicio_de_ejemplo.org. Logging into your IMAP server
Usar Gmail con RoundcubeSi quieres usar Roundcube con tu cuenta Gmail necesitas habilitar primero el ingreso con contraseña en las preferencias de tu cuenta Google porque Gmail no va a permitir por defecto que ingresen aplicaciones mediante contraseña. Para hacerlo visita las preferencias de la Cuenta Google y habilita Apps Menos seguras. A continuación ingresa en Roundcube introduciendo tu dirección de Gmail como Usuario y tu contraseña. En el campo servidor pon imaps://imap.gmail.com. Logging into Gmail Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Samba.raw.xml b/doc/manual/es/Samba.raw.xml index 6dc427e66..35792d5d0 100644 --- a/doc/manual/es/Samba.raw.xml +++ b/doc/manual/es/Samba.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Samba62020-05-12 08:53:09fioddorMejora menor. Algo más exacto.52020-05-12 08:49:07fioddorSe alinea con la versión 07 en inglés del 12 de abril de 202042020-04-25 14:47:22fioddorSe alinea con la versión 6 en inglés del 23 de abril de 202032020-02-23 11:59:11fioddornomenclatura normalizada22020-02-11 21:56:57fioddorMinor corrections12020-02-11 21:55:07fioddorSe traduce una página nueva
Almacenamiento de Ficheros en Red (Samba)Samba te permite tener una carpeta compartida en la red local que se puede usar desde multiples ordenadores con sistemas operativos diferentes. De ahora en adelante nos referiremos a estas carpetas como "shares". Puedes tener una carpeta personal compartida por tus propios dispositivos (share casero), una compartida con un grupo de confianza (share de grupo) o una compartida con todo dispositivo de la red (share abierto). Samba te permite tratar un share como si fueran carpetas locales de tu ordenador. No obstante los shares solo están disponibles en la red local. Para aprender más acerca de Samba, mira la documentación de usuario de su wiki. Disponible desde la versión: 19.22
Usar SambaTras la instalación, puedes elegir qué discos compartir. Los shares habilitados están accesibles en el administrador de archivos de tu ordenador en la ruta \\freedombox (en Windows) o smb://freedombox.local (en Linux y Mac). Hay 3 tipos de share para elegir: Share abierto - accesible a cualquiera en tu red local. Share de grupo - accesible solo a usuarios FreedomBox que estén en el grupo freedombox-share. Share casero - cada usuario del grupo freedombox-share puede tener su propio espacio privado.
En AndroidPara acceder a shares Samba desde un dispositivo Android instala el "Cliente Samba para Android" desde F-Droid o Google Play. Introduce smb://freedombox.local/<disco> como ruta del share en la app. Tus carpetas compartidas deberían estar visibles en la app de administración de archivos.
Integración con otras appsLa app Transmission de FreedomBox proporciona una configuración para permitir que las descargas se graben directamente en un share Samba. Si quieres dejar disponibles en Samba ficheros sincronizados con Syncthing tienes que asegurarte de sincronizar en la carpeta compartida de Samba. Además, para dejar las carpetas de Syncthing disponibles en carpetas abiertas o de grupo de Samba necesitas asegurarte de pulsar el botón "Permisos > Ignorar" bajo la pestaña "Avanzado" de la carpeta en el interfaz web de usuario de Syncthing. Esto permitirá escribir los ficheros mediante Samba.
Comparación con otras apps
SyncthingSyncthing mantiene una copia de la carpeta compartida en cada dispositivo con el que se comparte. Samba mantiene solo una copy en tu dispositivo FreedomBox. Syncthing puede sincronizar tus carpetas compartidas entre dispositivos por Internet. Los shares Samba solo están disponibles en tu red local. Como Syncthing es primordialmente una solución de sincronización, tiene funcionalidades como resolución de conflictos y versionado. Samba solo tiene una copia del fichero, así que no necesita tales funcionalidades. Por ejemplo, si dos personas están editando una hoja de cálculo almacenada en un share Samba el último que grabe el fichero gana. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Samba92020-05-30 19:43:15SunilMohanAdapaUpdate the title to emphasize app name over its generic name82020-05-26 13:19:06fioddorSe alinea con la versión 10 en inglés del 25 de mayo de 202072020-05-24 06:55:40fioddorSe alinea con la versión 09 en inglés del 23 de mayo de 202062020-05-12 08:53:09fioddorMejora menor. Algo más exacto.52020-05-12 08:49:07fioddorSe alinea con la versión 07 en inglés del 12 de abril de 202042020-04-25 14:47:22fioddorSe alinea con la versión 6 en inglés del 23 de abril de 202032020-02-23 11:59:11fioddornomenclatura normalizada22020-02-11 21:56:57fioddorMinor corrections12020-02-11 21:55:07fioddorSe traduce una página nueva
Samba (Almacenamiento de Ficheros en Red)Samba te permite tener una carpeta compartida en la red local que se puede usar desde multiples ordenadores con sistemas operativos diferentes. De ahora en adelante nos referiremos a estas carpetas como "shares". Puedes tener una carpeta personal compartida por tus propios dispositivos (share casero), una compartida con un grupo de confianza (share de grupo) o una compartida con todo dispositivo de la red (share abierto). Samba te permite tratar un share como si fueran carpetas locales de tu ordenador. No obstante los shares solo están disponibles en la red local. Para aprender más acerca de Samba, mira la documentación de usuario de su wiki. Disponible desde la versión: 19.22
Usar SambaTras la instalación, puedes elegir qué discos compartir. Los shares habilitados están accesibles en el administrador de archivos de tu ordenador en la ruta \\freedombox (en Windows) o smb://freedombox.local (en Linux y Mac). Hay 3 tipos de share para elegir: Share abierto - accesible a cualquiera en tu red local. Share de grupo - accesible solo a usuarios FreedomBox que estén en el grupo freedombox-share. Share casero - cada usuario del grupo freedombox-share puede tener su propio espacio privado.
En AndroidPara acceder a shares Samba desde un dispositivo Android instala el "Cliente Samba para Android" desde F-Droid o Google Play. Introduce smb://freedombox.local/<disco> como ruta del share en la app. Tus carpetas compartidas deberían estar visibles en la app de administración de archivos. También VLC para Android puede detectar automáticamente y usar los shares Samba.
Integración con otras appsLa app Transmission de FreedomBox proporciona una configuración para permitir que las descargas se graben directamente en un share Samba. Si quieres dejar disponibles en Samba ficheros sincronizados con Syncthing tienes que asegurarte de sincronizar en la carpeta compartida de Samba. Además, para dejar las carpetas de Syncthing disponibles en carpetas abiertas o de grupo de Samba necesitas asegurarte de pulsar el botón "Permisos > Ignorar" bajo la pestaña "Avanzado" de la carpeta en el interfaz web de usuario de Syncthing. Esto permitirá escribir los ficheros mediante Samba.
Comparación con otras apps
SyncthingSyncthing mantiene una copia de la carpeta compartida en cada dispositivo con el que se comparte. Samba mantiene solo una copy en tu dispositivo FreedomBox. Syncthing puede sincronizar tus carpetas compartidas entre dispositivos por Internet. Los shares Samba solo están disponibles en tu red local. Como Syncthing es primordialmente una solución de sincronización, tiene funcionalidades como resolución de conflictos y versionado. Samba solo tiene una copia del fichero, así que no necesita tales funcionalidades. Por ejemplo, si dos personas están editando una hoja de cálculo almacenada en un share Samba el último que grabe el fichero gana. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Searx.raw.xml b/doc/manual/es/Searx.raw.xml index 2c6ed1138..3d90d2a9f 100644 --- a/doc/manual/es/Searx.raw.xml +++ b/doc/manual/es/Searx.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Searx42020-04-13 16:25:42fioddorSe alinea con la versión 09 en inglés del 12 de abril de 202032019-09-16 12:06:12fioddorCorrección menor22019-09-16 12:04:34fioddorSe crea la versión española.12019-09-16 11:39:36fioddor
Búsqueda Web (Searx)
Acerca de SearxSearx es un metabuscador. Un metabuscador agrega los resultados de varios buscadores y los presenta en un interfaz unificado. Lee más acerca de Searx en su sitio web oficial. Disponible desde: versión 0.24.0
Captura de pantallaSearx Screenshot
VídeoSearx installation and first steps (14 MB)
¿Por qué usar Searx?
Personalización y Burbujas por FiltradoLos buscadores tienen la capacidad de perfilar a sus usuarios y les sirven los resultados más relevantes para ellos, encerrandoles en burbujas por filtrado y distorsionando la visión que la gente tiene del mundo. Los buscadores tienen un incentivo financiero para servir publicidad interesante a sus usuarios, ya que incrementa la probabilidad de que hagan clic en los anuncios. Un metabuscador es una solución posible a este problema, ya que agrega resultados de multiples buscadores puenteando así los intentos de personalización de los buscadores. Searx evita almacenar cookies de buscadores para eludir traceos y perfilados de buscadores.
Filtrado de publicidadSearx filtra anuncios de los resultados de búsqueda antes de servirlos al usuario, con lo que mejora la relevancia de tus resultados y te evita distracciones.
PrivacidadSearx usa por defecto HTTP POST en vez de GET para enviar tus consultas de búsqueda a los buscadores, así que si alguien espía tu tráfico no podrá leerlas. Tampoco se almacenarán las consultas en el histórico de tu navegador. Nota: Searx usado desde la barra (omnibar) del navegador Chrome hará peticiones GET en vez de POST.
Searx en FreedomBoxEn FreedomBox Searx usa las credenciales únicas de Single Sign On. Esto implica que tienes que haber ingresado en tu FreedomBox con el navegador en el que estás usando Searx. Se puede acceder fácilmente a SearX a través de Tor. Se puede añadir a Searx a la barra de buscadores del navegador Firefox. Mira la Ayuda de Firefox acerca de este asunto. Una vez esté Searx añadido también podrás establecerlo como tu buscador por defecto. Searx también ofrece resultados de búsqueda en formatos csv, json y rss, que se pueden usar desde scripts para automatizar algunas tareas. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Searx62020-05-30 19:43:39SunilMohanAdapaUpdate the title to emphasize app name over its generic name52020-05-23 22:49:23fioddorSe alinea con la versión 10 en inglés del 23 de mayo de 202042020-04-13 16:25:42fioddorSe alinea con la versión 09 en inglés del 12 de abril de 202032019-09-16 12:06:12fioddorCorrección menor22019-09-16 12:04:34fioddorSe crea la versión española.12019-09-16 11:39:36fioddor
Searx (Búsqueda Web)
Acerca de SearxSearx es un metabuscador. Un metabuscador agrega los resultados de varios buscadores y los presenta en un interfaz unificado. Lee más acerca de Searx en su sitio web oficial. Disponible desde: versión 0.24.0
Captura de pantallaSearx Screenshot
VídeoSearx installation and first steps (14 MB)
¿Por qué usar Searx?
Personalización y Burbujas por FiltradoLos buscadores tienen la capacidad de perfilar a sus usuarios y les sirven los resultados más relevantes para ellos, encerrandoles en burbujas por filtrado y distorsionando la visión que la gente tiene del mundo. Los buscadores tienen un incentivo financiero para servir publicidad interesante a sus usuarios, ya que incrementa la probabilidad de que hagan clic en los anuncios. Un metabuscador es una solución posible a este problema, ya que agrega resultados de multiples buscadores puenteando así los intentos de personalización de los buscadores. Searx evita almacenar cookies de buscadores para eludir traceos y perfilados de buscadores.
Filtrado de publicidadSearx filtra anuncios de los resultados de búsqueda antes de servirlos al usuario, con lo que mejora la relevancia de tus resultados y te evita distracciones.
PrivacidadSearx usa por defecto HTTP POST en vez de GET para enviar tus consultas de búsqueda a los buscadores, así que si alguien espía tu tráfico no podrá leerlas. Tampoco se almacenarán las consultas en el histórico de tu navegador. Nota: Searx usado desde la barra (omnibar) del navegador Chrome hará peticiones GET en vez de POST.
Searx en FreedomBoxEn FreedomBox Searx usa las credenciales únicas de Single Sign On. Esto implica que tienes que haber ingresado en tu FreedomBox con el navegador en el que estás usando Searx. Se puede acceder fácilmente a SearX a través de Tor. Se puede añadir a Searx a la barra de buscadores del navegador Firefox. Mira la Ayuda de Firefox acerca de este asunto. Una vez esté Searx añadido también podrás establecerlo como tu buscador por defecto. Searx también ofrece resultados de búsqueda en formatos csv, json y rss, que se pueden usar desde scripts para automatizar algunas tareas. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/SecureShell.raw.xml b/doc/manual/es/SecureShell.raw.xml index c86f7a352..053f893ec 100644 --- a/doc/manual/es/SecureShell.raw.xml +++ b/doc/manual/es/SecureShell.raw.xml @@ -1,4 +1,4 @@ -
es/FreedomBox/Manual/SecureShell92020-04-13 16:26:38fioddorSe alinea con la versión 16 en inglés del 12 de abril de 202082020-04-04 20:24:38fioddorSe alinea con la versión 15 inglés del 04 de abril de 202072020-04-04 20:18:47fioddorCorrección menor62020-04-04 20:05:06fioddorSe alinea con la versión 14 inglés del 04 de abril de 202052020-04-04 20:00:07fioddorCorrección menor42019-11-14 18:13:56fioddorSe alinea con la versión 13 en inglés del 11 de noviembre de 201932019-08-20 08:32:32fioddorSe incorpora la traducción de una sección nueva.22019-08-20 07:08:46fioddorSe incorpora la traducción de una sección nueva.12019-08-20 07:02:24fioddorSe crea la versión española.
Shell Segura
¿Qué es Shell Segura?FreedomBox ejecuta el servidor openssh-server por defecto permitiendo así accesos remotos desde todos los interfaces. Si tu dispositivo hardware está conectado a un monitor y un teclado, también puedes ingresar directamente. Para la operación habitual de FreedomBox no necesitas usar la shell. No obstante, algunas tareas o identificación de algún problema podrían requerirlo.
Configurando una Cuenta de Usuario
Primer ingreso a Plinth: Cuenta de AdminAl crear una cuenta en Plinth por primera vez, el usuario tendrá automaticamente privilegios de administrador. Los usuarios Admin pueden ingresar mediante ssh (abajo se explica cómo) y escalar sus privilegios a superusuario mediante sudo.
Cuenta de Usuario por DefectoNota: Si puedes acceder al interfaz web de FreedomBox es que no necesitas hacer esto. Puedes usar la cuenta de usuario del interfaz web de FreedomBox para conectar por SSH. Las imagenes precompiladas FreedomBox tienen una cuenta de usuario llamada fbx pero no tiene contraseña establecida, así que no se puede ingresar con esta cuenta. Hay un script incluído en el programa freedom-maker que permite establecer la contraseña de esta cuenta si fuera necesario: Descomprime la imagen. Obtén una copia de freedom-maker en . Ejecuta sudo ./bin/passwd-in-image <archivo_de_imagen> fbx. Copia el archivo de la imagen a la tarjeta SD e inicia el dispositivo. El usuario "fbx" también tiene privilegios de superusuario mediante sudo.
Ingresando
LocalPara ingresar mediante SSH a tu FreedomBox: Reemplaza fbx por el usuario con el que quieres ingresar. Hay que reemplazar freedombox por el hostname o dirección IP de tu dispositivo FreedomBox como se indica en el proceso de Inicio rápido. fbx es el usuario de FreedomBox con privilegios de superusuario por defecto. Cualquier otro usuario creado con Plinth que pertenezca al grupo admin podrá ingresar. La cuenta root no tiene contraseña configurada y no podrá ingresar. A todos los demás usuarios se les denegará el acceso. fbx y los otros usuarios del grupo admin podrán ingresar directamente por el terminal. A todos los demás usuarios se les denegará el acceso. Si fallas repetidamente intentando ingresar se te bloqueará el acceso por algún tiempo. Esto se debe al paquete libpam-abl que FreedomBox instala por defecto. Para controlar este comportamiento consulta la documentación de libpam-abl.
SSH via TorSi tienes habilitados en Plinth los servicios Tor Onion puedes acceder a tu FreedomBox mediante ssh sobre Tor. Instala netcat-openbsd. Edita ~/.ssh/config para habilitar conexiones sobre Tor. Añade lo siguiente:
es/FreedomBox/Manual/SecureShell102020-05-24 07:50:22fioddorSe alinea con la versión 18 en inglés del 23 de mayo de 202092020-04-13 16:26:38fioddorSe alinea con la versión 16 en inglés del 12 de abril de 202082020-04-04 20:24:38fioddorSe alinea con la versión 15 inglés del 04 de abril de 202072020-04-04 20:18:47fioddorCorrección menor62020-04-04 20:05:06fioddorSe alinea con la versión 14 inglés del 04 de abril de 202052020-04-04 20:00:07fioddorCorrección menor42019-11-14 18:13:56fioddorSe alinea con la versión 13 en inglés del 11 de noviembre de 201932019-08-20 08:32:32fioddorSe incorpora la traducción de una sección nueva.22019-08-20 07:08:46fioddorSe incorpora la traducción de una sección nueva.12019-08-20 07:02:24fioddorSe crea la versión española.
Shell Segura
¿Qué es Shell Segura?FreedomBox ejecuta el servidor openssh-server por defecto permitiendo así accesos remotos desde todos los interfaces. Si tu dispositivo hardware está conectado a un monitor y un teclado, también puedes ingresar directamente. Para la operación habitual de FreedomBox no necesitas usar la shell. No obstante, algunas tareas o identificación de algún problema podrían requerirlo.
Configurando una Cuenta de Usuario
Primer ingreso a FreedomBox: Cuenta de AdminAl crear una cuenta en FreedomBox por primera vez, el usuario tendrá automaticamente privilegios de administrador. Los usuarios Admin pueden ingresar mediante ssh (abajo se explica cómo) y escalar sus privilegios a superusuario mediante sudo.
Cuenta de Usuario por DefectoNota: Si puedes acceder al interfaz web de FreedomBox es que no necesitas hacer esto. Puedes usar la cuenta de usuario del interfaz web de FreedomBox para conectar por SSH. Las imagenes precompiladas FreedomBox tienen una cuenta de usuario llamada fbx pero no tiene contraseña establecida, así que no se puede ingresar con esta cuenta. Hay un script incluído en el programa freedom-maker que permite establecer la contraseña de esta cuenta si fuera necesario: Descomprime la imagen. Obtén una copia de freedom-maker en . Ejecuta sudo ./bin/passwd-in-image <archivo_de_imagen> fbx. Copia el archivo de la imagen a la tarjeta SD e inicia el dispositivo. El usuario "fbx" también tiene privilegios de superusuario mediante sudo.
Ingresando
LocalPara ingresar mediante SSH a tu FreedomBox: Reemplaza fbx por el usuario con el que quieres ingresar. Hay que reemplazar freedombox por el hostname o dirección IP de tu dispositivo FreedomBox como se indica en el proceso de Inicio rápido. fbx es el usuario de FreedomBox con privilegios de superusuario por defecto. Cualquier otro usuario creado con FreedomBox que pertenezca al grupo admin podrá ingresar. La cuenta root no tiene contraseña configurada y no podrá ingresar. A todos los demás usuarios se les denegará el acceso. fbx y los otros usuarios del grupo admin podrán ingresar directamente por el terminal. A todos los demás usuarios se les denegará el acceso. Si fallas repetidamente intentando ingresar se te bloqueará el acceso por algún tiempo. Esto se debe al paquete libpam-abl que FreedomBox instala por defecto. Para controlar este comportamiento consulta la documentación de libpam-abl.
SSH via TorSi tienes habilitados en FreedomBox los servicios Tor Onion puedes acceder a tu FreedomBox mediante ssh sobre Tor. Instala netcat-openbsd. Edita ~/.ssh/config para habilitar conexiones sobre Tor. Añade lo siguiente: Reemplaza USUARIO por un usuario del grupo admin (ver arriba). En algunos casos podrías necesitar reemplazar 9050 por 9150. Ahora, para conectar a la FreedomBox abre un terminal y teclea: Reemplaza USUARIO por un usuario del grupo admin y DIRECCION por la dirección del servicio Tor Onion para SSH de tu FreedomBox.
Escalar a SuperusuarioSi después de ingresar quieres volverte superusuario para realizar actividades administrativas: Habitúate a ingresar como root solo cuando sea estrictamente necesario. Si no ingresas como root no puedes romperlo todo accidentalmente.
Cambiar ContraseñasPara cambiar la contraseña de un usuario administrado en el interfaz web de FreedomBox usa la página Cambiar clave de acceso. El usuario por debecto fbx no se administra en el interfaz web de FreedomBox y su contraseña no se puede cambiar desde él. Para cambiar la contraseña en el terminal ingresa a tu FreedomBox con el usuario cuya contraseña quieres cambiar y ejecuta el siguiente comando: Esto te preguntará tu contraseña actual antes de darte la oportunidad de establecer la nueva. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file + ProxyCommand nc -X 5 -x 127.0.0.1:9050 %h %p]]>
Reemplaza USUARIO por un usuario del grupo admin (ver arriba). En algunos casos podrías necesitar reemplazar 9050 por 9150. Ahora, para conectar a la FreedomBox abre un terminal y teclea: Reemplaza USUARIO por un usuario del grupo admin y DIRECCION por la dirección del servicio Tor Onion para SSH de tu FreedomBox.
Escalar a SuperusuarioSi después de ingresar quieres volverte superusuario para realizar actividades administrativas: Habitúate a ingresar como root solo cuando sea estrictamente necesario. Si no ingresas como root no puedes romperlo todo accidentalmente.
Cambiar ContraseñasPara cambiar la contraseña de un usuario administrado en el interfaz web de FreedomBox usa la página Cambiar clave de acceso. El usuario por debecto fbx no se administra en el interfaz web de FreedomBox y su contraseña no se puede cambiar desde él. Para cambiar la contraseña en el terminal ingresa a tu FreedomBox con el usuario cuya contraseña quieres cambiar y ejecuta el siguiente comando: Esto te preguntará tu contraseña actual antes de darte la oportunidad de establecer la nueva. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Security.raw.xml b/doc/manual/es/Security.raw.xml index 60eef090b..0d0616cad 100644 --- a/doc/manual/es/Security.raw.xml +++ b/doc/manual/es/Security.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Security62020-04-11 10:27:12fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_15425852020-04-04 20:36:39fioddorSe alinea la traducción del literal con el interfaz web.42020-04-04 20:34:34fioddorSe usa imagen traducida y más actual.32020-04-04 20:32:39fioddorSe alinea la traducción del nombre de la página con el interfaz web.22019-10-14 07:25:52fioddorSe actualiza a la versión inglesa 03 del 12 de octubre de 2019.12019-06-19 12:14:30fioddorSe crea la versión española.
ProtecciónCuando se habilita esta opción sólo los usuarios del grupo "admin" podrán entrar a la consola o mediante SSH. Los usuarios de consola podrán acceder a algunos servicios sin más autorización. La sección Usuarios explica cómo definir grupos de usuarios. Cuando la opción Acceso a consola restringido está habilitada, sólo los usuarios del grupo admin podrán ingresar via consola, shell segura (SSH) o interfaz gráfico. Al desactivar esta funcionalidad cualquier usuario con cuenta en FreedomBox podrá ingresar y quizá tener acceso a ciertos servicios sin más autorización. Esta opción solo debería desactivarse si se confía plenamente en todos los usuarios del sistema. Si quieres usar tu máquina FreedomBox también como escritorio y admitir que usuarios no-admin ingresen mediante interfáz gráfica esta opción debe estar desactivada. Puedes determinar la lista de usuarios admin en la sección Users. Security_es_v01.png Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Security62020-04-11 10:27:12fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_15425852020-04-04 20:36:39fioddorSe alinea la traducción del literal con el interfaz web.42020-04-04 20:34:34fioddorSe usa imagen traducida y más actual.32020-04-04 20:32:39fioddorSe alinea la traducción del nombre de la página con el interfaz web.22019-10-14 07:25:52fioddorSe actualiza a la versión inglesa 03 del 12 de octubre de 2019.12019-06-19 12:14:30fioddorSe crea la versión española.
ProtecciónCuando se habilita esta opción sólo los usuarios del grupo "admin" podrán entrar a la consola o mediante SSH. Los usuarios de consola podrán acceder a algunos servicios sin más autorización. La sección Usuarios explica cómo definir grupos de usuarios. Cuando la opción Acceso a consola restringido está habilitada, sólo los usuarios del grupo admin podrán ingresar via consola, shell segura (SSH) o interfaz gráfico. Al desactivar esta funcionalidad cualquier usuario con cuenta en FreedomBox podrá ingresar y quizá tener acceso a ciertos servicios sin más autorización. Esta opción solo debería desactivarse si se confía plenamente en todos los usuarios del sistema. Si quieres usar tu máquina FreedomBox también como escritorio y admitir que usuarios no-admin ingresen mediante interfáz gráfica esta opción debe estar desactivada. Puedes determinar la lista de usuarios admin en la sección Users. Security_es_v01.png Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/ServiceDiscovery.raw.xml b/doc/manual/es/ServiceDiscovery.raw.xml index 43ba85a97..8f2415a5c 100644 --- a/doc/manual/es/ServiceDiscovery.raw.xml +++ b/doc/manual/es/ServiceDiscovery.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/ServiceDiscovery12019-06-19 12:36:54fioddorSe crea la versión española.
Detección de ServiciosLa Detección de Servicios permite a otros dispositivos de la red detectar a tu FreedomBox y a los servicios que expone. Si un cliente de la red local soporta mDNS, puede encontrar tu FreedomBox en <hostname>.local (por ejemplo: freedombox.local). También permite a FreedomBox detectar otros dispositivos y servicios que están funcionando en tu red local. La Detección de Servicios no es esencial y solo funciona en redes internas. Se puede deshabilitar para mejorar la seguridad especialmente cuando la conectas a una red local hostil. Volver a la descripción de Funcionalidades o a las páginas del manual. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/ServiceDiscovery12019-06-19 12:36:54fioddorSe crea la versión española.
Detección de ServiciosLa Detección de Servicios permite a otros dispositivos de la red detectar a tu FreedomBox y a los servicios que expone. Si un cliente de la red local soporta mDNS, puede encontrar tu FreedomBox en <hostname>.local (por ejemplo: freedombox.local). También permite a FreedomBox detectar otros dispositivos y servicios que están funcionando en tu red local. La Detección de Servicios no es esencial y solo funciona en redes internas. Se puede deshabilitar para mejorar la seguridad especialmente cuando la conectas a una red local hostil. Volver a la descripción de Funcionalidades o a las páginas del manual. InformationSupportContributeReportsPromoteOverview Hardware Live Help Where To Start Translate Calls Talks Features Vision Q&A Design To Do Releases Press Download Manual Code Contributors Blog FreedomBox for Communities FreedomBox Developer Manual HELP & DISCUSSIONS: Discussion Forum - Mailing List - #freedombox irc.debian.org | CONTACT Foundation | JOIN Project Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 This page is copyright its contributors and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Shadowsocks.raw.xml b/doc/manual/es/Shadowsocks.raw.xml index 74cbd8fd7..71cae9ebb 100644 --- a/doc/manual/es/Shadowsocks.raw.xml +++ b/doc/manual/es/Shadowsocks.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Shadowsocks22019-09-14 09:52:23fioddorCorrección menor12019-09-14 09:45:29fioddorSe crea la versión española.
Proxy SOCKS5 (Shadowsocks)
¿Qué es Shadowsocks?Shadowsocks es un proxy SOCKS5 ligero y seguro, diseñado para proteger tu tráfico Internet. Se puede usar para eludir la censura y los filtros de Internet. Tu FreedomBox puede ejecutar un cliente Shadowsocks que puede conectar con un servidor Shadowsocks. También ejecutará un proxy SOCKS5. Los dispositivos locales pueden conectar con este proxy y sus datos serán cifrados y retransmitidos a través del sevidor Shadowsocks. Nota: Shadowsocks está disponible en FreedomBox a partir de la versión 0.18 de Plinth.
Usar el cliente ShadowsocksLa implementación actual de Shadowsocks en FreedomBox solo soporta configurar FreedomBox como cliente Shadowsocks. Este caso de uso sería así: El client de Shadowsocks (FreedomBox) está en una región en la que partes de Internet están bloqueadas o censuradas. El servidor de Shadowsocks está en una región diferente que no tiene esos bloqueos. FreedomBox proporciona un servicio de proxy SOCKS en la red local para que otros dispositivos hagan uso de la conexión Shadowsocks. En el futuro será posible configurar FreedomBox como servidor Shadowsocks.
Configurar tu FreedomBox para el cliente ShadowsocksPara habilitar Shadowsocks primero navega a la página Proxy Socks5 (Shadowsocks) e instalalo. Servidor: el servidor Shadowsocks no es la IP o la URL de FreedomBox, sino que será otro servidor o VPS configurado como tal (servidor Shadowsocks). También hay algunos servidores Shadowsocks públicos listados en la web, pero sé consciente de que quienquiera que opere el servidor puede ver a dónde van las peticiones y cualquier dato no cifrado que se transmita. Para usar Shadowsocks una vez instalado configura la URL del proxy SOCKS5 en tu dispositivo, navegador o aplicación como http://<tu_freedombox>:1080/. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Shadowsocks42020-05-30 19:43:58SunilMohanAdapaUpdate the title to emphasize app name over its generic name32020-05-24 07:07:26fioddorSe alinea con la versión 04 en inglés del 23 de mayo de 202022019-09-14 09:52:23fioddorCorrección menor12019-09-14 09:45:29fioddorSe crea la versión española.
Shadowsocks (Proxy SOCKS5)
¿Qué es Shadowsocks?Shadowsocks es un proxy SOCKS5 ligero y seguro, diseñado para proteger tu tráfico Internet. Se puede usar para eludir la censura y los filtros de Internet. Tu FreedomBox puede ejecutar un cliente Shadowsocks que puede conectar con un servidor Shadowsocks. También ejecutará un proxy SOCKS5. Los dispositivos locales pueden conectar con este proxy y sus datos serán cifrados y retransmitidos a través del sevidor Shadowsocks. Nota: Shadowsocks está disponible en FreedomBox a partir de la versión 0.18.
Usar el cliente ShadowsocksLa implementación actual de Shadowsocks en FreedomBox solo soporta configurar FreedomBox como cliente Shadowsocks. Este caso de uso sería así: El client de Shadowsocks (FreedomBox) está en una región en la que partes de Internet están bloqueadas o censuradas. El servidor de Shadowsocks está en una región diferente que no tiene esos bloqueos. FreedomBox proporciona un servicio de proxy SOCKS en la red local para que otros dispositivos hagan uso de la conexión Shadowsocks. En el futuro será posible configurar FreedomBox como servidor Shadowsocks.
Configurar tu FreedomBox para el cliente ShadowsocksPara habilitar Shadowsocks primero navega a la página Proxy Socks5 (Shadowsocks) e instalalo. Servidor: el servidor Shadowsocks no es la IP o la URL de FreedomBox, sino que será otro servidor o VPS configurado como tal (servidor Shadowsocks). También hay algunos servidores Shadowsocks públicos listados en la web, pero sé consciente de que quienquiera que opere el servidor puede ver a dónde van las peticiones y cualquier dato no cifrado que se transmita. Para usar Shadowsocks una vez instalado configura la URL del proxy SOCKS5 en tu dispositivo, navegador o aplicación como http://<tu_freedombox>:1080/. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Snapshots.raw.xml b/doc/manual/es/Snapshots.raw.xml index 622187d02..58ec9cbcd 100644 --- a/doc/manual/es/Snapshots.raw.xml +++ b/doc/manual/es/Snapshots.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Snapshots22020-04-04 21:17:11fioddorCorrección menor12019-06-20 14:29:35fioddorSe crea la versión española.
InstantáneasLas Instantáneas te permiten crear instantáneas del sistema de archivos y devolver al sistema a un estado anterior. Nota: Esta funcionalidad requiere un sistema de archivos Btrfs. Todas las imágenes de disco de FreedomBox estables usan Btrfs. Instantáneas Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Snapshots32020-05-30 19:55:19SunilMohanAdapaMatch title with FreedomBox interface22020-04-04 21:17:11fioddorCorrección menor12019-06-20 14:29:35fioddorSe crea la versión española.
Almacén de instantáneasLas Instantáneas te permiten crear instantáneas del sistema de archivos y devolver al sistema a un estado anterior. Nota: Esta funcionalidad requiere un sistema de archivos Btrfs. Todas las imágenes de disco de FreedomBox estables usan Btrfs. Instantáneas Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Storage.raw.xml b/doc/manual/es/Storage.raw.xml index ce493e536..b4ff71ba0 100644 --- a/doc/manual/es/Storage.raw.xml +++ b/doc/manual/es/Storage.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Storage12019-06-20 14:42:39fioddorSe crea la versión española.
AlmacenamientoAlmacenamiento te permite ver los dispositivos de almacenamiento conectados a tu FreedomBox y el uso de su espacio. FreedomBox puede detectar y montar automáticamente medios extraíbles como unidades flash USB. Se muestran listados bajo la sección Dispositivos extraíbles junto con una opción para expulsarlos. Si queda espacio libre detrás de la partición de root, se mostrará también la opción para expandirla. Normalmente no se muestra ya que en el primer arranque de la FreedomBox se produce automáticamente una expansión total de la partición de root. Storage.png Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Storage22020-05-24 08:44:49fioddorSe alinea con la versión 12 en inglés del 24 de mayo de 202012019-06-20 14:42:39fioddorSe crea la versión española.
AlmacenamientoAlmacenamiento te permite ver los dispositivos de almacenamiento conectados a tu FreedomBox y el uso de su espacio. FreedomBox puede detectar y montar automáticamente medios extraíbles como unidades flash USB. Se muestran listados bajo la sección Dispositivos extraíbles junto con una opción para expulsarlos. Si queda espacio libre detrás de la partición de root, se mostrará también la opción para expandirla. Normalmente no se muestra ya que en el primer arranque de la FreedomBox se produce automáticamente una expansión total de la partición de root. Storage.png
Operación de almacenamiento avanzadaCockpit proporciona muchas funcionalidades de almacenamiento más avanzadas que las de FreedomBox. Ambos, FreedomBox y Cockpit, operan sobre el demonio de almacenamiento Udisks2 y son por ello compatibles entre sí. Entre las funciones proporcionadas por Cockpit se incluyen: Formatear un disco o partición con un nuevo sistema de ficheros. Añadir, eliminar particiones o borrar la tabla de particiones. Crear y desbloquear sistemas de ficheros cifrados. Crear y administrar dispositivos RAID. storage-cockpit.png Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Syncthing.raw.xml b/doc/manual/es/Syncthing.raw.xml index 1e835f28d..92b93e73a 100644 --- a/doc/manual/es/Syncthing.raw.xml +++ b/doc/manual/es/Syncthing.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Syncthing52019-11-14 18:11:07fioddorSe alinea con la versión 18 en inglés del 11 de noviembre de 201942019-11-04 11:25:50fioddorSe alinea con la versión 14 del 01 de noviembre de 201932019-10-28 09:30:15fioddorSe alinea con la versión 14 del 27 de octubre de 201922019-09-11 15:32:18fioddorSe crea la versión española.12019-09-11 15:25:11fioddorSe crea la versión española.
Sincronización de Archivos (Syncthing)Con Syncthing instalado en tu FreedomBox puedes sincronizar contenido desde otros dispositivos a tu FreedomBox y vice-versa. Por ejemplo puedes mantener sincronizadas las fotos tomadas desde tu teléfono móvil con tu FreedomBox. Disponible desde versión: 0.14. Syncthing es una solución de sincronización entre pares, no una de tipo cliente-servidor. Esto implica que FreedomBox no es realmente el servidor y tus otros dispositivos no son sus clientes. Desde la perspectiva de Syncthing todos son dispositivos equivalentes. Puedes emplear Syncthing para sincronizar tus archivos entre cualquiera de tus dispositivos. La ventaja que aporta FreedomBox consiste en que como es un servidor está encendida (casi) siempre. Supón que quieres sincronizar las fotos de tu teléfono con tu portátil. Si sincronizas tu teléfono con FreedomBox el portátil podrá obtenerlas desde la FreedomBox cuando vuelva a conectarse. No necesitas preocuparte de cuando se conectan los otros dispositivos. Si tu FreedomBox es uno de los dispositivos configurados con la carpeta compartida de Syncthing puedes estár tranquilo que tus otros dispositivos se sincronizarán en cuanto se conecten. Tras instalarlo sigue estas instrucciones del proyecto Syncthing: Arrancando. Syncthing permite compartir selectivamente carpetas individuales. Antes de compartir los dispositivos tienen que estar emparejados leyendo códigos QR o introduciendo manualmente identificadores de dispositivo. Syncthing tiene un servicio de autodescubrimiento para identicar fácilmente a los otros dispositivos de la misma subred que tengan Syncthing instalado. Para acceder al cliente web de la instancia Syncthing que se ejecuta en tu FreedomBox, usa la ruta /syncthing. Actualmente este cliente web está accesible solo a los usuarios de FreedomBox que tengan privilegios de administrador aunque en alguna futura versión podría estarlo a todos los usuarios de FreedomBox. Syncthing web interface Syncthing tiene apps Android disponibles en F-Droid y Google Play. También hay disponibles aplicaciones de escritorio multiplataforma. Para más información acerca de Syncthing visita su sitio web oficial y su documentación.
Sincronizar via TorSyncthing debe sincronizar automáticamente con tu FreedomBox incluso cuando esta solo sea accesible como servicio Tor Onion. Si quieres enrutar tu cliente Syncthing via Tor configura la variable de entorno all_proxy: Para más información mira la documentación de Syncthing acerca de el uso de proxies.
Evitar repetidores de SyncthingSyncthing emplea por defecto conexiones dinámicas para conectar con otros pares. Esto significa que si estás sincronizando a través de Internet, los datos quizá tengan que atravesar repetidores de Syncthing públicos para alcanzar tus dispositivos. Esto desaprovecha que tu FreedomBox tenga una dirección IP pública. Al añadir tu FreedomBox como dispositivo en otros clientes de Syncthing establece tu dirección como "tcp://<mi.dominio.freedombox>" en vez de "dinámica". Esto permite a tus pares Syncthing conectarse diréctamente a tu FreedomBox eludiendo la necesidad de repetidores. También permite sincronización rápida bajo demanda si no quieres mantener a Syncthing ejecuándose todo el tiempo en tus dispositivos móviles. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Syncthing72020-05-30 19:44:24SunilMohanAdapaUpdate the title to emphasize app name over its generic name62020-05-24 06:54:22fioddorSe alinea con la versión 19 en inglés del 23 de mayo de 202052019-11-14 18:11:07fioddorSe alinea con la versión 18 en inglés del 11 de noviembre de 201942019-11-04 11:25:50fioddorSe alinea con la versión 14 del 01 de noviembre de 201932019-10-28 09:30:15fioddorSe alinea con la versión 14 del 27 de octubre de 201922019-09-11 15:32:18fioddorSe crea la versión española.12019-09-11 15:25:11fioddorSe crea la versión española.
Syncthing (Sincronización de Archivos)Con Syncthing instalado en tu FreedomBox puedes sincronizar contenido desde otros dispositivos a tu FreedomBox y vice-versa. Por ejemplo puedes mantener sincronizadas las fotos tomadas desde tu teléfono móvil con tu FreedomBox. Disponible desde versión: 0.14. Syncthing es una solución de sincronización entre pares, no una de tipo cliente-servidor. Esto implica que FreedomBox no es realmente el servidor y tus otros dispositivos no son sus clientes. Desde la perspectiva de Syncthing todos son dispositivos equivalentes. Puedes emplear Syncthing para sincronizar tus archivos entre cualquiera de tus dispositivos. La ventaja que aporta FreedomBox consiste en que como es un servidor está encendida (casi) siempre. Supón que quieres sincronizar las fotos de tu teléfono con tu portátil. Si sincronizas tu teléfono con FreedomBox el portátil podrá obtenerlas desde la FreedomBox cuando vuelva a conectarse. No necesitas preocuparte de cuando se conectan los otros dispositivos. Si tu FreedomBox es uno de los dispositivos configurados con la carpeta compartida de Syncthing puedes estár tranquilo que tus otros dispositivos se sincronizarán en cuanto se conecten. Tras instalarlo sigue estas instrucciones del proyecto Syncthing: Arrancando. Syncthing permite compartir selectivamente carpetas individuales. Antes de compartir los dispositivos tienen que estar emparejados leyendo códigos QR o introduciendo manualmente identificadores de dispositivo. Syncthing tiene un servicio de autodescubrimiento para identicar fácilmente a los otros dispositivos de la misma subred que tengan Syncthing instalado. Para acceder al cliente web de la instancia Syncthing que se ejecuta en tu FreedomBox, usa la ruta /syncthing. Actualmente este cliente web está accesible solo a los usuarios de FreedomBox que tengan privilegios de administrador aunque en alguna futura versión podría estarlo a todos los usuarios de FreedomBox. Syncthing web interface Syncthing tiene apps Android disponibles en F-Droid y Google Play. También hay disponibles aplicaciones de escritorio multiplataforma. Para más información acerca de Syncthing visita su sitio web oficial y su documentación.
Sincronizar via TorSyncthing debe sincronizar automáticamente con tu FreedomBox incluso cuando esta solo sea accesible como servicio Tor Onion. Si quieres enrutar tu cliente Syncthing via Tor configura la variable de entorno all_proxy: Para más información mira la documentación de Syncthing acerca de el uso de proxies.
Evitar repetidores de SyncthingSyncthing emplea por defecto conexiones dinámicas para conectar con otros pares. Esto significa que si estás sincronizando a través de Internet, los datos quizá tengan que atravesar repetidores de Syncthing públicos para alcanzar tus dispositivos. Esto desaprovecha que tu FreedomBox tenga una dirección IP pública. Al añadir tu FreedomBox como dispositivo en otros clientes de Syncthing establece tu dirección como "tcp://<mi.dominio.freedombox>" en vez de "dinámica". Esto permite a tus pares Syncthing conectarse diréctamente a tu FreedomBox eludiendo la necesidad de repetidores. También permite sincronización rápida bajo demanda si no quieres mantener a Syncthing ejecuándose todo el tiempo en tus dispositivos móviles. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/TinyTinyRSS.raw.xml b/doc/manual/es/TinyTinyRSS.raw.xml index 4c6ed5d28..ab89aa4bf 100644 --- a/doc/manual/es/TinyTinyRSS.raw.xml +++ b/doc/manual/es/TinyTinyRSS.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/TinyTinyRSS12019-09-13 17:05:05fioddorSe crea la versión española.
Lector de Feeds de Noticias (Tiny Tiny RSS)Tiny Tiny RSS es un lector y agregador de feeds de noticias (RSS/Atom) diseñado para leer noticias desde cualquier lugar con una experiencia lo más parecida posible a una aplicación de escritorio. Cualquier usuario creado mediante el interfaz web de FreedomBox podrá ingresar y usar esta app. Cada usuario tiene sus propios feeds, estado y preferencias.
Usar el interfaz webCuando esté habilitado Tiny Tiny RSS estará disponible en la ruta /tt-rss del servidor web. Cualquier usuario creado mediante el interfaz web de FreedomBox podrá ingresar y usar esta app. Tiny Tiny RSS
Añadir un nuevo feed1. Ve a la página cuyo feed quieras y copia su enlace RSS/Atom feed. Selecting feeds 2. Selecciona "Subscribirse al feed.." en el desplegable Acciones. Subscribe to feed 3. Pega la URL que has copiado en el diálogo que aparece y pulsa el botón Subscribirse. Subscription dialog box Dale un minuto a la aplicación para obtener los feeds. En algunos sitios web el botón de feeds RSS no está claramente visible. En tal caso simplemente pega la URL del sitio web en el diálogo Subscribirse y deja que TT-RSS detecte automáticamente los feeds RSS que haya en la página. Puedes probarlo ahora con la página principal de WikiNews Como puedes ver en la imagen seguiente TT-RSS ha detectado y añadido el feed Atom de WikiNews a nuestra lista de feeds. WikiNews feed added Si no quieres conservar este feed haz clic con el botón derecho del ratón en el feed de la imagen anterior, selecciona Editar feed y dale a Desubscribir en el diálogo que aparece. Unsubscribe from a feed
Importar tus feeds desde otro lectorEncuentra en tu lector de feeds previo una opción para Exportar tus feeds a un fichero. Si tiene que elegir entre varios formatos elige OPML. Pongamos que tu fichero de feeds exportados se llama Subscriptions.opml Haz click en la esquina superior izquierda el menú Acciones y selecciona Preferencias. Se te llevará a otra página. En la cabecera superior selecciona la 2ª solapa llamada Feeds. Tiene varias secciones y la 2ª se llama OPML. Selecciónala. OPML feeds page Para importar tu fichero Subscriptions.opml a TT-RSS, Haz clic en Examinar... y selecciona el fichero en tu sistema de archivos. Haz clic en Importar mi OPML Tras importar se te llevará a la sección Feeds que está en la página encima de la de OPML. Puedes ver que los feeds del lector previo figuran ahora importados en Tiny Tiny RSS. Ahora puedes empezar a usar Tiny Tiny RSS como tu lector principal.
Usar la app móvilLa app oficial para Android del proyecto Tiny Tiny RSS funciona con el servidor Tiny Tiny RSS de FreedomBox. Se sabe que la aplicación anterior TTRSS-Reader no funciona. Desafortunadamente la app oficial para Android solo está disponible en la Play Store de Google y no en F-Droid. Todavía puedes obtener el código fuente y compilar el fichero apk por tu cuenta. Para configurarla, primero instálala y entonces en la página de configuración pon como URL. Pon tu usuario y contraseña en los detalles del Login así como los detalles de Autenticación HTTP. Si tu FreedomBox no tiene un certificado HTTPS válido configuralo para que admita cualquier certificado SSL y cualquier servidor. Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/TinyTinyRSS32020-05-30 19:44:55SunilMohanAdapaUpdate the title to emphasize app name over its generic name22020-05-24 07:02:15fioddorSe alinea con la versión 12 en inglés del 23 de mayo de 202012019-09-13 17:05:05fioddorSe crea la versión española.
Tiny Tiny RSS (Lector de Feeds de Noticias)Tiny Tiny RSS es un lector y agregador de feeds de noticias (RSS/Atom) diseñado para leer noticias desde cualquier lugar con una experiencia lo más parecida posible a una aplicación de escritorio. Cualquier usuario creado mediante el interfaz web de FreedomBox podrá ingresar y usar esta app. Cada usuario tiene sus propios feeds, estado y preferencias.
Usar el interfaz webCuando esté habilitado Tiny Tiny RSS estará disponible en la ruta /tt-rss del servidor web. Cualquier usuario creado mediante FreedomBox podrá ingresar y usar esta app. Tiny Tiny RSS
Añadir un nuevo feed1. Ve a la página cuyo feed quieras y copia su enlace RSS/Atom feed. Selecting feeds 2. Selecciona "Subscribirse al feed.." en el desplegable Acciones. Subscribe to feed 3. Pega la URL que has copiado en el diálogo que aparece y pulsa el botón Subscribirse. Subscription dialog box Dale un minuto a la aplicación para obtener los feeds. En algunos sitios web el botón de feeds RSS no está claramente visible. En tal caso simplemente pega la URL del sitio web en el diálogo Subscribirse y deja que TT-RSS detecte automáticamente los feeds RSS que haya en la página. Puedes probarlo ahora con la página principal de WikiNews Como puedes ver en la imagen seguiente TT-RSS ha detectado y añadido el feed Atom de WikiNews a nuestra lista de feeds. WikiNews feed added Si no quieres conservar este feed haz clic con el botón derecho del ratón en el feed de la imagen anterior, selecciona Editar feed y dale a Desubscribir en el diálogo que aparece. Unsubscribe from a feed
Importar tus feeds desde otro lectorEncuentra en tu lector de feeds previo una opción para Exportar tus feeds a un fichero. Si tiene que elegir entre varios formatos elige OPML. Pongamos que tu fichero de feeds exportados se llama Subscriptions.opml Haz click en la esquina superior izquierda el menú Acciones y selecciona Preferencias. Se te llevará a otra página. En la cabecera superior selecciona la 2ª solapa llamada Feeds. Tiene varias secciones y la 2ª se llama OPML. Selecciónala. OPML feeds page Para importar tu fichero Subscriptions.opml a TT-RSS, Haz clic en Examinar... y selecciona el fichero en tu sistema de archivos. Haz clic en Importar mi OPML Tras importar se te llevará a la sección Feeds que está en la página encima de la de OPML. Puedes ver que los feeds del lector previo figuran ahora importados en Tiny Tiny RSS. Ahora puedes empezar a usar Tiny Tiny RSS como tu lector principal.
Usar la app móvilLa app oficial para Android del proyecto Tiny Tiny RSS funciona con el servidor Tiny Tiny RSS de FreedomBox. Se sabe que la aplicación anterior TTRSS-Reader no funciona. Desafortunadamente la app oficial para Android solo está disponible en la Play Store de Google y no en F-Droid. Todavía puedes obtener el código fuente y compilar el fichero apk por tu cuenta. Para configurarla, primero instálala y entonces en la página de configuración pon como URL. Pon tu usuario y contraseña en los detalles del Login así como los detalles de Autenticación HTTP. Si tu FreedomBox no tiene un certificado HTTPS válido configuralo para que admita cualquier certificado SSL y cualquier servidor. Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Tiny Tiny RSS Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Tor.raw.xml b/doc/manual/es/Tor.raw.xml index 273e5320c..51f7b6a20 100644 --- a/doc/manual/es/Tor.raw.xml +++ b/doc/manual/es/Tor.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Tor102019-11-30 18:08:09fioddorSe alinea con la versión 23 en inglés del 28 de noviembre de 201992019-11-14 17:59:44fioddorSe alinea con la versión 22 en inglés del 11 de noviembre de 201982019-10-28 09:44:53fioddorSe alinea con la versión 21 del 27 de octubre de 201972019-10-21 13:54:58fioddorCorrección menor62019-09-03 15:18:40fioddorMejora menor52019-09-03 15:17:22fioddortraducción de la sección TOR finalizada.42019-09-03 15:11:56fioddorSe incorpora la traducción de una sección nueva.32019-09-03 15:04:38fioddorSe incorpora la traducción de una sección nueva.22019-09-03 14:49:23fioddorSe incorpora la traducción de una sección nueva.12019-09-03 14:32:43fioddorSe crea la versión española (traducción incompleta).
Red para el anonimato (Tor)
¿Qué es Tor?Tor es una red de servidores operada por voluntarios. Permite a los usuarios de esos servidores mejorar su privacidad y seguridad cuando navegan por Internet. Tu y tus amigos podéis acceder a tu FreedomBox a través de la red Tor sin revelar su dirección IP. Activando la aplicación Tor en tu FreedomBox podrás ofrecer servicios remotos (chat, wiki, file sharing, etc...) sin mostrar tu localización. Esta aplicación te dará una protección mejor que un servidor web público porque estarás menos expuesto a gente intrusiva.
Usar Tor para navegación anónimaTor Browser es la manera recomendada para navegar la web a través de Tor. Puedes descargar Tor Browser desde y seguir sus instrucciones para instalarlo y ejecutarlo.
Usar Servicio Tor Onion para acceder a tu FreedomBoxEl Servicio Tor Onion proporciona una manera de acceder a tu FreedomBox incluso aunque esté detrás de un router, cortafuegos, o redirector NAT (p.ej. si tu proveedor de Internet no proporciona una dirección pública IPv4 para tu router). Para habilitar el Servicio Tor Onion primero navega a la página Red para el anónimato (Tor). (Si no la ves haz clic en el logo de FreedomBox de arriba a la izquierda de la página y ve a la página principal de Apps.) En la página Red para el anónimato (Tor), bajo Configuración, habilita la caja Habilitar los Servicios Tor Onion y pulsa el botón de Actualizar configuración. Tor se reconfigurará y se reiniciará. Transcurrido un rato la página se refrescará bajo Estado verás la tabla que lista la dirección .onion del servicio. Copia toda la dirección (que termina en .onion) y pégala en el campo dirección de Tor Browser. Deberías poder acceder a tu FreedomBox. (Quizá veas un aviso de certificado porque FreedomBox tiene un certificado autofirmado.) Tor Browser - Plinth Onion Actualmente solo HTTP (puerto 80), HTTPS (puerto 443) y SSH (puerto 22) están accesibles a través del Servicio Tor Onion configurado en la FreedomBox.
Apps accesibles via TorLas siguientes apps se pueden acceder a través de Tor. Esta lista puede ser incompleta. Calendario y Libreta de direcciones (Radicale) Sincronización de ficheros (Syncthing) Búsqueda Web (Searx) Wiki (MediaWiki) Wiki y Blog (Ikiwiki)
Ejecutar un nodo TorCuando se instala Tor se configura por defecto para ejecutarse como puente a la red (bridge relay). Esta opción se puede deshabilitar en la página de configuración de Tor de Plinth. En la parte inferior de página de Tor de Plinth hay una lista de puertos que usa el puente a la red Tor. Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos de tu router para que estos puertos sean accesibles desde Internet. Los requisitos para ejecutar un puente a la red se listan en la Tor Relay Guide. En resúmen, se recomienda que un puente tenga disponibles para Tor al menos 16 Mbit/s (Mbps) de ancho de banda para subida y bajada. Mejor más. requiere que a se le permita al puente usar un mínimo de 100 GByte de tráfico mensual de salida y de entrada. recomienda que un nodo sin salida (mero reenrutador) de <40 Mbit/s tenga al menos 512 MB de RAM disponible; Uno más rápido de 40 Mbit/s debería tener al menos 1 GB de RAM.
Usar el puerto Tor SOCKS (avanzado)FreedomBox proporciona un puerto Tor SOCKS al que pueden conectar otras aplicaciones para enrutar su tráfico a través de la red Tor. Este puerto es accesible a cualquier interfaz (de red) configurado en la zona interna del cortafuegos. Para configurar la aplicación apunta el Host SOCKS a la dirección IP interna de la conexión y pon el Puerto SOCKS a 9050.
Exjemplo con FirefoxTu navegador web se puede configurar para emplear la red Tor para toda tu actividad de navegación. Esto permite eludir la censura y oculta tu dirección IP a los sitios web durante la navegación normal. Para anonimato se recomienda usar el Navegador Tor. Configura tu dirección IP local de FreedomBox y el puerto 9050 como un proxy SOCKS en Firefox. Hay extensiones para facilitar la activación y desactivación del proxy. Configuring Firefox with Tor SOCKS proxy Con en proxy SOCKS configurado puedes acceder cualquier URL de tipo onion diréctamente desde Firefox. FreedomBox tiene una dirección onion v3 propia a la que puedes conectarte por la red Tor (guárdala en tus favoritos para usarla en situaciones de emergencia).
Eludiendo la censura de TorSi tu proveedor de Internet (ISP) está tratando de bloquear el tráfico Tor puedes usar puentes (a la red Tor) para conectar (a la red Tor). 1. Obtén la configuración de los puentes de Tor BridgeDB Tor BridgeDB 2. Añade las líneas a la configuración de Tor de tu FreedomBox como se muestra. Tor Configuration Page Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Tor122020-05-30 19:45:14SunilMohanAdapaUpdate the title to emphasize app name over its generic name112020-05-23 22:56:09fioddorSe alinea con la versión 25 en inglés del 23 de mayo de 2020102019-11-30 18:08:09fioddorSe alinea con la versión 23 en inglés del 28 de noviembre de 201992019-11-14 17:59:44fioddorSe alinea con la versión 22 en inglés del 11 de noviembre de 201982019-10-28 09:44:53fioddorSe alinea con la versión 21 del 27 de octubre de 201972019-10-21 13:54:58fioddorCorrección menor62019-09-03 15:18:40fioddorMejora menor52019-09-03 15:17:22fioddortraducción de la sección TOR finalizada.42019-09-03 15:11:56fioddorSe incorpora la traducción de una sección nueva.32019-09-03 15:04:38fioddorSe incorpora la traducción de una sección nueva.22019-09-03 14:49:23fioddorSe incorpora la traducción de una sección nueva.12019-09-03 14:32:43fioddorSe crea la versión española (traducción incompleta).
Tor (Red para el anonimato)
¿Qué es Tor?Tor es una red de servidores operada por voluntarios. Permite a los usuarios de esos servidores mejorar su privacidad y seguridad cuando navegan por Internet. Tu y tus amigos podéis acceder a tu FreedomBox a través de la red Tor sin revelar su dirección IP. Activando la aplicación Tor en tu FreedomBox podrás ofrecer servicios remotos (chat, wiki, file sharing, etc...) sin mostrar tu localización. Esta aplicación te dará una protección mejor que un servidor web público porque estarás menos expuesto a gente intrusiva.
Usar Tor para navegación anónimaTor Browser es la manera recomendada para navegar la web a través de Tor. Puedes descargar Tor Browser desde y seguir sus instrucciones para instalarlo y ejecutarlo.
Usar Servicio Tor Onion para acceder a tu FreedomBoxEl Servicio Tor Onion proporciona una manera de acceder a tu FreedomBox incluso aunque esté detrás de un router, cortafuegos, o redirector NAT (p.ej. si tu proveedor de Internet no proporciona una dirección pública IPv4 para tu router). Para habilitar el Servicio Tor Onion primero navega a la página Red para el anónimato (Tor). (Si no la ves haz clic en el logo de FreedomBox de arriba a la izquierda de la página y ve a la página principal de Apps.) En la página Red para el anónimato (Tor), bajo Configuración, habilita la caja Habilitar los Servicios Tor Onion y pulsa el botón de Actualizar configuración. Tor se reconfigurará y se reiniciará. Transcurrido un rato la página se refrescará bajo Estado verás la tabla que lista la dirección .onion del servicio. Copia toda la dirección (que termina en .onion) y pégala en el campo dirección de Tor Browser. Deberías poder acceder a tu FreedomBox. (Quizá veas un aviso de certificado porque FreedomBox tiene un certificado autofirmado.) Tor Configuration - FreedomBox Onion Actualmente solo HTTP (puerto 80), HTTPS (puerto 443) y SSH (puerto 22) están accesibles a través del Servicio Tor Onion configurado en la FreedomBox.
Apps accesibles via TorLas siguientes apps se pueden acceder a través de Tor. Esta lista puede ser incompleta. Calendario y Libreta de direcciones (Radicale) Sincronización de ficheros (Syncthing) Búsqueda Web (Searx) Wiki (MediaWiki) Wiki y Blog (Ikiwiki)
Ejecutar un nodo TorCuando se instala Tor se configura por defecto para ejecutarse como puente a la red (bridge relay). Esta opción se puede deshabilitar en la página de configuración de Tor de FreedomBox. En la parte inferior de página de Tor de FreedomBox hay una lista de puertos que usa el puente a la red Tor. Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos de tu router para que estos puertos sean accesibles desde Internet. Los requisitos para ejecutar un puente a la red se listan en la Tor Relay Guide. En resúmen, se recomienda que un puente tenga disponibles para Tor al menos 16 Mbit/s (Mbps) de ancho de banda para subida y bajada. Mejor más. requiere que a se le permita al puente usar un mínimo de 100 GByte de tráfico mensual de salida y de entrada. recomienda que un nodo sin salida (mero reenrutador) de <40 Mbit/s tenga al menos 512 MB de RAM disponible; Uno más rápido de 40 Mbit/s debería tener al menos 1 GB de RAM.
Usar el puerto Tor SOCKS (avanzado)FreedomBox proporciona un puerto Tor SOCKS al que pueden conectar otras aplicaciones para enrutar su tráfico a través de la red Tor. Este puerto es accesible a cualquier interfaz (de red) configurado en la zona interna del cortafuegos. Para configurar la aplicación apunta el Host SOCKS a la dirección IP interna de la conexión y pon el Puerto SOCKS a 9050.
Exjemplo con FirefoxTu navegador web se puede configurar para emplear la red Tor para toda tu actividad de navegación. Esto permite eludir la censura y oculta tu dirección IP a los sitios web durante la navegación normal. Para anonimato se recomienda usar el Navegador Tor. Configura tu dirección IP local de FreedomBox y el puerto 9050 como un proxy SOCKS en Firefox. Hay extensiones para facilitar la activación y desactivación del proxy. Configuring Firefox with Tor SOCKS proxy Con en proxy SOCKS configurado puedes acceder cualquier URL de tipo onion diréctamente desde Firefox. FreedomBox tiene una dirección onion v3 propia a la que puedes conectarte por la red Tor (guárdala en tus favoritos para usarla en situaciones de emergencia).
Eludiendo la censura de TorSi tu proveedor de Internet (ISP) está tratando de bloquear el tráfico Tor puedes usar puentes (a la red Tor) para conectar (a la red Tor). 1. Obtén la configuración de los puentes de Tor BridgeDB Tor BridgeDB 2. Añade las líneas a la configuración de Tor de tu FreedomBox como se muestra. Tor Configuration Page Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Transmission.raw.xml b/doc/manual/es/Transmission.raw.xml index 464d5bfed..6fdf0c37d 100644 --- a/doc/manual/es/Transmission.raw.xml +++ b/doc/manual/es/Transmission.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Transmission62019-10-28 09:16:06fioddorSe alinea con la versión 14 del 27 de octubre de 201952019-09-04 09:38:37fioddorCorrección menor42019-09-04 09:33:40fioddorEnlace a nueva página traducida.32019-09-04 09:19:10fioddorRecomendación de seguridad.22019-09-04 09:17:24fioddorCorrección menor12019-09-04 06:58:07fioddorSe crea la versión española.
BitTorrent (Transmission)
¿Qué es Transmission ?BitTorrent es un protocolo de comunicaciones para compartir ficheros entre pares (P2P = peer-to-peer). No es anónimo; debes asumir que otros puedan ver qué ficheros estás comprtiendo. Hay 2 clientes web para BitTorrent disponibles en FreedomBox: Transmission y Deluge. Tienen funcionalidades similares pero quizá prefieras uno sobre otro. Transmission es un cliente BitTorrent ligero, famoso por su simplicidad y una configuración por defecto que "símplemente funciona".
Captura de pantallaTransmission Web Interface
Usar TransmissionTras instalar Transmission está accesible en https://<tu freedombox>/transmission. Transmission emplea el ingreso único de FreedomBox lo que significa que si has ingresado en tu FreedomBox puedes acceder diréctamente a Transmission sin tener que volver a introducir las credenciales. Si no, se te pedirá que ingreses primero y luego se te redirigirá a la app Transmission.
Consejos
Transferir Descargas desde la FreedomBoxSe puede añadir el directorio de descargas de Transmission como directorio compartido en la app "Compartir" y así acceder a tus descargas en este directorio compartido empleando un navegador web. (Avanzado) Si tienes acceso SSH a tu FreedomBox puedes usar sftp para ver el directorio de descargas usando un gestor de archivos o un navegador apropiados (p.ej. dolphin o Konqueror). Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Transmission82020-05-30 19:45:41SunilMohanAdapaUpdate the title to emphasize app name over its generic name, match with FreedomBox interface72020-05-23 22:58:29fioddorSe alinea con la versión 15 en inglés del 23 de mayo de 202062019-10-28 09:16:06fioddorSe alinea con la versión 14 del 27 de octubre de 201952019-09-04 09:38:37fioddorCorrección menor42019-09-04 09:33:40fioddorEnlace a nueva página traducida.32019-09-04 09:19:10fioddorRecomendación de seguridad.22019-09-04 09:17:24fioddorCorrección menor12019-09-04 06:58:07fioddorSe crea la versión española.
Transmission (Cliente web de BitTorrent)
¿Qué es Transmission ?BitTorrent es un protocolo de comunicaciones para compartir ficheros entre pares (P2P = peer-to-peer). No es anónimo; debes asumir que otros puedan ver qué ficheros estás comprtiendo. Hay 2 clientes web para BitTorrent disponibles en FreedomBox: Transmission y Deluge. Tienen funcionalidades similares pero quizá prefieras uno sobre otro. Transmission es un cliente BitTorrent ligero, famoso por su simplicidad y una configuración por defecto que "símplemente funciona".
Captura de pantallaTransmission Web Interface
Usar TransmissionTras instalar Transmission está accesible en https://<tu freedombox>/transmission. Transmission emplea el ingreso único de FreedomBox lo que significa que si has ingresado en tu FreedomBox puedes acceder diréctamente a Transmission sin tener que volver a introducir las credenciales. Si no, se te pedirá que ingreses primero y luego se te redirigirá a la app Transmission.
Consejos
Transferir Descargas desde la FreedomBoxSe puede añadir el directorio de descargas de Transmission como directorio compartido en la app "Compartir" y así acceder a tus descargas en este directorio compartido empleando un navegador web. (Avanzado) Si tienes acceso SSH a tu FreedomBox puedes usar sftp para ver el directorio de descargas usando un gestor de archivos o un navegador apropiados (p.ej. dolphin o Konqueror). Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Upgrades.raw.xml b/doc/manual/es/Upgrades.raw.xml index 924b1fa40..0452db907 100644 --- a/doc/manual/es/Upgrades.raw.xml +++ b/doc/manual/es/Upgrades.raw.xml @@ -1,8 +1,8 @@ -
es/FreedomBox/Manual/Upgrades142020-04-13 16:14:41fioddorSe alinea con la versión 08 en inglés del 12 de abril de 2020132020-04-11 10:28:09fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_154258122020-04-04 21:44:54fioddor112020-04-04 21:36:45fioddorSe usan imagen traducida y más actual.102020-04-04 21:32:12fioddor92020-04-04 21:29:18fioddorSe alinean literales con la interfaz gráfica.82019-10-16 15:18:30fioddorEnlace a nueva página traducida.72019-09-06 08:31:27fioddorSe mejoran las referencias a Debian Testing en línea con la nomenclatura de https://www.debian.org/releases/62019-08-22 12:54:06fioddorCorrección menor52019-08-22 12:52:31fioddorCorrección menor42019-08-22 12:51:09fioddorCorrección menor32019-08-22 12:48:59fioddorMejora menor22019-08-22 12:44:27fioddorSe actualiza a la versión inglesa 7 de hoy, 22 de agosto de 2019 03:42h.12019-06-19 07:05:29fioddorSe crea la versión española.
Actualizaciones de SoftwareFreedomBox puede instalar actualizaciones de seguridad automaticamente. Esta funcionalidad viene activada por defecto y no hace falta ninguna acción manual. Puedes activar las actualizaciones automaticas desde el interfaz web de FreedomBox en la página Actualización de la sección Sistema. Se recomienda encarecidamente que tengas esta opción habilitada para mantener tu FreedomBox segura. Las actualizaciones se efectúan cada noche. Si quieres apagar tu FreedomBox cada día después de usarla, déjala ejecutando una noche a la semana más o menos para permitir que ocurran las actualizaciones automaticas. Otra posibilidad es ejecutar actualizaciones manuales como se describe más adelante. Nota que una vez comiencen las actualizaciones podría llevarles mucho tiempo completarse. Durante el proceso de actualización (ya sea el automático nocturno o el manual), no podrás instalar aplicaciones desde el interfaz web de FreedomBox. upgrades_es_v01.png
¿Cuando obtendré las últimas funcionalidades?Aunque las actualizaciones se efectúan a diario por razones de seguridad, las últimas funcionalidades no se propagan a todos los usuarios. A continuación se explica cómo llegan las novedades a los usuarios de las diferentes versiones de Debian: Usuarios de versiones estables: Esta categoria de usuarios incluye a los usuarios que compraron la FreedomBox Pioneer Edition, a los que instalaron FreedomBox sobre una distribución estable de Debian y a los que descargaron las imágenes estables desde freedombox.org. Como regla general a estos usuarios solo se les proporciona actualizaciones de seguridad de determinados paquetes. Cuando una release obtiene la confianza de los desarrolladores el propio servicio FreedomBox se actualiza, lo que supone una excepción a esta regla. Esto implica que las últimas funcionalidades de FreedomBox estarán disponibles para estos usuarios aunque no tán inmediata- o frecuentemente como para los usuarios de las versiones en pruebas (testing). Si una app sólo está disponible en la distribución en pruebas (testing) pero no en la estable la app aparecerá en el interfaz web pero no será instalable para los usuarios de la distribución estable. Algunas apps se actualizan en excepción a la regla de "solo actualizaciones de seguridad" cuando la app esté seriamente rota por algún motivo. Debian libera cada bienio una entrega (release) con las últimas versiones estables de cada paquete de software y los desarrolladores de FreedomBox intentarán actualizar a estos usuarios a la nueva entrega (release) sin necesidad de intervención manual. Usuarios de versiones en pruebas: Esta categoria de usuarios incluye a los usuarios que instalaron FreedomBox sobre una distribución en pruebas (testing) y a los que descargaron las imágenes en pruebas (testing) desde freedombox.org. Estos usuarios asumen la posibilidad de afrontar disrupciones ocasionales en los servicios e incluso tener que intervenir manualmente para arreglarlas. Como regla general estos usuarios reciben las últimas funcionalidades y actualizaciones de seguridad para todos los paquetes instalados. Cada quincena se libera una nueva versión de FreedomBox con todas las últimas funcionalidades y correcciones. Estas versiones llegan a los usuarios de la distribución en pruebas (testing) aproximadamente 2 o 3 días después de la liberación. Usuarios de versiones inestables: Esta categoria de usuarios incluye a los usuarios que instalaron FreedomBox sobre una distribución inestable y a los que descargaron las imágenes inestables desde freedombox.org. Estos usuarios asumen la probabilidad de afrontar disrupciones en los servicios y tener que intervenir manualmente para arreglarlas. Como regla general estos usuarios reciben las últimas funcionalidades y actualizaciones de seguridad para todos los paquetes instalados. Cada quincena se libera una nueva versión de FreedomBox con todas las últimas funcionalidades y correcciones. Estas versiones llegan a los usuarios de la distribución inestable el mismo día de la liberación. Solo los desarrolladores, probadores y contribuyentes al proyecto FreedomBox debieran emplear la distribution inestable. Se advierte y exhorta a los usuarios finales de que no la usen.
Actualizaciones Manuales desde el TerminalAlgunos paquetes de software podrían requerir intervención manual para actualizarlos, generalmente por razones de configuración. En tales casos FreedomBox se actualiza a sí mismo y solicita información nueva necesaria para la actualización del paquete. Después de autoactualizarse FreedomBox actúa en nombre del usuario y actualiza los paquetes con la información recabada. Estos paquetes no se deben actualizar manualmente hasta que FreedomBox tenga la posibilidad de actualizarlos. La actualización que se dispara manualmente desde el interfaz web ya es consciente de estos paquetes y no los actualiza. En situaciones muy extrañas, FreedomBox podría fallar o quedar a expensas de una intervención manual desde el terminal. Para esto, entra a FreedomBox por un terminal, ya sea físico, web (empleando Cockpit) o mediante SSH (ver sección Shell Segura) y ejecuta los siguientes comandos:
es/FreedomBox/Manual/Upgrades152020-05-24 07:53:22fioddorSe alinea con la versión 09 en inglés del 23 de mayo de 2020142020-04-13 16:14:41fioddorSe alinea con la versión 08 en inglés del 12 de abril de 2020132020-04-11 10:28:09fioddorhttps://salsa.debian.org/freedombox-team/plinth/-/issues/1831#note_154258122020-04-04 21:44:54fioddor112020-04-04 21:36:45fioddorSe usan imagen traducida y más actual.102020-04-04 21:32:12fioddor92020-04-04 21:29:18fioddorSe alinean literales con la interfaz gráfica.82019-10-16 15:18:30fioddorEnlace a nueva página traducida.72019-09-06 08:31:27fioddorSe mejoran las referencias a Debian Testing en línea con la nomenclatura de https://www.debian.org/releases/62019-08-22 12:54:06fioddorCorrección menor52019-08-22 12:52:31fioddorCorrección menor42019-08-22 12:51:09fioddorCorrección menor32019-08-22 12:48:59fioddorMejora menor22019-08-22 12:44:27fioddorSe actualiza a la versión inglesa 7 de hoy, 22 de agosto de 2019 03:42h.12019-06-19 07:05:29fioddorSe crea la versión española.
Actualizaciones de SoftwareFreedomBox puede instalar actualizaciones de seguridad automaticamente. Esta funcionalidad viene activada por defecto y no hace falta ninguna acción manual. Puedes activar las actualizaciones automaticas desde el interfaz web de FreedomBox en la página Actualización de la sección Sistema. Se recomienda encarecidamente que tengas esta opción habilitada para mantener tu FreedomBox segura. Las actualizaciones se efectúan cada noche. Si quieres apagar tu FreedomBox cada día después de usarla, déjala ejecutando una noche a la semana más o menos para permitir que ocurran las actualizaciones automaticas. Otra posibilidad es ejecutar actualizaciones manuales como se describe más adelante. Nota que una vez comiencen las actualizaciones podría llevarles mucho tiempo completarse. Durante el proceso de actualización (ya sea el automático nocturno o el manual), no podrás instalar aplicaciones desde el interfaz web de FreedomBox. upgrades_es_v01.png
¿Cuando obtendré las últimas funcionalidades?Aunque las actualizaciones se efectúan a diario por razones de seguridad, las últimas funcionalidades no se propagan a todos los usuarios. A continuación se explica cómo llegan las novedades a los usuarios de las diferentes versiones de Debian: Usuarios de versiones estables: Esta categoria de usuarios incluye a los usuarios que compraron la FreedomBox Pioneer Edition, a los que instalaron FreedomBox sobre una distribución estable de Debian y a los que descargaron las imágenes estables desde freedombox.org. Como regla general a estos usuarios solo se les proporciona actualizaciones de seguridad de determinados paquetes. Cuando una release obtiene la confianza de los desarrolladores el propio servicio FreedomBox se actualiza, lo que supone una excepción a esta regla. Esto implica que las últimas funcionalidades de FreedomBox estarán disponibles para estos usuarios aunque no tán inmediata- o frecuentemente como para los usuarios de las versiones en pruebas (testing). Si una app sólo está disponible en la distribución en pruebas (testing) pero no en la estable la app aparecerá en el interfaz web pero no será instalable para los usuarios de la distribución estable. Algunas apps se actualizan en excepción a la regla de "solo actualizaciones de seguridad" cuando la app esté seriamente rota por algún motivo. Debian libera cada bienio una entrega (release) con las últimas versiones estables de cada paquete de software y los desarrolladores de FreedomBox intentarán actualizar a estos usuarios a la nueva entrega (release) sin necesidad de intervención manual. Usuarios de versiones en pruebas: Esta categoria de usuarios incluye a los usuarios que instalaron FreedomBox sobre una distribución en pruebas (testing) y a los que descargaron las imágenes en pruebas (testing) desde freedombox.org. Estos usuarios asumen la posibilidad de afrontar disrupciones ocasionales en los servicios e incluso tener que intervenir manualmente para arreglarlas. Como regla general estos usuarios reciben las últimas funcionalidades y actualizaciones de seguridad para todos los paquetes instalados. Cada quincena se libera una nueva versión de FreedomBox con todas las últimas funcionalidades y correcciones. Estas versiones llegan a los usuarios de la distribución en pruebas (testing) aproximadamente 2 o 3 días después de la liberación. Usuarios de versiones inestables: Esta categoria de usuarios incluye a los usuarios que instalaron FreedomBox sobre una distribución inestable y a los que descargaron las imágenes inestables desde freedombox.org. Estos usuarios asumen la probabilidad de afrontar disrupciones en los servicios y tener que intervenir manualmente para arreglarlas. Como regla general estos usuarios reciben las últimas funcionalidades y actualizaciones de seguridad para todos los paquetes instalados. Cada quincena se libera una nueva versión de FreedomBox con todas las últimas funcionalidades y correcciones. Estas versiones llegan a los usuarios de la distribución inestable el mismo día de la liberación. Solo los desarrolladores, probadores y contribuyentes al proyecto FreedomBox debieran emplear la distribution inestable. Se advierte y exhorta a los usuarios finales de que no la usen.
Actualizaciones Manuales desde el TerminalAlgunos paquetes de software podrían requerir intervención manual para actualizarlos, generalmente por razones de configuración. En tales casos FreedomBox se actualiza a sí mismo y solicita información nueva necesaria para la actualización del paquete. Después de autoactualizarse FreedomBox actúa en nombre del usuario y actualiza los paquetes con la información recabada. Estos paquetes no se deben actualizar manualmente hasta que FreedomBox tenga la posibilidad de actualizarlos. La actualización que se dispara manualmente desde el interfaz web ya es consciente de estos paquetes y no los actualiza. En situaciones muy extrañas, FreedomBox podría fallar o quedar a expensas de una intervención manual desde el terminal. Para esto, entra a FreedomBox por un terminal, ya sea físico, web (empleando Cockpit) o mediante SSH (ver sección Shell Segura) y ejecuta los siguientes comandos: # dpkg --configure -a # apt update # apt -f install # unattended-upgrade --debug # apt install freedombox -# apt update]]>Si apt-get update te pide confirmación para algo responde que . Si durante la actualización del paquete freedombox te pregunta acerca de los archivos de configuración responde que instale los archivos de configuración nuevos que vienen con la última versión del paquete. Este proceso solo actualizará los paquetes que no necesitan preguntar (excepto el paquete freedombox). Después, deja que FreedomBox se encargue de la actualización de los demás paquetes. Sé paciente mientras se crean nuevas versiones de FreedomBox para tratar los paquetes que necesitan intervención manual. Si quieres ir más allá de la recomendación e instalar todos los paquetes en tu FreedomBox y realmente estás muy seguro de poder tratar los cambios de configuración de paquetes por tí mismo, ejecuta el siguiente comando: Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +# apt update]]>
Si apt-get update te pide confirmación para algo responde que . Si durante la actualización del paquete freedombox te pregunta acerca de los archivos de configuración responde que instale los archivos de configuración nuevos que vienen con la última versión del paquete. Este proceso solo actualizará los paquetes que no necesitan preguntar (excepto el paquete freedombox). Después, deja que FreedomBox se encargue de la actualización de los demás paquetes. Sé paciente mientras se crean nuevas versiones de FreedomBox para tratar los paquetes que necesitan intervención manual. Si quieres ir más allá de la recomendación e instalar todos los paquetes en tu FreedomBox y realmente estás muy seguro de poder tratar los cambios de configuración de paquetes por tí mismo, ejecuta el siguiente comando: Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/Users.raw.xml b/doc/manual/es/Users.raw.xml index 4321595d8..4e3f89c91 100644 --- a/doc/manual/es/Users.raw.xml +++ b/doc/manual/es/Users.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/Users12019-06-18 13:55:35fioddorSe crea la versión española.
Usuarios y GruposPuedes otorgar acceso a tu FreedomBox a otros usuarios. Proporciona el nombre del usuario y su contraseña y asignale un grupo. Actualmente se soportan los grupos admin wiki El usuario podrá ingresar a los servicios que soporten ingreso único (single-sign-on) mediante LDAP si figuran en el grupo apropriado. Los usuarios del grupo admin podrán ingresar en todos los servicios. También pueden ingresar al sistema por SSH y escalar a privilegios administrativos (sudo). Estas características se pueden cambiar más tarde. Asimismo es posible establecer una clave pública SSH que permitirá al usuario ingresar al sistema de modo seguro sin emplear su contraseña. Pueder dar de alta varias claves, una en cada línea. Las líneas en blanco o que comiencen por # se ignoran. Se pueden desactivar temporalmente las cuentas de usuarios.
Reparos ConocidosActualmente Plinth not distingue entre usuarios y administradores. Todo usuario añadido mediante Plinth tendrá accesso completo al interfaz de Plinth. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/Users22020-05-24 07:54:47fioddorSe alinea con la versión 09 en inglés del 23 de mayo de 202012019-06-18 13:55:35fioddorSe crea la versión española.
Usuarios y GruposPuedes otorgar acceso a tu FreedomBox a otros usuarios. Proporciona el nombre del usuario y su contraseña y asignale un grupo. Actualmente se soportan los grupos admin wiki El usuario podrá ingresar a los servicios que soporten ingreso único (single-sign-on) mediante LDAP si figuran en el grupo apropriado. Los usuarios del grupo admin podrán ingresar en todos los servicios. También pueden ingresar al sistema por SSH y escalar a privilegios administrativos (sudo). Estas características se pueden cambiar más tarde. Asimismo es posible establecer una clave pública SSH que permitirá al usuario ingresar al sistema de modo seguro sin emplear su contraseña. Pueder dar de alta varias claves, una en cada línea. Las líneas en blanco o que comiencen por # se ignoran. Se pueden desactivar temporalmente las cuentas de usuarios.
Reparos ConocidosActualmente Plinth not distingue entre usuarios y administradores. Todo usuario añadido mediante Plinth tendrá accesso completo al interfaz de Plinth. Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/ejabberd.raw.xml b/doc/manual/es/ejabberd.raw.xml index dab22e393..c446674f6 100644 --- a/doc/manual/es/ejabberd.raw.xml +++ b/doc/manual/es/ejabberd.raw.xml @@ -1 +1 @@ -
es/FreedomBox/Manual/ejabberd22019-09-05 12:44:11fioddorCorrección menor12019-09-05 11:59:04fioddorSe crea la versión española.
Servidor de Mensajería Instantánea (chat) (ejabberd)
¿Qué es XMPP?XMPP es un protocolo federatedo para Mensajería Instantánea. Esto significa que los usuarios que tengan cuenta en un servidor XMPP pueden conversar con los usuarios que estén en el mismo u otros servidores XMPP. XMPP se puede usar también para llamadas de voz y vídeo si los clientes las soportan. Con XMPP las conversaciones se pueden securizar de 2 maneras: TLS: Esto securiza la conexión entre el cliente y el servidor o entre 2 servidores. Esto está áltamente recomendado y ya debería estar soportado por todos los clientes. Punto a punto: Esto securiza los mensajes enviados entre los clientes de modo que ni siquiera el servidor pueda ver los contenidos. El último protocolo y también el más cómodo se llama OMEMO pero solo lo soportan algunos clientes. Algunos clientes que no soportan OMEMO podrían soportar otro protocolo llamado OTR. Para que funcione ambos clientes tienen que ser compatibles con el mismo protocolo.
Estableciendo un Nombre de DominioPara que funcione XMPP tu FreedomBox necesita tener Nombre de Dominio accesible desde Internet. Puedes leer acerca de la obtención de un Nombre de Dominio en la sección DNS Dinámico de este manual. Una vez tengas ya tu Nombre de Dominio puedes decirle a tu FreedomBox que lo use dándolo de alta en la configuración del sistema. Nota: Tras cambiar tu Nombre de Dominio la página del servidor (XMPP) de mensajería instantánea podría mostrar que el servicio no está funcionando. En un minuto más o menos se actualizará y lo volverá a mostrar operativo. Ten en cuenta que de momento PageKite no soporta el protocolo XMPP.
Registrando los usuarios XMPP mediante SSOActualmente todos los usuarios creados con Plinth podrán ingresar al servidor XMPP. Puedes añadir usuarios nuevos con el módulo de "Usuarios y Grupos del Sistema". Los grupos seleccionados para el usuario nuevo no importan.
Usar el cliente webTras completar la instalación del módulo XMPP el cliente web JSXC para XMPP está accesible en https://<tu_freedombox>/plinth/apps/xmpp/jsxc/. Automáticamente comprobará la conexión del servidor BOSH al nombre de dominio configurado.
Usar un cliente móvil o de escritorioHay disponibles clientes XMPP para varias platformas móviles y de escritorio.
Enrutado de PuertosSi tu FreedomBox está detrás de un router tendrás que configurar en él la redirección de puertos. Redirije los siguientes puertos de XMPP: TCP 5222 (cliente-a-servidor) TCP 5269 (servidor-a-servidor) Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Sunday, May 24th at 17:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file +
es/FreedomBox/Manual/ejabberd42020-05-30 19:33:52SunilMohanAdapaUpdate the title to emphasize app name over its generic name32020-05-24 06:35:01fioddorSe alinea con la versión 14 en inglés del 23 de mayo de 202022019-09-05 12:44:11fioddorCorrección menor12019-09-05 11:59:04fioddorSe crea la versión española.
ejabberd (Servidor de Mensajería Instantánea (chat))
¿Qué es XMPP?XMPP es un protocolo federatedo para Mensajería Instantánea. Esto significa que los usuarios que tengan cuenta en un servidor XMPP pueden conversar con los usuarios que estén en el mismo u otros servidores XMPP. XMPP se puede usar también para llamadas de voz y vídeo si los clientes las soportan. Con XMPP las conversaciones se pueden securizar de 2 maneras: TLS: Esto securiza la conexión entre el cliente y el servidor o entre 2 servidores. Esto está áltamente recomendado y ya debería estar soportado por todos los clientes. Punto a punto: Esto securiza los mensajes enviados entre los clientes de modo que ni siquiera el servidor pueda ver los contenidos. El último protocolo y también el más cómodo se llama OMEMO pero solo lo soportan algunos clientes. Algunos clientes que no soportan OMEMO podrían soportar otro protocolo llamado OTR. Para que funcione ambos clientes tienen que ser compatibles con el mismo protocolo.
Estableciendo un Nombre de DominioPara que funcione XMPP tu FreedomBox necesita tener Nombre de Dominio accesible desde Internet. Puedes leer acerca de la obtención de un Nombre de Dominio en la sección DNS Dinámico de este manual. Una vez tengas ya tu Nombre de Dominio puedes decirle a tu FreedomBox que lo use dándolo de alta en la configuración del sistema. Nota: Tras cambiar tu Nombre de Dominio la página del servidor (XMPP) de mensajería instantánea podría mostrar que el servicio no está funcionando. En un minuto más o menos se actualizará y lo volverá a mostrar operativo. Ten en cuenta que de momento PageKite no soporta el protocolo XMPP.
Registrando los usuarios XMPP mediante SSOActualmente todos los usuarios creados con FreedomBox podrán ingresar al servidor XMPP. Puedes añadir usuarios nuevos con el módulo de "Usuarios y Grupos del Sistema". Los grupos seleccionados para el usuario nuevo no importan.
Usar el cliente webTras completar la instalación del módulo XMPP el cliente web JSXC para XMPP está accesible en https://<tu_freedombox>/plinth/apps/xmpp/jsxc/. Automáticamente comprobará la conexión del servidor BOSH al nombre de dominio configurado.
Usar un cliente móvil o de escritorioHay disponibles clientes XMPP para varias platformas móviles y de escritorio.
Enrutado de PuertosSi tu FreedomBox está detrás de un router tendrás que configurar en él la redirección de puertos. Redirije los siguientes puertos de XMPP: TCP 5222 (cliente-a-servidor) TCP 5269 (servidor-a-servidor) Volver a la descripción de Funcionalidades o a las páginas del manual. InformaciónSoporteContribuyeInformesPromueveIntroducción Hardware Ayuda en línea Dónde empezar Traduce Reuniones Charlas Funcionalidades Visión Preguntas y Respuestas Diseño Por hacer Releases Prensa Descargas Manual Codigo Fuente Contribuyentes Blog FreedomBox para Comunidades Manual del Desarrolador de FreedomBox AYUDA y DEBATES: Foro de Debate - Lista de Correo - #freedombox irc.debian.org | CONTACTO Fundación | PARTICIPA Proyecto Next call: Saturday, June 13th at 14:00 UTC Latest news: Announcing Pioneer FreedomBox Kits - 2019-03-26 Esta página está sujeta a copyright y sus autores la publican bajo la licencia pública Creative Commons Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). CategoryFreedomBox
\ No newline at end of file diff --git a/doc/manual/es/freedombox-manual.raw.xml b/doc/manual/es/freedombox-manual.raw.xml index 866dd498b..d8417da7f 100644 --- a/doc/manual/es/freedombox-manual.raw.xml +++ b/doc/manual/es/freedombox-manual.raw.xml @@ -4,6 +4,24 @@ es/FreedomBox/Manual + + 67 + 2020-05-30 20:04:07 + SunilMohanAdapa + Sort apps and system items according to their new titles + + + 66 + 2020-05-26 14:06:09 + fioddor + Enlace a nueva página traducida. + + + 65 + 2020-05-24 08:20:24 + fioddor + Se alinea con la versión 88 en inglés del 24 de mayo de 2020 + 64 2020-05-10 10:11:38 @@ -518,7 +536,7 @@ - Después de que tu FreedomBox haya finalizado su configuración inicial puedes acceder a su interfaz web (llamado Plinth) mediante tu navegador web. + Después de que tu FreedomBox haya finalizado su configuración inicial puedes acceder a su interfaz web mediante tu navegador web. Si tu ordenador está conectado directamente a tu FreedomBox a través de un segundo puerto Ethernet de la red local, puedes navegar a o a . @@ -550,7 +568,7 @@ - Al acceder al interfaz web de FreedomBox (Plinth) tu navegador te avisará de que comunica en modo seguro pero que considera invalido el certificado de seguridad. Tienes que aceptarlo porque el certificado es autogenerado en la FreedomBox y "autofirmado" (el navegador podría denominarlo "no confiable", "no privado", "error de privacidad" o "emisor/autoridad desconocida"). Decir a tu navegador que ya lo sabes podría implicar accionar algunos botones como "Entiendo los riesgos", "proceder ... (inseguro)" o "Añadir excepción". Después de la instalación este certificado se puede cambiar a otro normal usando la opción Let's Encrypt. + Al acceder al interfaz web de FreedomBox tu navegador te avisará de que comunica en modo seguro pero que considera invalido el certificado de seguridad. Tienes que aceptarlo porque el certificado es autogenerado en la FreedomBox y "autofirmado" (el navegador podría denominarlo "no confiable", "no privado", "error de privacidad" o "emisor/autoridad desconocida"). Decir a tu navegador que ya lo sabes podría implicar accionar algunos botones como "Entiendo los riesgos", "proceder ... (inseguro)" o "Añadir excepción". Después de la instalación este certificado se puede cambiar a otro normal usando la opción Let's Encrypt. @@ -617,7 +635,7 @@ - Tras completar el formulario estarás en el interfaz web de FreedomBox (Plinth) y podrás acceder a las apps y a la configuración mediante el interfaz web. + Tras completar el formulario estarás en el interfaz web de FreedomBox y podrás acceder a las apps y a la configuración mediante el interfaz web. @@ -640,7 +658,7 @@ Orientándote
Página principal - La página principal es la que verás al acceder a la raíz web de tu FreedomBox. También puedes acceder a ella haciendo clic sobre el logo de FreedomBox de la esquina de arriba a la izquierda del interfaz web de FreedomBox (Plinth). + La página principal es la que verás al acceder a la raíz web de tu FreedomBox. También puedes acceder a ella haciendo clic sobre el logo de FreedomBox de la esquina de arriba a la izquierda del interfaz web de FreedomBox. La página principal tiene accesos directos a las apps instaladas que estén habilitadas. Haciendo clic en los accesos directos de aplicaciones web te llevarán a la página web correspondiente de cada app. Si son otro tipo de servicios hacer clic en los accesos directos te mostrará información acerca de cada servicio. @@ -721,7 +739,7 @@
Menú de Hamburgesa - El interfaz web de FreedomBox's (Plinth) es autoadaptativo. En algún caso podrías echar en falta las opciones del menú en ventanas estrechas. + El interfaz web de FreedomBox's es autoadaptativo. En algún caso podrías echar en falta las opciones del menú en ventanas estrechas. @@ -985,10 +1003,10 @@ Primary key fingerprint: BCBE BD57 A11F 70B2 3782 BC57 36C3 6144 0C9B C971]]> Puedes compilar e instalar un paquete desde el control de versiones de Debian. Por ejemplo, + dpkg -i ../freedombox*.deb]]>
@@ -1021,237 +1039,77 @@ dd if=temp/usr/lib/u-boot/A20-OLinuXino-Lime2/u-boot-sunxi-with-spl.bin of=Para mantener la lista ordenada alfabéticamente añade estas entradas según el título de nivel 2 de dentro de su página
- Sitios Web de Usuario (User websites) (userdir) + Coquelicot (Compartición de Archivos)
- ¿Qué es User websites? - User websites es un módulo del servidor web Apache habilitado para permitir a los usuarios definidos en el sistema FreedomBox exponer un conjunto de archivos del sistema de ficheros de FreedomBox como sitio web a la red local y/o a internet de acuerdo a la configuración de la red y el cortafuegos. - - - - - - - - - Datos básicos de la aplicación - - - - - - Categoría - - - Compartición de archivos - - - - - Disponible desde la versión - - - 0.9.4 - - - - - Sitio web del proyecto original - - - - - - - - - - Documentación original de usuario - - - - - - - - - - + Acerca de Coquelicot + Coquelicot es aplicación web para compartir archivos enfocada a proteger la privacidad de sus usuarios. El principio básico es simple: los usuarios pueden subir un archivo al servidor y a cambio reciben una URL única para descargarlo que se puede compartir con terceros. Además se puede establecer una contraseña para reforzar el acceso. + Más información acerca de Coquelicot en su LEEME + Disponible desde: versión 0.24.0
- Captura de pantalla - - Añadir cuando/si se crea un interfaz para FreedomBox - -
-
- Usar User websites - El módulo está siempre activado y el interfaz web de FreedomBox no ofrece configuración ni página de estado para este módulo. Para servir documentos con el módulo solo se necesita poner los documentos en un subdirectorio designado /home/<un_usuario_de_plinth>/public_html. - User websites servirá los archivos que haya en este directorio cuando se reciban peticiones con la URI ~<un_usuario_de_freedombox>. Por tanto para un dominio ejemplo.org con un usuario pepe una petición ejemplo.org/~pepe/index.html transferirá el fichero /home/pepe/public_html/index.html. -
-
- Usar SFTP para crear public_html y subir archivos - - Pendiente de redactar - -
-
-
- Red para el anonimato (Tor) -
- ¿Qué es Tor? - Tor es una red de servidores operada por voluntarios. Permite a los usuarios de esos servidores mejorar su privacidad y seguridad cuando navegan por Internet. Tu y tus amigos podéis acceder a tu FreedomBox a través de la red Tor sin revelar su dirección IP. Activando la aplicación Tor en tu FreedomBox podrás ofrecer servicios remotos (chat, wiki, file sharing, etc...) sin mostrar tu localización. Esta aplicación te dará una protección mejor que un servidor web público porque estarás menos expuesto a gente intrusiva. -
-
- Usar Tor para navegación anónima - Tor Browser es la manera recomendada para navegar la web a través de Tor. Puedes descargar Tor Browser desde y seguir sus instrucciones para instalarlo y ejecutarlo. -
-
- Usar Servicio Tor Onion para acceder a tu FreedomBox - El Servicio Tor Onion proporciona una manera de acceder a tu FreedomBox incluso aunque esté detrás de un router, cortafuegos, o redirector NAT (p.ej. si tu proveedor de Internet no proporciona una dirección pública IPv4 para tu router). Para habilitar el Servicio Tor Onion primero navega a la página Red para el anónimato (Tor). (Si no la ves haz clic en el logo de FreedomBox de arriba a la izquierda de la página y ve a la página principal de Apps.) En la página Red para el anónimato (Tor), bajo Configuración, habilita la caja Habilitar los Servicios Tor Onion y pulsa el botón de Actualizar configuración. Tor se reconfigurará y se reiniciará. - Transcurrido un rato la página se refrescará bajo Estado verás la tabla que lista la dirección .onion del servicio. Copia toda la dirección (que termina en .onion) y pégala en el campo dirección de Tor Browser. Deberías poder acceder a tu FreedomBox. (Quizá veas un aviso de certificado porque FreedomBox tiene un certificado autofirmado.) - - - - - - - Tor Browser - Plinth - - - - - - Onion - - - Actualmente solo HTTP (puerto 80), HTTPS (puerto 443) y SSH (puerto 22) están accesibles a través del Servicio Tor Onion configurado en la FreedomBox. -
-
- Apps accesibles via Tor - Las siguientes apps se pueden acceder a través de Tor. Esta lista puede ser incompleta. + Cuando usar Coquelicot + El mejor uso de Coquelicot es para compartir rápidamente un archivo suelto. Si quieres compartir una carpeta... - Calendario y Libreta de direcciones (Radicale) + ...para usar y tirar, comprime la carpeta y compartela como archivo con Coquelicot - Sincronización de ficheros (Syncthing) - - - Búsqueda Web (Searx) - - - Wiki (MediaWiki) - - - Wiki y Blog (Ikiwiki) + ...que deba mantenerse sincronizada entre ordenadores usa mejor Syncthing + Coquelicot también puede proporcionar un grado de privacidad razonable. Si se necesita anonimato mejor sopesas emplear la aplicación de escritorio Onionshare. + Como Coquelicot carga todo el archivo al servidor tu FreedomBox consumirá ancho de banda tanto para la subida como para la descarga. Para archivos muy grandes sopesa compartirlos creando un fichero BitTorrent privado. Si se necesita anonimato usa Onionshare. Es P2P y no necesita servidor.
- Ejecutar un nodo Tor - Cuando se instala Tor se configura por defecto para ejecutarse como puente a la red (bridge relay). Esta opción se puede deshabilitar en la página de configuración de Tor de Plinth. - En la parte inferior de página de Tor de Plinth hay una lista de puertos que usa el puente a la red Tor. Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos de tu router para que estos puertos sean accesibles desde Internet. - Los requisitos para ejecutar un puente a la red se listan en la Tor Relay Guide. En resúmen, se - + Coquelicot en FreedomBox + Con Coquelicot instalado puedes subir archivos a tu servidor FreedomBox y compartirlos en privado. + Tras la instalación la página de Coquelicot ofrece 2 preferencias. + - recomienda que un puente tenga disponibles para Tor al menos 16 Mbit/s (Mbps) de ancho de banda para subida y bajada. Mejor más. + Contraseña de Subida: Actualmente y por facilidad de uso Coquelicot está configurado en FreedomBox para usar autenticación simple por contraseña. Recuerda que se trata de una contraseña global para esta instancia de Coquelicot y no tu contraseña de usuario para FreedomBox. Tienes que acordarte de esta contraseña. Puedes establecer otra en cualquier momento desde el interfaz de FreedomBox. - requiere que a se le permita al puente usar un mínimo de 100 GByte de tráfico mensual de salida y de entrada. + Tamaño Máximo de Archivo: Puedes alterar el tamaño máximo de los archivos a transferir mediante Coquelicot usando esta preferencia. El tamaño se expresa en Mebibytes y el máximo solo está limitado por el espacio en disco de tu FreedomBox. - - recomienda que un nodo sin salida (mero reenrutador) de <40 Mbit/s tenga al menos 512 MB de RAM disponible; Uno más rápido de 40 Mbit/s debería tener al menos 1 GB de RAM. - - +
- Usar el puerto Tor SOCKS (avanzado) - FreedomBox proporciona un puerto Tor SOCKS al que pueden conectar otras aplicaciones para enrutar su tráfico a través de la red Tor. Este puerto es accesible a cualquier interfaz (de red) configurado en la zona interna del cortafuegos. Para configurar la aplicación apunta el Host SOCKS a la dirección IP interna de la conexión y pon el Puerto SOCKS a 9050. + Privacidad + Alguien que monitorice tu tráfico de red podría averiguar que se está transfiriendo un archivo en tu FreedomBox y posiblemente también su tamaño pero no sabrá su nombre. Coquelicot cifra los archivos en el servidor y sobrescribe los contenidos con 0s al borrarlos, eliminando el riesgo de que se desvelen los contenidos del fichero si tu FreedomBox resultara confiscada o robada. El riesgo real que hay que mitigar es que además del destinatario legítimo un tercero también descargue tu fichero.
- Exjemplo con Firefox - Tu navegador web se puede configurar para emplear la red Tor para toda tu actividad de navegación. Esto permite eludir la censura y oculta tu dirección IP a los sitios web durante la navegación normal. Para anonimato se recomienda usar el Navegador Tor. - Configura tu dirección IP local de FreedomBox y el puerto 9050 como un proxy SOCKS en Firefox. Hay extensiones para facilitar la activación y desactivación del proxy. - - - - - - - Configuring Firefox with Tor SOCKS proxy - - - - Con en proxy SOCKS configurado puedes acceder cualquier URL de tipo onion diréctamente desde Firefox. FreedomBox tiene una dirección onion v3 propia a la que puedes conectarte por la red Tor (guárdala en tus favoritos para usarla en situaciones de emergencia). + Compartir mediante mensajería instantánea + Algunas aplicaciones de mensajería instantánea con vista previa de sitios web podrían descargar tu fichero para mostrarla (su vista previa) en la conversación. Si configuras la opción de descarga única para un archivo podrías notar que la aplicación de mensajería consume la única descarga. Si compartes mediante estas aplicaciones usa una contraseña de descarga en combinación con la opción de descarga única.
-
-
- Eludiendo la censura de Tor - Si tu proveedor de Internet (ISP) está tratando de bloquear el tráfico Tor puedes usar puentes (a la red Tor) para conectar (a la red Tor). - 1. Obtén la configuración de los puentes de Tor BridgeDB - - - - - - - Tor BridgeDB - - - - 2. Añade las líneas a la configuración de Tor de tu FreedomBox como se muestra. - - - - - - - Tor Configuration Page - - - -
-
-
- BitTorrent (Transmission) -
- ¿Qué es Transmission ? - BitTorrent es un protocolo de comunicaciones para compartir ficheros entre pares (P2P = peer-to-peer). No es anónimo; debes asumir que otros puedan ver qué ficheros estás comprtiendo. Hay 2 clientes web para BitTorrent disponibles en FreedomBox: Transmission y Deluge. Tienen funcionalidades similares pero quizá prefieras uno sobre otro. - Transmission es un cliente BitTorrent ligero, famoso por su simplicidad y una configuración por defecto que "símplemente funciona". -
-
- Captura de pantalla - - - - - - - Transmission Web Interface - - - -
-
- Usar Transmission - Tras instalar Transmission está accesible en https://<tu freedombox>/transmission. Transmission emplea el ingreso único de FreedomBox lo que significa que si has ingresado en tu FreedomBox puedes acceder diréctamente a Transmission sin tener que volver a introducir las credenciales. Si no, se te pedirá que ingreses primero y luego se te redirigirá a la app Transmission. -
-
- Consejos
- Transferir Descargas desde la FreedomBox - - - Se puede añadir el directorio de descargas de Transmission como directorio compartido en la app "Compartir" y así acceder a tus descargas en este directorio compartido empleando un navegador web. - - - (Avanzado) Si tienes acceso SSH a tu FreedomBox puedes usar sftp para ver el directorio de descargas usando un gestor de archivos o un navegador apropiados (p.ej. dolphin o Konqueror). - - + Compartir en privado enlaces de descarga + Se recomienda compartir las contraseñas y los enlaces de descarga de tus archivos por canales cifrados. Puedes evitar todos los problemas anteriores con las vistas previas de la mensajería instantánea símplemente empleando aplicaciones de mensajería que soporten conversaciones cifradas como Riot con Matrix Synapse o XMPP (servidor ejabberd en FreedomBox) con clientes que soporten cifrado punto a punto. Envía la contraseña y el enlace de descarga separados en 2 mensajes distintos (ayuda que tu aplicación de mensajería soporte perfect forward secrecy como XMPP con OTR). También puedes compartir tus enlaces por correo electrónico cifrado con PGP usando Thunderbird.
- BitTorrent (Deluge) + Coturn (Asistente para VoIP) + Coturn es un servidor para facilitar llamadas y conferencias de audio/video proporcionando una implementación de los protocolos TURN y STUN. Los servidores de comunicación por WebRTC, SIP y otros pueden usarlo para establecer una llamada entre partes que de otro modo no podrían conectarse entre si. + No está pensado para que lo usen diréctamente los usuarios. Los servidores como Matrix Synapse necesitan configurarse con los datos proporcionados en la página de app de Coturn. Además de Matrix Synapse, Jitsi, Ejabberd, Nextcloud Talk, etc. pueden usar el servidor Coturn para llamadas y conferencias de audio/video. No hace falta que los servidores se ejecuten en la misma máquina que FreedomBox. Los servidores externos pueden usar un Coturn ejecutado en FreedomBox. + Coturn está disponible en FreedomBox desde la version 20.8 como app avanzada. Esto implica que para ver el icono de Coturn en la sección "Apps" necesitas marcar en "Mostrar apps y funcionalidades avanzadas" en "Configuración General". +
+ Cómo funciona + Al hacer una llamada de audio/video lo mejor es enrutar los flujos multimedia directamente entre los pares porque minimiza la latencia (mejor calidad de señal) y evita depender de un servidor centralizado (privacidad). Esto escala bien porque un servidor de chat simple puede albergar miles de llamadas sin involucrarse de ningún otro modo que para establecer la llamada. Sin embargo este enfoque no suele funcionar la mayoría de las veces por cómo se configuran las redes. La mayoría de los pares de la red carecen de una dirección IP propia reservada para ellos y suelen operar detrás de un dispositivo de red que les traduce las direcciones de red (NAT: "Network Address Translation"). Esto significa que en realidad estos pares no tienen modo de alcanzarse entre sí directamente. + Para abordar este problema se introdujo una técnica simple conocida como STUN. Con ayuda de un servidor STUN los pares pueden prescindir de los dispositivos NAT para transmitir entre ellos. Desafortunadamente este truco solo funciona un 80% de las ocasiones. Así que si STUN falla, los pares no tienen más opción que enrutar su comunicación a través de un intermediario llamado servidor TURN. Todo el mecanismo de intentar primero con STUN y recaer en TURN se describe en un protocolo llamado ICE. + En FreedomBox, Coturn proporciona servidores STUN y TURN. Ambos servicios se proporcionan tanto sobre TCP como sobre UDP y tanto en canales cifrados (que tienen mayor probabilidad de éxito) como sin cifrar. Como los servidores STUN son baratos y no consumen muchos recursos no se necesita autenticación para usarlos. Por otra parte los servidores TURN sí la necesitan. Esta autenticación está altamente simplificada y no requiere mantener una base de datos de usuarios. Un servidor como matrix-synapse que vaya a establecer una llamada de audio/video entre dos pares generará un nombre de usuario y contraseña empleando un secreto compartido. Cuando los pares usen el servidor TURN se les validará usando estas credenciales porque el servidor TURN conoce este secreto. + En resumen, un servidor de comunicaciones necesita saber las URLs de los servidores STUN/TURN junto con el secreto de autenticación para TURN. Después, durante el establecimiento de la llamada de audio/video guiarán a los pares a usar los servidores STUN/TURN. La app Coturn de FreedomBox proporciona exactamente ésta información, que se puede usar para configurar un servidor de comunicaciones independientemente de que se ejecute en la misma máquina que FreedomBox o en otro servidor. +
+
+ Configurar Matrix Synapse + El servidor de Matrix Synapse de FreedomBox se puede configurar para que use el servidor de TURN/STUN Coturn. En el futuro, cuando instales Matrix Synapse FreedomBox instalará Coturn automáticamente y configurará sus parámetros en Matrix Synapse. Para configurar Matrix Synapse, edita el fichero /etc/matrix-synapse/homeserver.yaml con las siguientes líneas: + + Y luego reinicia el servidor matrix-synapse deshabilitando y rehabilitando la app de matrix-synapse. +
+
+
+ Deluge (Cliente web de BitTorrent)
¿Qué es Deluge? BitTorrent es un protocolo de comunicaciones para compartir ficheros entre pares (P2P = peer-to-peer). No es anónimo; debes asumir que otros puedan ver qué ficheros estás comprtiendo. Hay 2 clientes web para BitTorrent disponibles en FreedomBox: Transmission y Deluge. Tienen funcionalidades similares pero quizá prefieras uno sobre otro. @@ -1310,354 +1168,7 @@ dd if=temp/usr/lib/u-boot/A20-OLinuXino-Lime2/u-boot-sunxi-with-spl.bin of=
- Block Sandbox (Minetest) - Minetest es un Block Sandbox multijugador para mundos infinitos. Este módulo permite ejecutar el servidor Minetest en esta FreedomBox, en su puerto por defecto (30000). Para conectar al servidor se necesita un cliente de Minetest. -
- Enrutado de Puertos - Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos en tu router para los siguientes puertos de Minetest: - - - UDP 30000 - - -
-
-
- Agenda (Radicale) - Con Radicale puedes sincronizar tus calendarios, listas de tareas y agendas de contactos personales entre varios ordendores, tabletas, y/o teléfonos inteligentes y compartirlos con tus amistades. Todo sin tener que permitir a terceros que accedan a tu información privada. -
- ¿Porque debería usar Radicale? - Usando Radicale puedes evitar servicios centralizados como Google Calendar o Apple Calendar (iCloud) que explotan los datos de tus eventos y conexiones sociales. -
-
- ¿Cómo configurar Radicale? - Primero el servidor Radicale necesita estar activado en tu FreedomBox. - - - En el servicio FreedomBox (Plinth) - - - selecciona Apps - - - ve a Radicale (Calendario y Libreta de contactos) e - - - instala la aplicación. Tras completar la instalación asegúrate de que la aplicación está marcada como "habilitada" en el interfaz de FreedomBox. Habilitar la aplicación arranca el servidor CalDAV/CardDAV Radicale. - - - define los permisos de acceso: - - - Solo el dueño de un calendario/libreta de contactos puede ver o hacer cambios - - - Cualquier usuario puede ver cualquier calendario/libreta de contactos pero solo el dueño puede hacer cambios - - - Cualquier usuario puede ver o hacer cambios en cualquier calendario/libreta - - - - - - - Nota: Solo los usuarios dados de alta en FreedomBox pueden acceder a Radicale. - - - - - - - Radicale-Plinth.png - - - - Si quieres compartir un calendario solo con algunos usuarios determinados la manera más simple es crear un nuevo usuario común para ellos y compartir con ellos el nombre del usuario común y su contraseña. - Radicale proporciona un interfaz web básico que solo soporta crear calendarios y libretas nuevos. Para añadir eventos o contactos se necesita una aplicación cliente soportada externa. - - - - - - - radicale_web.png - - - - - - Crear calendarios y/o libretas usando el interfaz web - - - Visita https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/ - - - Ingresa con tu cuenta de FreedomBox - - - Selecciona "Crear nuevo calendario o libreta" - - - Proporciona un título y selecciona el tipo - - - Opcionalmente, proporciona una descripción o selecciona un color - - - Haz clic en "Crear" - - - La página mostrará la URL de tu created nuevo calendario o libreta - - - - - Ahora abre tu aplicación cliente para crear calendarios y/o libretas nuevos que usarán tu FreedomBox y servidor Radicale. El sitio web de Radicale proporciona una lista de clientes soportados pero no uses las URLs que se mencionan allí; sigue este manual porque FreedomBox usa otra configuración. A continuación se muestran los pasos para 2 ejemplos: - - - Ejemplo de configuración con el cliente Evolution: - - - Calendario - - - Crea un calendario nuevo - - - Selecciona el "Tipo" "CalDAV" - - - Con "CalDAV" seleccionado aparecerán más opciones en el cuadro de diálogo. - - - URL: https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/<usuario>/<nombre_del_calendario>.ics/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. - - - nota: la / inicial de la ruta es importante. - - - - - Habilita "Usar una conexión segura." - - - Nombre del calendario - - - - - - - Radicale-Evolution-Docu.png - - - - - - - - Lista de tareas: Añadir una lista de tareas es prácticamente igual que con un calendario. - - - Contactos - - - Sigue los mismos pasos anteriores reemplazando CalDAV por WebDAV y la extensión de la libreta por .vcf. - - - - - - -
-
- Sincronizar via Tor - Configurar un calendario en FreedomBox con Radicale sobre Tor es lo mismo que sobre la red en claro, en resumen: - - - Cuando hayas ingresado al interfaz web de FreedomBox desde Tor haz clic en Radicale e introduce un usuario de tu FreedomBox y su contraseña. - - - Ingresa en el interfaz web de Radicale usando el usuario de tu FreedomBox y su contraseña. - - - Haz clic en "Crear libreta o calendario nuevo", proporciona un título, selecciona un tipo y haz clic en "Crear". - - - Anota la URL, p.ej. https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. - - - Estas instrucciones son para Thunderbird/Lightning. Nota: necesitarás estar conectado a Tor con el Tor Browser Bundle. - - - Abre Thunderbird, la extensión (add-on) Torbirdy y reinicia Thunderbird. (Quizá no haga falta.) - - - En el interfaz Lightning, en el panel izquierdo bajo Calendario haz clic con el botón derecho del ratón y selecciona "Nuevo calendario". - - - Selecciona "En la red" como localización de tu calendario. - - - Selecciona "CalDAV" copia la URL, p.ej., https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/. como localización cambiando los elementos marcados entre <> de acuerdo a tu configuración. - - - Proporciona un nombre, etc. Haz clic en "Siguiente". Tu calendario está ahora sincronizando con tu FreedomBox a través de Tor. - - - Si no has generado un certificado con "Let's Encrypt" para tu FreedomBox quizá necesites seleccionar "Confirmar Excepción de Seguridad" cuando se te indique. - - -
-
- Sincronizar con tu teléfono Android - Hay varias Apps que admiten integración con el servidor Radicale. Este ejemplo usa DAVx5, que está disponible p.ej. en F-Droid. Si también quieres usar listas de tareas hay que instalar primero la app compatible OpenTasks. - Sigue estos pasos para configurar tu cuanta con el servidor Radicale de tu FreedomBox. - - - Instala DAVx5. - - - Crea una cuenta nueva en DAVx5 haciendo clic en el botón flotante [+]. - - - Selecciona la 2ª opción como se muestra en la primera imagen más abajo e introduce la URL base (no olvides la / del final). DAVx5 averiguará las cuentas CalDAV y WebDAV del usuario. - - - Sigue este video del FAQ de DAVx5 para aprender cómo importar tus contactos existentes a Radicale. - - - - Sincronizar contactos - - - - Haz clic en los menús de hamburguesa de CalDAV y CardDAV y selecciona "Refrescar ..." en caso de cuentas existentes o "Crear ..." en caso de cuentas nuevas (ver la 2ª captura de pantalla más abajo). - - - Marca las cajas de las libretas y/o contactos que quieras sincronizar y haz clic en el botón de sincronización de la cabecera. (ver la 3ª captura de pantalla más abajo) - - - - - - - - - DAVx5 account setup - - - - - - - - DAVx5 refresh - - - - - - - - DAVx5 account sync - - - -
-
- Usuarios Avanzados -
- Compartir recursos - Arriba se mostrá una manera fácil de crear un recurso para un grupo de gente creando una cuenta dedicada común. Aquí de describe un método alternativo con el que se otorga acceso a un calendario a 2 usuarios Usuario1 y Usuario2. Esto requiere acceso por SSH a la FreedomBox. - - - crea un archivo /etc/radicale/rights - - - - - - [calendario_de_mis_amigos] es solo un identificador, puede ser cualquier nombre. - - - La sección [owner-write] asegura que los dueños tengan acceso a sus propios archivos. - - - - - Edita el archivo /etc/radicale/config y haz los siguientes cambios en la sección [rights) - - - - - - - - Reinicia el servidor Radicale o la FreedomBox - - -
-
- Importar archivos - Si estás usando un archivo de contactos exportado desde otro servicio o aplicación hay que copiarlo a: /var/lib/radicale/collections/<usuario>/<nombre_del_archivo_de_contactos>'.vcf. -
-
-
- Migrar desde Radicale versión 1.x a versión 2.x - En Febrero de 2019 se actualizó Radicale en las versiones "en pruebas" (testing) de Debian desde la versión 1.x a la 2.x. La versión 2.x es mejor pero incompatible con los datos y la configuración empleados en la 1.x. El mecanismo automático de actualización de FreedomBox que emplean las actualizaciones desatendidas no actualiza automaticamente la version 2.x de Radicale debido a cambios en los archivos de configuración. No obstante la version 19.1 de FreedomBox, disponible en en las versiones "en pruebas" (testing) desde el 23 de Febrero de 2019, realizará la migración de los datos y la configuración a la versión 2.x de Radicale. No se requiere ninguna acción por parte de los usuarios típicos. Ocurrirá automáticamente. - Si por algún motivo necesitas ejecutar a mano apt dist-upgrade en tu máquina Radicale se actualizará a 2.x y entonces tu FreedomBox no podrá ejecutar esta actualización (ya que el proyecto de origen decidió eliminar las herramientas de migración de la versión 2.x de Radicale). Para evitar esta situación se recomienda el siguiente procedimiento para actualizar. - - En cualquier caso, si ya has actualizado a Radicale 2.x sin ayuda de FreedomBox necesitas realizar la migración de los datos y la configuración por tí mismo. Sigue este procedimiento: - - Notas: - - - python-radicale es un paquete antigüo de la versión 1.x de Radicale que sigue disponible en las versiones "en pruebas" (testing) de Debian. Esto es un hack alternativo para emplear la funcionalidad --export-storage que es responsable de la migración de datos. Por desgracia esta funcionalidad ya no está disponible en Radicale 2.x. - - - Los ficheros que acaban en .dpkg-dist solo existirán si has elegido "Conservar tu versión actualmente instalada" cuando se te preguntó durante la actualización a Radicale 2.x. El procedimiento anterior sobrescribirá la configuración antigüa con una nueva. No se necesitan cambios a los 2 ficheros de configuración salvo que hayas cambiado la preferencia de compartición de calendario. - - - Nota: Durante la migración tus datos permanecen a salvo en el directorio /var/lib/radicale/collections. Los datos nuevos se crearán y usarán en el directorio /var/lib/radicale/collections/collections-root/. - - - El comando tar hace una copia de seguridad de tu configuración y tus datos en /root/radicale_backup.tgz por si haces o algo va mal y quieres deshacer los cambios. - - -
-
- Resolución de Problemas - 1. Si estás usando FreedomBox Pioneer Edition o instalando FreedomBox sobre Debian Buster Radicale podría no estar operativo inmediatamente después de la instalación. Esto se debe a un defecto ya corregido posteriormente. Para superar el problema actualiza FreedomBox haciendo clic en 'Actualización Manual' desde la app 'Actualizaciones'. Otra opción es simplemente esperar un par de días y dejar que FreedomBox se actualice solo. Después instala Radicale. Si Radicale ya está instalado deshabilitalo y rehabilitalo después de que se complete la actualización. Esto arreglará el problema y dejará a Radicale trabajando correctamente. -
-
-
- Servidor de Mensajería Instantánea (chat) (ejabberd) + ejabberd (Servidor de Mensajería Instantánea (chat))
¿Qué es XMPP? XMPP es un protocolo federatedo para Mensajería Instantánea. Esto significa que los usuarios que tengan cuenta en un servidor XMPP pueden conversar con los usuarios que estén en el mismo u otros servidores XMPP. XMPP se puede usar también para llamadas de voz y vídeo si los clientes las soportan. @@ -1684,7 +1195,7 @@ if [ -f /etc/default/radicale.dpkg-dist ] ; then cp /etc/default/radicale.dpkg-d
Registrando los usuarios XMPP mediante SSO - Actualmente todos los usuarios creados con Plinth podrán ingresar al servidor XMPP. Puedes añadir usuarios nuevos con el módulo de "Usuarios y Grupos del Sistema". Los grupos seleccionados para el usuario nuevo no importan. + Actualmente todos los usuarios creados con FreedomBox podrán ingresar al servidor XMPP. Puedes añadir usuarios nuevos con el módulo de "Usuarios y Grupos del Sistema". Los grupos seleccionados para el usuario nuevo no importan.
Usar el cliente web @@ -1708,7 +1219,156 @@ if [ -f /etc/default/radicale.dpkg-dist ] ; then cp /etc/default/radicale.dpkg-d
- Servidor de Mensajería Instantánea (chat) (Matrix Synapse) + GitWeb (Alojamiento simple para Git) + GitWeb proporciona alojamiento Git en FreedomBox. Proporciona un interfaz web simple para realizar acciones comunes como ver archivos, diferencias, descripciones de cambio, etc. + Disponible desde versión: 19.19 +
+ Autenticación básica HTTP + Actualmente el GitWeb de FreedomBox solo soporta remotos HTTP. Para evitar tener que introducir la contraseña cada vez que haces pull/push al repositorio puedes editar tu remoto para incluír credenciales. + + Ejemplo: + + + Tu nombre de usuario y contraseña se cifrarán. Quien monitorize el tráfico de la red solo apreciará el nombre de dominio. + Nota: Al usar este método tu contraseña se almacenará en claro en el fichero .git/config del repositorio local. Por este motivo debes crear un usuario FreedomBox que solo tenga acceso a gitweb y no usar nunca una cuenta de administrador. +
+
+ Réplicas Espejo + Aunque tus repositorios se albergan principalmente en tu propia FreedomBox puedes configurar un repositorio en otro servicio de alojamiento Git como GitLab a modo de copia espejo. +
+
+
+ I2P (Red anónima) +
+ Acerca de I2P + El Proyecto Internet Invisible (I2P) es una capa anonimizadora de red concebida para protejer las comunicaciones de la censura y la vigilancia. I2P proporciona anonimato enviando tráfico cifrado a través de una red distribuída alrededor del mundo gestionada por voluntarios. + Más información acerca de I2P en la página principal del proyecto. +
+
+ Servicios Ofrecidos + Los siguientes servicios se ofrecen en FreedomBox a través de I2P de serie. Se pueden habilitar más servicios desde la consola de enrutado I2P que se puede abrir desde el interfaz web de FreedomBox. + + + Navegación web anónima: I2P se puede usar para navegar por la web de forma anónima. Para ello configura tu navegador (preferíblemente un navegador Tor) para conectar al proxy I2P. Esto se puede hacer estableciendo los proxies HTTP y HTTPS a freedombox.local (o la IP local de tu FreedomBox) con sus respectivos puertos a 4444 y 4445. Este servicio está disponible sólo cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de navegación web anónima a través de I2P. + + + Acceso a eepsites: La red I2P puede albergar sitios web anónimos llamados eepsites cuyo nombre de dominio acaba en .i2p. Por ejemplo, http://i2p-projekt.i2p/ es el sitio web del proyecto I2P en la red I2P. Los eepsites son inaccesibles a un navegador normal a través de una conexión Internet normal. Para navegar a los eepsites tu navegador necesita configurarse para usar los proxies HTTP y HTTPS como se describió antes. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de acceso a eepsites a través de I2P. + + + Descargas anónima de torrentes: I2PSnark, una aplicación para descargar y compartir archivos anónimamente mediante la red BitTorrent está disponible y habilitada por defecto en FreedomBox. Esta aplicación se controla mediante un interfaz web que se puede abrir desde la sección Torrentes Anonimos de la app I2P en el interfaz web de FreedomBox o de la consola de enrutado I2P. Solo los usuarios ingresados pertenecientes al grupo Manage I2P application pueden usar este servicio. + + + Red IRC: La red I2P contiene una red IRC llamada Irc2P. Esta red alberga el canal IRC oficial del proyecto I2P, entre otros. Este servicio viene habilitdo de serie en FreedomBox. Para usarlo abre tu cliente IRC favorito y configuralo para conectar con freedombox.local (o la IP local de tu FreedomBox) en el puerto 6668. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de IRC a través de I2P. + + + Consola de enrutado I2P: Este es el interfaz central de administración de I2P. Muestra el estado actual de I2P, estadísticas de ancho de banda y permite modificar varias preferencias de configuración. Puedes adecuar tu participación en la red I2P y usar/editar una lista con tus sitios I2P (eepsites) favoritos. Solo los usuarios ingresados pertenecientes al grupo Manage I2P application pueden usar este servicio. + + +
+
+
+ Ikiwiki (Wiki y Blog) +
+ ¿Qué es Ikiwiki? + Ikiwiki convierte páginas wiki a páginas HTML listas para publicar en un sitio web. En particular, proporciona blogs, podcasts, calendarios y una amplia selección de extensiones (plugins). +
+
+ Inicio rápido + Tras instalar la app en el interfaz de administración de tu FreedomBox: + + + Ve a la sección Crear y crea un wiki o un blog. + + + Vuelve a la sección Configurar y haz clic en el enlace /ikiwiki. + + + Haz clic en el nombre de tu nuevo wiki o blog bajo Directorio Padre. + + + Disfruta de tu nueva página de publicación. + + +
+
+ Crear un wiki o blog + Puedes crear un wiki o blog para albergarlo en tu FreedomBox mediante la página Wiki y Blog (Ikiwiki). La primera vez que visites esta página te pedirá instalar paquetes requiridos por Ikiwiki. + Tras completar la instalación de paquetes selecciona la solapa Crear. Puedes elegir el tipo: Wiki o Blog. Teclea también un nombre para el wiki o blog, y el usuario y contraseña para su cuenta de administrador. Al hacer clic en Actualizar configuración verás el wiki/blog añadido a tu lista. Observa que cada wiki/blog tiene su propia cuenta de administrador. + + + + + + + ikiwiki: Create + + + +
+
+ Acceder a tu wiki o blog + Desde la página de Wiki y Blog (Ikiwiki) selecciona la solapa Administrar y verás una lista de tus wikis y blogs. Haz clic en un nombre para navegar a ese wiki o blog. + + + + + + + ikiwiki: Manage + + + + Desde aquí, si le das a Editar o a Preferencias se te llevará a una página de ingreso. Para ingresar con la cuenta de administrador que creaste antes selecciona la solapa Otros, introduce el usuario y la contraseña y haz clic en Ingresar. +
+
+ Ingreso único de usuarios (SSO) + Se puede dar permiso para editar a otros usuarios de FreedomBox además de al administrador del wiki/blog. Sin embargo no tendrán todos los permisos del administrador. Podrán añadir o editar páginas pero no podrán cambiar la configuración del wiki. + Para añadir a un usuario al wiki ve a la página Usuarios y Grupos de FreedomBox (bajo Configuración del Sistema, el icono del engranaje de la esquina superior derecha de la página). Crea o modifica un usuario y añádele al grupo wiki. (Los usuarios del grupo admin tendrán también acceso al wiki.) + Para ingresar como usuario FreedomBox ve a la página de ingreso del wiki/blog y selecciona la solapa Otros. Luego haz clic en el botón Ingresar con autenticación HTTP. El navegador mostrá un diálogo emergente en el que podrás introducir el usuario y la contraseña del usuario de FreedomBox. +
+
+ Añadir usuarios FreedomBox como admnistradores de wiki + + + Ingresa al wiki con su cuenta de administrador. + + + Haz clic en Preferencias y luego en Configurar. + + + Debajo de Principal, en usuarios administradores de algún wiki, añade el nombre de un usuario de FreedomBox. + + + (Opcional) Desmarca la opción habilitar autenticación mediante contraseña de extensión de autenticación: autenticación mediante contraseña. (Nota: Esto deshabilitará el ingreso con la cuenta de administrador anterior. Solo se podrá ingresar mediante ingreso único usando autenticación HTTP.) + + + Haz clic en Grabar Configuración. + + + Pulsa Preferencias y a continuación Salir. + + + Ingresa como el nuevo usuario administrador usando Ingresar con autenticación HTTP. + + +
+
+
+ infinoted (Servidor Gobby) + Infinoted es un servidor de edición colaborativa de textos para Gobby. + Para usarlo descarga el cliente Gobby para escritorio e instalalo. Inicialo, selecciona "Conectar a un Servidor" e introduce el nombre de dominio de tu FreedomBox. +
+ Redirección de Puertos + Si tu FreedomBox está detras de un router necesitarás configurar la redirección de puertos en tu router. Redirije los siguientes puertos de infinoted: + + + TCP 6523 + + +
+
+
+ Matrix Synapse (Servidor de Mensajería Instantánea (chat))
¿Qué es Matrix? Matrix es un estándar abierto para comunicaciones sobre IP en tiempo real interoperables y descentralizadas. Synapse es la implementación de referencia de un servidor Matrix. Se puede usar para montar mensajería instantánea sobre FreedomBox para albergar grandes salones de chat, comunicaciones cifradas punto a punto y llamadas de audio/vídeo. Matrix Synapse es una aplicación federada en la que puede haber salas de chat en un servidor y los usuarios de cualquier otro servidor de la red federada pueden unirse a ellas. Más información acerca de Matrix. @@ -1770,90 +1430,169 @@ echo "UPDATE users SET admin=1 WHERE name='@miusuario:dominio'" | sudo sqlite3 /
- Cliente de Correo Electrónico (Email) (Roundcube) + MediaWiki (Wiki)
- ¿Qué es Roundcube? - Roundcube es un cliente de correo electrónico (email) para navegador con un interfaz de usuario parecido a una aplicación de escritorio. Admite varios lenguajes. Roundcube usa el protocolo de acceso a mensajes de Internet (IMAP = Internet Message Access Protocol) para acceder a los correos en un servidor remoto. Soporta MIME para enviar archivos adjuntos y en particular proporciona libreta de contactos, gestión de carpetas, búsquedas de mensajes y verificación ortográfica. + Acerca de MediaWiki + MediaWiki es el software de base de la gama de wikis Wikimedia. + Lee más acerca de MediaWiki en Wikipedia + Disponible desde: versión 0.20.0
- Usar Roundcube - Tras instalar Roundcube se puede acceder a él en https://<tu_freedombox>/roundcube. Introduce tu usuario y contraseña. El usuario de muchos servicios de correo electrónico suele ser la propia dirección completa, como usuario_de_ejemplo@servicio_de_ejemplo.org, no solo el usuario usuario_de_ejemplo. Introduce la dirección del servidor IMAP de tu servicio de correo electrónico en el campo Servidor. Puedes probar a poner aquí tu nombre de dominio como servicio_de_ejemplo.org si la dirección es usuario_de_ejemplo@servicio_de_ejemplo.org y si esto no funciona consulta la dirección del servidor IMAP en la documentación de tu proveedor de correo electrónico. Se recomienda encarecidamente usar una conexión cifrada a tu servidor IMAP. Para ello inserta el prefijo "imaps://" al principio de la dirección del servidor IMAP. Por ejemplo, imaps://imap.servicio_de_ejemplo.org. - - - - - - - Logging into your IMAP server - - - -
-
- Usar Gmail con Roundcube - Si quieres usar Roundcube con tu cuenta Gmail necesitas habilitar primero el ingreso con contraseña en las preferencias de tu cuenta Google porque Gmail no va a permitir por defecto que ingresen aplicaciones mediante contraseña. Para hacerlo visita las preferencias de la Cuenta Google y habilita Apps Menos seguras. A continuación ingresa en Roundcube introduciendo tu dirección de Gmail como Usuario y tu contraseña. En el campo servidor pon imaps://imap.gmail.com. - - - - - - - Logging into Gmail - - - + MediaWiki en FreedomBox + MediaWiki viene configurado en FreedomBox para ser públicamente legible y editable en privado. Sólo los usuarios ingresados pueden editar el wiki. Esta configuración evita publicidad indeseada (spam) y otros vandalismos en tu wiki. +
+ Administración de Usuarios + Solo el administrador de MediaWiki (usuario "admin") puede crear los usuarios. El usuario "admin" puede usarse también para restablecer contraseñas de usuarios MediaWiki. Si se olvida la contraseña del administrador se puede restablecer desde la página de MediaWiki del interfaz web de FreedomBox. +
+
+ Casos de uso + MediaWiki es muy versátil y se puede emplear para muchos usos creativos. También es áltamente adaptable y viene con un montón de extensiones (plugins) y estilos estéticos. +
+ Repositorio Personal de Conocimiento + El MediaWiki de FreedomBox puede ser tu propio repositorio de conocimiento personal. Como MediaWiki tiene buen soporte multimedia puedes escribir notas, almacenar imágenes, crear listas de comprobación, guardar referencias y enlaces, etc. de manera organizada. Puedes almacenar el conocimiento de una vida en tu instancia de MediaWiki. +
+
+ Wiki Comunitario + Una comunidad de usuarios podría usar MediaWiki como su repositorio común de conocimiento y material de referencia. Se puede emplear como un tablón de anunciós de universidad, como un servidor de documentación para una pequeña empresa, como un bloc de notas para grupos de estudio o como un wiki de fans al estilo de wikia. +
+
+ Sitio Web Personal implementado mediante un Wiki + Varios sitios web de internet son sólo instancias de MediaWiki. El MediaWiki de FreedomBox es de solo lectura para visitantes. Se puede por tanto adaptar para servir como tu sitio web y/o blog personal. El contenido de MediaWiki es fácil de exportar y puede moverse después a otro motor de blogs. +
+
+
+ Editar Contenido del Wiki + FreedomBox monta MediaWiki con un editor básico con una barra de herramientas con opciones de uso habitual como negrita, cursiva etc. Haz clic en la sección Avanzadas para acceder a más opciones como cabaceras, listas con viñetas, etc. + + + + + + + mediawiki-toolbar.png + + + +
+ Editor Visual + Como su nombre indica, el nuevo Editor Visual de MediaWiki ofrece un interfaz de usuario visual (WYSIWYG) para crear páginas del wiki. Pero esta funcionalidad está todavía en pruebas y MediaWiki no la trae de serie. Una solución temporal posible sería escribir tu contenido con el Editor Visual del borrador de Wikipedia, cambiar el modo de edición a texto y copiarlo a tu wiki. +
+
+ Otros Formatos + No es imprescindible que aprendas el lenguaje de formateo de MediaWiki. Puedes escribir en tu formato favorito (Markdown, Org-mode, LaTeX etc.) y convertirlo al formato de MediaWiki usando Pandoc. +
+
+ Cargar Imágenes + Se puede habilitar la carga de imágenes desde FreedomBox versión 0.36.0. También puedes usar directamente imágenes de Wikimedia Commons mediante una funcionalidad llamada Instant Commons. +
+
+
+ Personalización +
+ Temas de estilo + El tema por defecto de MediaWiki suele ser Vector. El de FreedomBox es Timeless. + Vector es un tema optimizado para visualizarlo en pantallas grandes pero no se adecúa bien a los tamaños de pantalla de los móviles. Wikimedia usa otro sitio específico para móviles. Para instalaciones pequeñas como las de FreedomBox no merece la pena un segundo sitio dedicado. Usar un tema de estilo más polivalente como Timeless es una solución más eficiente al problema. + Los administradores pueden elegir el tema por defecto desde la configuración de la app. Los usuarios del sitio tienen también la opción de visualizarlo con temas diferentes. +
+
- Compartición de Archivos (Coquelicot) + Minetest (Sandbox de bloques) + Minetest es un Block Sandbox multijugador para mundos infinitos. Este módulo permite ejecutar el servidor Minetest en esta FreedomBox, en su puerto por defecto (30000). Para conectar al servidor se necesita un cliente de Minetest.
- Acerca de Coquelicot - Coquelicot es aplicación web para compartir archivos enfocada a proteger la privacidad de sus usuarios. El principio básico es simple: los usuarios pueden subir un archivo al servidor y a cambio reciben una URL única para descargarlo que se puede compartir con terceros. Además se puede establecer una contraseña para reforzar el acceso. - Más información acerca de Coquelicot en su LEEME - Disponible desde: versión 0.24.0 -
-
- Cuando usar Coquelicot - El mejor uso de Coquelicot es para compartir rápidamente un archivo suelto. Si quieres compartir una carpeta... + Enrutado de Puertos + Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos en tu router para los siguientes puertos de Minetest: - ...para usar y tirar, comprime la carpeta y compartela como archivo con Coquelicot - - - ...que deba mantenerse sincronizada entre ordenadores usa mejor Syncthing + UDP 30000 - Coquelicot también puede proporcionar un grado de privacidad razonable. Si se necesita anonimato mejor sopesas emplear la aplicación de escritorio Onionshare. - Como Coquelicot carga todo el archivo al servidor tu FreedomBox consumirá ancho de banda tanto para la subida como para la descarga. Para archivos muy grandes sopesa compartirlos creando un fichero BitTorrent privado. Si se necesita anonimato usa Onionshare. Es P2P y no necesita servidor. -
-
- Coquelicot en FreedomBox - Con Coquelicot instalado puedes subir archivos a tu servidor FreedomBox y compartirlos en privado. - Tras la instalación la página de Coquelicot ofrece 2 preferencias. - - - Contraseña de Subida: Actualmente y por facilidad de uso Coquelicot está configurado en FreedomBox para usar autenticación simple por contraseña. Recuerda que se trata de una contraseña global para esta instancia de Coquelicot y no tu contraseña de usuario para FreedomBox. Tienes que acordarte de esta contraseña. Puedes establecer otra en cualquier momento desde el interfaz Plinth. - - - Tamaño Máximo de Archivo: Puedes alterar el tamaño máximo de los archivos a transferir mediante Coquelicot usando esta preferencia. El tamaño se expresa en Mebibytes y el máximo solo está limitado por el espacio en disco de tu FreedomBox. - - -
-
- Privacidad - Alguien que monitorice tu tráfico de red podría averiguar que se está transfiriendo un archivo en tu FreedomBox y posiblemente también su tamaño pero no sabrá su nombre. Coquelicot cifra los archivos en el servidor y sobrescribe los contenidos con 0s al borrarlos, eliminando el riesgo de que se desvelen los contenidos del fichero si tu FreedomBox resultara confiscada o robada. El riesgo real que hay que mitigar es que además del destinatario legítimo un tercero también descargue tu fichero. -
- Compartir mediante mensajería instantánea - Algunas aplicaciones de mensajería instantánea con vista previa de sitios web podrían descargar tu fichero para mostrarla (su vista previa) en la conversación. Si configuras la opción de descarga única para un archivo podrías notar que la aplicación de mensajería consume la única descarga. Si compartes mediante estas aplicaciones usa una contraseña de descarga en combinación con la opción de descarga única. -
-
- Compartir en privado enlaces de descarga - Se recomienda compartir las contraseñas y los enlaces de descarga de tus archivos por canales cifrados. Puedes evitar todos los problemas anteriores con las vistas previas de la mensajería instantánea símplemente empleando aplicaciones de mensajería que soporten conversaciones cifradas como Riot con Matrix Synapse o XMPP (servidor ejabberd en FreedomBox) con clientes que soporten cifrado punto a punto. Envía la contraseña y el enlace de descarga separados en 2 mensajes distintos (ayuda que tu aplicación de mensajería soporte perfect forward secrecy como XMPP con OTR). También puedes compartir tus enlaces por correo electrónico cifrado con PGP usando Thunderbird. -
- Compartición de Archivos (MLDonkey) + MiniDLNA (Servidor multimedia básico) + MiniDLNA es un servidor multimedia que intenta ser compatible con clientes DLNA/UPnP. + Nota: Este servicio solo está disponible en redes configuradas como zona "interna". Tampoco está disponble a través de OpenVPN (es incompatible). +
+ ¿Qué es UPnP/DLNA? + UPnP (Universal plug & play) es un conjunto de protocolos de red que permite a los dispositivos de una red, como PCs, TVs, impresoras etc, reconocerse entre sí y establecer comunicación para compartir datos. Es un protocolo con cero configuración y require solo un servidor multimedia y un reproductor multimedia compatibles con el protocolo. + DLNA se deriva de UPnP como una forma de estandarizar interoperabilidad entre medios. Conforma un estándar/certificación que cumplen muchos dispositivos electrónicos de consumo. +
+
+ Desplegando MiniDLNA en tu FreedomBox. + Para instalar/habilitar el servidor multimedia necesitas navegar a la página MiniDLNA y habilitarlo. Se intenta que la aplicación esté disponible en la red interna y por ello requiere asignarle un interfaz de red configurado para tráfico interno. + Tras la instalación queda disponible una página web en . Incluye información de cuántos ficheros detecta el servidor, cuántas conexiones existen etc. Esto resulta muy útil cuando conectas discos externos con contenido para para verificar que detecta los nuevos archivos como debe. Si no ocurre así, desconectar y activar el servidor lo arreglará. +
+
+ Usar MiniDLNA para reproducir contenidos multimedia en tus dispositivos + Cualquier dispositivo compatible con DLNA debiera ser capaz de detectar, hojear y reproducir automáticamente contenido multimedia de MiniDLNA en FreedomBox. Los siguientes dispositivos y reproductores se han probado: + + + GNOME Videos: Videos es el reproductor multimedia por defecto en el popular entorno de escritorio GNU/Linux GNOME. Abre Videos, cambia a 'Canales'. Deberías ver un canal denominado 'freedombox: minidlna'. Deberías poder hojear y reproducir su contenido. + + + VLC media player: VLC es un reproductor multimedia para GNU/Linux, Android, Windows y macOS muy popular. Abre VLC y haz clic en 'Ver -> Lista de reproducción'. En la barra lateral de la lista de reproducción que aparece selecciona 'Universal Plug'n'Play'. Deberías ver un elemento denominado 'freedombox: minidlna'. Deberías poder hojear y reproducir su contenido. + + + Kodi: Kodi es un software popular de centro multimedia con un interfaz de usuario diseñado para televisores. Abre Kodi, ve a 'Sistema -> Configuración del Servicio -> UPnP/DLNA' y 'Habilitar soporte UPnP'. Visita entonces 'Home -> Videos -> Archivos -> Añadir videos... -> Navegar -> dispositivos UPnP'. Deberías ver 'freedombox: minidlna'. Selecciónalo y elige 'OK'. Entonces, elige 'OK en el diálogo 'Anadir entrada de video'. A partir de ahora , deberías ver 'freedombox: minidlna' en la sección 'Videos -> Archivos'. Deberías poder hojear y reproducir su contenido. Para más información mira la documentación de Kodi. + + + Roku: Roku es un aparato conectado a una TV para reproducir contenido de servicios de retransmisión por Internet. También hay muchas TVs que llevan a Roku integrado. Encuentra en el interfaz de Roku un canal denominado 'Roku Media Player' y ábrelo. Deberías ver un elemento denominado 'freedombox: minidlna'. Deberías poder hojear y reproducir su contenido. + + + Rhythmbox: Rhythmbox es el reproductor de sonido por defecto en el popular entorno de escritorio GNU/Linux GNOME. Abre Rhythmbox y asegura que el panel lateral esté abierto pulsando en 'Menú de Aplicación -> Ver -> Panel Lateral'. En el panel lateral deberías ver 'freedombox:minidlna' bajo la sección 'Compartidos'. Deberías poder hojear y reproducir sus archivos de sonido. Los archivos de video no aparecerán. + + +
+
+ Formatos multimedia soportados + MiniDLNA soporta una amplia variedad de formatos de archivo de video y sonido. + + + Video: Archivos terminados en .avi, .mp4, .mkv, .mpg, .mpeg, .wmv, .m4v, .flv, .mov, .3gp, etc. + + + Sonido: Archivos terminados en .mp3, .ogg, .flac, .wav, .pcm, .wma, .fla, .aac, etc. + + + Imágen: Archivos terminados en .jpg, .jpeg + + + Listas de Reproducción: Archivos terminados enh .m3u, .pls + + + Subtítulos: Archivos terminados en .srt, .smi + + + Obsérvese que no soporta archivos con las siguientes extensiones. Parece que renombrar el archivo a una extensión reconocida funciona el la mayoría de casos. + + + Video: Archivos terminados en .webm + + + Además del soporte al formato de archivo por parte de MiniDLNA, tu dispositivo o reproductor de medios necesita soportar el codec de sonido/video con el que se haya codificado tu contenido. MiniDLNA carece de la habilidad de traducir archivos a un codec compatible con el reproductor. Si te topas con problemas en la reproducción de contenido, usa VLC para identificar el codec empleado en el contenido y comprueba en la documentación de tu dispositivo o reproductor de medios si lo soporta. +
+
+ Sistemas de archivo para discos externos. + Al usar un disco externo que se usa también desde sistemas Windows el mejor formato para el sistema de archivos es NTFS. NTFS conservará los permisos de acceso de Linux y la codificación UTF-8 para los nombres de fichero. Esto es útil si los nombres de archivos tienen tildes, eñes u otros signos raros. +
+
+ Enlaces externos + + + (en) + + + + + + + +
+
+
+ MLDonkey (Compartir archivos entre pares)
¿Qué es MLDonkey? MLDonkey es una aplicación libre y multiprotocolo para compartir archivos entre pares (P2P) que ejecuta un servidor back-end sobre muchas plataformas. Se puede controlar mediante algún interfaz front-end, ya sea web, telnet o cualquier otro de entre una docena de programas cliente nativos. @@ -1897,94 +1636,332 @@ echo "UPDATE users SET admin=1 WHERE name='@miusuario:dominio'" | sudo sqlite3 /
- Sincronización de Archivos (Syncthing) - Con Syncthing instalado en tu FreedomBox puedes sincronizar contenido desde otros dispositivos a tu FreedomBox y vice-versa. Por ejemplo puedes mantener sincronizadas las fotos tomadas desde tu teléfono móvil con tu FreedomBox. - Disponible desde versión: 0.14. - Syncthing es una solución de sincronización entre pares, no una de tipo cliente-servidor. Esto implica que FreedomBox no es realmente el servidor y tus otros dispositivos no son sus clientes. Desde la perspectiva de Syncthing todos son dispositivos equivalentes. Puedes emplear Syncthing para sincronizar tus archivos entre cualquiera de tus dispositivos. La ventaja que aporta FreedomBox consiste en que como es un servidor está encendida (casi) siempre. Supón que quieres sincronizar las fotos de tu teléfono con tu portátil. Si sincronizas tu teléfono con FreedomBox el portátil podrá obtenerlas desde la FreedomBox cuando vuelva a conectarse. No necesitas preocuparte de cuando se conectan los otros dispositivos. Si tu FreedomBox es uno de los dispositivos configurados con la carpeta compartida de Syncthing puedes estár tranquilo que tus otros dispositivos se sincronizarán en cuanto se conecten. - Tras instalarlo sigue estas instrucciones del proyecto Syncthing: Arrancando. - Syncthing permite compartir selectivamente carpetas individuales. Antes de compartir los dispositivos tienen que estar emparejados leyendo códigos QR o introduciendo manualmente identificadores de dispositivo. Syncthing tiene un servicio de autodescubrimiento para identicar fácilmente a los otros dispositivos de la misma subred que tengan Syncthing instalado. - Para acceder al cliente web de la instancia Syncthing que se ejecuta en tu FreedomBox, usa la ruta /syncthing. Actualmente este cliente web está accesible solo a los usuarios de FreedomBox que tengan privilegios de administrador aunque en alguna futura versión podría estarlo a todos los usuarios de FreedomBox. - - - - - - - Syncthing web interface - - - - Syncthing tiene apps Android disponibles en F-Droid y Google Play. También hay disponibles aplicaciones de escritorio multiplataforma. - Para más información acerca de Syncthing visita su sitio web oficial y su documentación. + Mumble (Chat de voz)
- Sincronizar via Tor - Syncthing debe sincronizar automáticamente con tu FreedomBox incluso cuando esta solo sea accesible como servicio Tor Onion. - Si quieres enrutar tu cliente Syncthing via Tor configura la variable de entorno all_proxy: - - Para más información mira la documentación de Syncthing acerca de el uso de proxies. + ¿Qué es Mumble? + Mumble es un software de conversaciones de voz. Principalmente diseñado para uso con juegos multijugador por red, sirve para hablar con alta calidad de audio, cancelación de ruido, comunicación cifrada, autenticación de interlocutores por defecto mediante par de claves pública/privada, y "asistentes" para configurar tu micrófono, por ejemplo. Se puede marcar a un usuario dentro de un canal como "interlocutor prioritario".
- Evitar repetidores de Syncthing - Syncthing emplea por defecto conexiones dinámicas para conectar con otros pares. Esto significa que si estás sincronizando a través de Internet, los datos quizá tengan que atravesar repetidores de Syncthing públicos para alcanzar tus dispositivos. Esto desaprovecha que tu FreedomBox tenga una dirección IP pública. - Al añadir tu FreedomBox como dispositivo en otros clientes de Syncthing establece tu dirección como "tcp://<mi.dominio.freedombox>" en vez de "dinámica". Esto permite a tus pares Syncthing conectarse diréctamente a tu FreedomBox eludiendo la necesidad de repetidores. También permite sincronización rápida bajo demanda si no quieres mantener a Syncthing ejecuándose todo el tiempo en tus dispositivos móviles. + Usar Mumble + FreedomBox incluye el servidor Mumble. Para conectar con el servidor los usuarios pueden descargar algún cliente de entre los disponibles para plataformas de escritorio y móviles.
-
-
- Almacenamiento de Ficheros en Red (Samba) - Samba te permite tener una carpeta compartida en la red local que se puede usar desde multiples ordenadores con sistemas operativos diferentes. De ahora en adelante nos referiremos a estas carpetas como "shares". Puedes tener una carpeta personal compartida por tus propios dispositivos (share casero), una compartida con un grupo de confianza (share de grupo) o una compartida con todo dispositivo de la red (share abierto). - Samba te permite tratar un share como si fueran carpetas locales de tu ordenador. No obstante los shares solo están disponibles en la red local. - Para aprender más acerca de Samba, mira la documentación de usuario de su wiki. - Disponible desde la versión: 19.22 -
- Usar Samba - Tras la instalación, puedes elegir qué discos compartir. Los shares habilitados están accesibles en el administrador de archivos de tu ordenador en la ruta \\freedombox (en Windows) o smb://freedombox.local (en Linux y Mac). Hay 3 tipos de share para elegir: - - - Share abierto - accesible a cualquiera en tu red local. - - - Share de grupo - accesible solo a usuarios FreedomBox que estén en el grupo freedombox-share. - - - Share casero - cada usuario del grupo freedombox-share puede tener su propio espacio privado. - - -
- En Android - Para acceder a shares Samba desde un dispositivo Android instala el "Cliente Samba para Android" desde F-Droid o Google Play. Introduce smb://freedombox.local/<disco> como ruta del share en la app. Tus carpetas compartidas deberían estar visibles en la app de administración de archivos. -
-
-
- Integración con otras apps - La app Transmission de FreedomBox proporciona una configuración para permitir que las descargas se graben directamente en un share Samba. - Si quieres dejar disponibles en Samba ficheros sincronizados con Syncthing tienes que asegurarte de sincronizar en la carpeta compartida de Samba. Además, para dejar las carpetas de Syncthing disponibles en carpetas abiertas o de grupo de Samba necesitas asegurarte de pulsar el botón "Permisos > Ignorar" bajo la pestaña "Avanzado" de la carpeta en el interfaz web de usuario de Syncthing. Esto permitirá escribir los ficheros mediante Samba. -
-
- Comparación con otras apps -
- Syncthing - Syncthing mantiene una copia de la carpeta compartida en cada dispositivo con el que se comparte. Samba mantiene solo una copy en tu dispositivo FreedomBox. - Syncthing puede sincronizar tus carpetas compartidas entre dispositivos por Internet. Los shares Samba solo están disponibles en tu red local. - Como Syncthing es primordialmente una solución de sincronización, tiene funcionalidades como resolución de conflictos y versionado. Samba solo tiene una copia del fichero, así que no necesita tales funcionalidades. Por ejemplo, si dos personas están editando una hoja de cálculo almacenada en un share Samba el último que grabe el fichero gana. -
-
-
-
- Servidor Gobby (infinoted) - Infinoted es un servidor de edición colaborativa de textos para Gobby. - Para usarlo descarga el cliente Gobby para escritorio e instalalo. Inicialo, selecciona "Conectar a un Servidor" e introduce el nombre de dominio de tu FreedomBox.
Redirección de Puertos - Si tu FreedomBox está detras de un router necesitarás configurar la redirección de puertos en tu router. Redirije los siguientes puertos de infinoted: + Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos de tu router. Deberías redirigir los siguientes puertos para Mumble: - TCP 6523 + TCP 64738 + + + UDP 64738
+
+ Administrar Permisos + En Mumble un supeusuario puede crear cuentas de administrador que a su vez pueden administrar permisos a grupos y canales. Esto se puede hacer tras ingresar con el usuario "SuperUser" y la contraseña de superusuario. Ver la Guía de Mumble para obtener información respecto a cómo hacer esto. Actualmente FreedomBox no ofrece una interfaz gráfica para obtener o establecer la contraseña de superusuario en Mumble. Se genera una contraseña de superusuario automáticamente durante la instalación de Mumble. Para obtenerla ingresa en el terminal como admin usando Cockpit , la Shell Segura o la consola. Y ejecuta el siguiente comando: + + Deberás ver una salida como esta: + 2019-11-06 02:47:41.313 1 => Password for 'SuperUser' set to 'noo8Dahwiesh']]> + O puedes establecer una contraseña nueva así: + +
- Cliente IRC (Quassel) + OpenVPN (Red Privada Virtual) +
+ ¿Qué es OpenVPN? + OpenVPN proporciona un servicio de red privada virtual a tu FreedomBox. Puedes usar este software para acceso remoto, VPNs punto-a-punto y seguridad Wi-Fi. OpenVPN incluye soporte para direcciones IP dinámicas y NAT. +
+
+ Redirección de puertos + Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos en tu router. Debes redirigir los siguientes puertos para OpenVPN: + + + UDP 1194 + + +
+
+ Configurar + + + En el menú de apps de FreedomBox selecciona Red Privada Virtual (OpenVPN) y haz clic en Instalar. + + + Tras instalar el módulo todavía queda un paso de configuración que puede llevar largo tiempo completar. Haz clic en "Iniciar configuración" para empezar. + + + + + + + OpenVPN service page + + + + + + Espera a que termine la configuración. Puede tardar un rato. + + + Una vez completada la configuración del servidor OpenVPN puedes descargar tu perfil. Esto descargará un archivo llamado <usuario>.ovpn, siendo <usuario> un usuario de FreedomBox. Todos los usuarios de FreedomBox podrán descargar un perfil propio y diferente. Los usuarios que no sean administradores pueden descargar el perfil desde la portada después de ingresar. + + + El archivo ovpn contiene toda la información que necesita un cliente vpn para conectar con un servidor. + + + El perfil descargado contiene el nombre de dominio de FreedomBox al que debe conectarse el cliente. Este se obtiene del dominio configurado en la sección 'Configuración' de la página de 'Sistema'. En caso de que tu dominio no esté configurado adecuadamente quizá necesites cambiar este valor después de descargar el perfil. Si tu cliente OpenVPN lo permite puedes hacer esto después de importar el perfil OpenVPN. De lo contrario puedes editar el perfil .ovpn con un editor de texto y cambiar la línea 'remote' para que contenga la dirección IP WAN o el hostname de tu FreedomBox como se indica aquí. + + + +
+
+ Navegar por Internet tras conectar a una VPN + Tras conectar a la VPN el dispositivo cliente podrá navegar por Internet sin más configuración adicional. No obstante una pre-condición para que esto funcione es que necesitas tener al menos 1 interfaz (tarjeta) de red conectado a Internet en la zona Externa del cortafuegos. Usa la página de configuración de redes para editar la zona del cortafuegos con los interfaces (tarjetas) de red del dispositivo. +
+
+ Uso +
+ En Android/LineageOS + + + Visita la página principal de FreedomBox. Ingresa con tu cuenta de usuario. Desde la página principal descarga el perfil OpenVPN. El archivo se llamará <usuario>.ovpn. + + + + + + + + + OpenVPN Download Profile + + + + + + + + Descarga un cliente OpenVPN como OpenVPN for Android. Se recomienda el repositorio F-Droid. En la app, selecciona Importar perfil. + + + + + + + + + OpenVPN App + + + + + + + + En el diálogo Seleccionar perfil elige el archivo <usuario>.opvn que acabas de descargar. Pon un nombre a la conexión y graba el perfil. + + + + + + + + + OpenVPN import profile + + + + + + + + El perfil recién creado aparecera. Si hace falta edita el perfil y pon el nombre de dominio de tu FreedomBox como dirección de servidor. + + + + + + + + + OpenVPN profile created + + + + + + + + + + OpenVPN edit domain name + + + + + + + + Conecta haciendo clic sobre el perfil. + + + + + + + + + OpenVPN connect + + + + + + + + + + OpenVPN connected + + + + + + + + Cuando esté desconecta haciendo clic sobre el perfil. + + + + + + + + + OpenVPN disconnect + + + + + + + +
+
+ En Debian + Instala un cliente OpenVPN para tu sistema + + Abre el archivo ovpn con el cliente OpenVPN. + .ovpn]]> +
+
+
+ Comprobar si estás conectado +
+ En Debian + + + Trata de hacer ping a tu FreedomBox u otros dispositivos de tu red. + + + El comando ip addr debe mostrar una conexión tun0. + + + El comando traceroute freedombox.org debiera mostrar la dirección IP del servidor VPN como primer salto. + + + Si usas Network Manager puedes crear una conexión nueva importando el fichero: + .ovpn]]> +
+
+
+ Enlaces Externos + + + +
+
+
+ Privoxy (Proxy Web) + Un proxy web actúa como filtro para tráfico web entrante y saliente. Por tanto, puedes ofrecer a los ordenadores de tu red pasar su tráfico internet a través del proxy para eliminar anuncios y mecanismos de rastreo indeseados. + Privoxy es un software para la seguridad, privacidad, y control certero sobre la web. Proporciona una navegación web mucho más controlada (y anónima) que la que te puede ofrecer tu navegador. Privoxy "es un proxy enfocado principalmente al aumento de la privacidad, eliminación de anuncios y morralla, y a liberar al usuario de las restricciones impuestas sobre sus propias actividades" (fuente: Preguntas frecuentes acerca de Privoxy). +
+ Vídeo + Mira el vídeo acerca de como configurar y usar Privoxy en FreedomBox. +
+
+ Configurar + + + Instala Proxy Web (Privoxy) desde FreedomBox + + + + + + + Privoxy Installation + + + + + + Adapta las preferencias de proxy de tu navegador al hostname (o dirección IP) de tu FreedomBox con el puerto 8118. Observa por favor que Privoxy sólo puede tratar tráfico HTTP y HTTPS. No funciona con FTP u otros protocolos. + + + + + + + Privoxy Browser Settings + + + + + + Vé a la página o . Si Privoxy está instalado adecuadamente podrás configurarlo en detalle y si no verás un mensaje de fallo. + + + Si usas un portátil que tenga a veces que conectarse con FreedomBox y Privoxy pasando por routers de terceros quizá quieras instalar una extensión proxy switch que te permite activar y desactivar el proxy más fácilmente. + + +
+
+ Usuarios Avanzados + + + La instalación de serie debería proporcionar un punto de partida razonable para la mayoría de los usuarios. Indudablemente habrá ocasiones en las que quieras ajustar la configuración. Eso se puede afrontar cuando surja la necesidad. + + + Con Privoxy activado puedes ver su documentación y los detalles de su configuración en http://config.privoxy.org/ o en http://p.p. + + + Para habilitar los cambios en estas configuraciones primero tienes que cambiar el valor de habilitar-acciones-de-edición en /etc/privoxy/config a 1. Antes de hacerlo lee el manual con atención, especialmente: + + + + No se puede controlar por separado el accesso al editor por "ACLs" o authenticación HTTP, así que cualquiera con acceso a Privoxy puede modificar la configuración de todos los usuarios. Esta opción no se recomienda para entornos con usuarios no confiables. Nota que un código de cliente malicioso (p.ej. Java) también puede usar el editor de acciones y no deberías habilitar estas opciones a no ser que entiendas las consecuencias y estés seguro de que los navegadores están correctamente configurados. + + + + + + Ahora encontrarás un botón EDITAR en la pantalla de configuración de http://config.privoxy.org/. + + + La Guía rápida es un buen punto de partida para leer acerca de cómo definir reglas de bloqueo y filtrado propias. + + +
+
+
+ Quassel (Cliente IRC) Quassel es una aplicación IRC separada en 2 partes: un "núcleo" y un "cliente". Esto permite que el núcleo permanezca conectado a los servidores IRC recibiendo mensajes aunque el cliente esté desconectado. Ejecutando el servicio nucleo de Quassel FreedomBox puede mantenerte siempre en línea. Se pueden usar uno o varios clentes Quassel para conectarse intermitentemente desde escritorios o dispositivos móviles.
¿Para qué ejecutar Quassel? @@ -2330,43 +2307,554 @@ echo "UPDATE users SET admin=1 WHERE name='@miusuario:dominio'" | sudo sqlite3 /
- MiniDLNA - MiniDLNA es un servidor multimedia que intenta ser compatible con clientes DLNA/UPnP. + Radicale (Calendario y Contactos) + Con Radicale puedes sincronizar tus calendarios, listas de tareas y agendas de contactos personales entre varios ordendores, tabletas, y/o teléfonos inteligentes y compartirlos con tus amistades. Todo sin tener que permitir a terceros que accedan a tu información privada.
- ¿Qué es UPnP/DLNA? - UPnP (Universal plug & play) es un conjunto de protocolos de red que permite a los dispositivos de una red, como PCs, TVs, impresoras etc, reconocerse entre sí y establecer comunicación para compartir datos. Es un protocolo con cero configuración y require solo un servidor multimedia y un reproductor multimedia compatibles con el protocolo. - DLNA se deriva de UPnP como una forma de estandarizar interoperabilidad entre medios. Conforma un estándar/certificación que cumplen muchos dispositivos electrónicos de consumo. + ¿Porque debería usar Radicale? + Usando Radicale puedes evitar servicios centralizados como Google Calendar o Apple Calendar (iCloud) que explotan los datos de tus eventos y conexiones sociales.
- Desplegando MiniDLNA en tu FreedomBox. - Para instalar/habilitar el servidor multimedia necesitas navegar a la página MiniDLNA y habilitarlo. Se intenta que la aplicación esté disponible en la red interna y por ello requiere asignarle un interfaz de red configurado para tráfico interno. - Tras la instalación queda disponible una página web en . Incluye información de cuántos ficheros detecta el servidor, cuántas conexiones existen etc. Esto resulta muy útil cuando conectas discos externos con contenido para para verificar que detecta los nuevos archivos como debe. Si no ocurre así, desconectar y activar el servidor lo arreglará. -
-
- Sistemas de archivo para discos externos. - Al usar un disco externo que se usa también desde sistemas Windows el mejor formato para el sistema de archivos es NTFS. NTFS conservará los permisos de acceso de Linux y la codificación UTF-8 para los nombres de fichero. Esto es útil si los nombres de archivos tienen tildes, eñes u otros signos raros. -
-
- Enlaces externos + ¿Cómo configurar Radicale? + Primero el servidor Radicale necesita estar activado en tu FreedomBox. - (en) + En el servicio FreedomBox + + + selecciona Apps + + + ve a Radicale (Calendario y Libreta de contactos) e + + + instala la aplicación. Tras completar la instalación asegúrate de que la aplicación está marcada como "habilitada" en el interfaz de FreedomBox. Habilitar la aplicación arranca el servidor CalDAV/CardDAV Radicale. + + + define los permisos de acceso: + + + Solo el dueño de un calendario/libreta de contactos puede ver o hacer cambios + + + Cualquier usuario puede ver cualquier calendario/libreta de contactos pero solo el dueño puede hacer cambios + + + Cualquier usuario puede ver o hacer cambios en cualquier calendario/libreta + + + + + + + Nota: Solo los usuarios dados de alta en FreedomBox pueden acceder a Radicale. + + + + + + + Radicale-Plinth.png + + + + Si quieres compartir un calendario solo con algunos usuarios determinados la manera más simple es crear un nuevo usuario común para ellos y compartir con ellos el nombre del usuario común y su contraseña. + Radicale proporciona un interfaz web básico que solo soporta crear calendarios y libretas nuevos. Para añadir eventos o contactos se necesita una aplicación cliente soportada externa. + + + + + + + radicale_web.png + + + + + + Crear calendarios y/o libretas usando el interfaz web + + + Visita https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/ + + + Ingresa con tu cuenta de FreedomBox + + + Selecciona "Crear nuevo calendario o libreta" + + + Proporciona un título y selecciona el tipo + + + Opcionalmente, proporciona una descripción o selecciona un color + + + Haz clic en "Crear" + + + La página mostrará la URL de tu created nuevo calendario o libreta + + + + + Ahora abre tu aplicación cliente para crear calendarios y/o libretas nuevos que usarán tu FreedomBox y servidor Radicale. El sitio web de Radicale proporciona una lista de clientes soportados pero no uses las URLs que se mencionan allí; sigue este manual porque FreedomBox usa otra configuración. A continuación se muestran los pasos para 2 ejemplos: + + + Ejemplo de configuración con el cliente Evolution: + + + Calendario + + + Crea un calendario nuevo + + + Selecciona el "Tipo" "CalDAV" + + + Con "CalDAV" seleccionado aparecerán más opciones en el cuadro de diálogo. + + + URL: https://<dirección_IP_o_dominio_de_tu_servidor>/radicale/<usuario>/<nombre_del_calendario>.ics/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. + + + nota: la / inicial de la ruta es importante. + + + + + Habilita "Usar una conexión segura." + + + Nombre del calendario + + + + + + + Radicale-Evolution-Docu.png + + + + + + + + Lista de tareas: Añadir una lista de tareas es prácticamente igual que con un calendario. + + + Contactos + + + Sigue los mismos pasos anteriores reemplazando CalDAV por WebDAV y la extensión de la libreta por .vcf. + + + + + + +
+
+ Sincronizar via Tor + Configurar un calendario en FreedomBox con Radicale sobre Tor es lo mismo que sobre la red en claro, en resumen: + + + Cuando hayas ingresado al interfaz web de FreedomBox desde Tor haz clic en Radicale e introduce un usuario de tu FreedomBox y su contraseña. - - - + Ingresa en el interfaz web de Radicale usando el usuario de tu FreedomBox y su contraseña. + + + Haz clic en "Crear libreta o calendario nuevo", proporciona un título, selecciona un tipo y haz clic en "Crear". + + + Anota la URL, p.ej. https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/ cambiando los elementos marcados entre <> de acuerdo a tu configuración. + + + Estas instrucciones son para Thunderbird/Lightning. Nota: necesitarás estar conectado a Tor con el Tor Browser Bundle. + + + Abre Thunderbird, la extensión (add-on) Torbirdy y reinicia Thunderbird. (Quizá no haga falta.) + + + En el interfaz Lightning, en el panel izquierdo bajo Calendario haz clic con el botón derecho del ratón y selecciona "Nuevo calendario". + + + Selecciona "En la red" como localización de tu calendario. + + + Selecciona "CalDAV" copia la URL, p.ej., https://<direccion_onion_de_tu_servidor>.onion/radicale/<usuario>/<código_del_calendario>/. como localización cambiando los elementos marcados entre <> de acuerdo a tu configuración. + + + Proporciona un nombre, etc. Haz clic en "Siguiente". Tu calendario está ahora sincronizando con tu FreedomBox a través de Tor. + + + Si no has generado un certificado con "Let's Encrypt" para tu FreedomBox quizá necesites seleccionar "Confirmar Excepción de Seguridad" cuando se te indique. + + +
+
+ Sincronizar con tu teléfono Android + Hay varias Apps que admiten integración con el servidor Radicale. Este ejemplo usa DAVx5, que está disponible p.ej. en F-Droid. Si también quieres usar listas de tareas hay que instalar primero la app compatible OpenTasks. + Sigue estos pasos para configurar tu cuanta con el servidor Radicale de tu FreedomBox. + + + Instala DAVx5. + + + Crea una cuenta nueva en DAVx5 haciendo clic en el botón flotante [+]. + + + Selecciona la 2ª opción como se muestra en la primera imagen más abajo e introduce la URL base (no olvides la / del final). DAVx5 averiguará las cuentas CalDAV y WebDAV del usuario. + + + Sigue este video del FAQ de DAVx5 para aprender cómo importar tus contactos existentes a Radicale. + + + + Sincronizar contactos + + + + Haz clic en los menús de hamburguesa de CalDAV y CardDAV y selecciona "Refrescar ..." en caso de cuentas existentes o "Crear ..." en caso de cuentas nuevas (ver la 2ª captura de pantalla más abajo). + + + Marca las cajas de las libretas y/o contactos que quieras sincronizar y haz clic en el botón de sincronización de la cabecera. (ver la 3ª captura de pantalla más abajo) + + + + + + + + + DAVx5 account setup + + + + + + + + DAVx5 refresh + + + + + + + + DAVx5 account sync + + + +
+
+ Usuarios Avanzados +
+ Compartir recursos + Arriba se mostrá una manera fácil de crear un recurso para un grupo de gente creando una cuenta dedicada común. Aquí de describe un método alternativo con el que se otorga acceso a un calendario a 2 usuarios Usuario1 y Usuario2. Esto requiere acceso por SSH a la FreedomBox. + + + crea un archivo /etc/radicale/rights + + + + + + [calendario_de_mis_amigos] es solo un identificador, puede ser cualquier nombre. + + + La sección [owner-write] asegura que los dueños tengan acceso a sus propios archivos. + + + + + Edita el archivo /etc/radicale/config y haz los siguientes cambios en la sección [rights] + + + + + + + + Reinicia el servidor Radicale o la FreedomBox + + +
+
+ Importar archivos + Si estás usando un archivo de contactos exportado desde otro servicio o aplicación hay que copiarlo a: /var/lib/radicale/collections/<usuario>/<nombre_del_archivo_de_contactos>'.vcf. +
+
+
+ Migrar desde Radicale versión 1.x a versión 2.x + En Febrero de 2019 se actualizó Radicale en las versiones "en pruebas" (testing) de Debian desde la versión 1.x a la 2.x. La versión 2.x es mejor pero incompatible con los datos y la configuración empleados en la 1.x. El mecanismo automático de actualización de FreedomBox que emplean las actualizaciones desatendidas no actualiza automaticamente la version 2.x de Radicale debido a cambios en los archivos de configuración. No obstante la version 19.1 de FreedomBox, disponible en en las versiones "en pruebas" (testing) desde el 23 de Febrero de 2019, realizará la migración de los datos y la configuración a la versión 2.x de Radicale. No se requiere ninguna acción por parte de los usuarios típicos. Ocurrirá automáticamente. + Si por algún motivo necesitas ejecutar a mano apt dist-upgrade en tu máquina Radicale se actualizará a 2.x y entonces tu FreedomBox no podrá ejecutar esta actualización (ya que el proyecto de origen decidió eliminar las herramientas de migración de la versión 2.x de Radicale). Para evitar esta situación se recomienda el siguiente procedimiento para actualizar. + + En cualquier caso, si ya has actualizado a Radicale 2.x sin ayuda de FreedomBox necesitas realizar la migración de los datos y la configuración por tí mismo. Sigue este procedimiento: + + Notas: + + + python-radicale es un paquete antigüo de la versión 1.x de Radicale que sigue disponible en las versiones "en pruebas" (testing) de Debian. Esto es un hack alternativo para emplear la funcionalidad --export-storage que es responsable de la migración de datos. Por desgracia esta funcionalidad ya no está disponible en Radicale 2.x. + + + Los ficheros que acaban en .dpkg-dist solo existirán si has elegido "Conservar tu versión actualmente instalada" cuando se te preguntó durante la actualización a Radicale 2.x. El procedimiento anterior sobrescribirá la configuración antigüa con una nueva. No se necesitan cambios a los 2 ficheros de configuración salvo que hayas cambiado la preferencia de compartición de calendario. + + + Nota: Durante la migración tus datos permanecen a salvo en el directorio /var/lib/radicale/collections. Los datos nuevos se crearán y usarán en el directorio /var/lib/radicale/collections/collections-root/. + + + El comando tar hace una copia de seguridad de tu configuración y tus datos en /root/radicale_backup.tgz por si haces o algo va mal y quieres deshacer los cambios. + + +
+
+ Resolución de Problemas + 1. Si estás usando FreedomBox Pioneer Edition o instalando FreedomBox sobre Debian Buster Radicale podría no estar operativo inmediatamente después de la instalación. Esto se debe a un defecto ya corregido posteriormente. Para superar el problema actualiza FreedomBox haciendo clic en 'Actualización Manual' desde la app 'Actualizaciones'. Otra opción es simplemente esperar un par de días y dejar que FreedomBox se actualice solo. Después instala Radicale. Si Radicale ya está instalado deshabilitalo y rehabilitalo después de que se complete la actualización. Esto arreglará el problema y dejará a Radicale trabajando correctamente. +
+
+
+ Repro (Servidor SIP) + + + App eliminada + + Repro ha sido eliminada de Debian 10 (Buster) y por tanto ya no está disponible en FreedomBox. + +
+
+ Roundcube (Cliente de Correo Electrónico (Email)) +
+ ¿Qué es Roundcube? + Roundcube es un cliente de correo electrónico (email) para navegador con un interfaz de usuario parecido a una aplicación de escritorio. Admite varios lenguajes. Roundcube usa el protocolo de acceso a mensajes de Internet (IMAP = Internet Message Access Protocol) para acceder a los correos en un servidor remoto. Soporta MIME para enviar archivos adjuntos y en particular proporciona libreta de contactos, gestión de carpetas, búsquedas de mensajes y verificación ortográfica. +
+
+ Usar Roundcube + Tras instalar Roundcube se puede acceder a él en https://<tu_freedombox>/roundcube. Introduce tu usuario y contraseña. El usuario de muchos servicios de correo electrónico suele ser la propia dirección completa, como usuario_de_ejemplo@servicio_de_ejemplo.org, no solo el usuario usuario_de_ejemplo. Introduce la dirección del servidor IMAP de tu servicio de correo electrónico en el campo Servidor. Puedes probar a poner aquí tu nombre de dominio como servicio_de_ejemplo.org si la dirección es usuario_de_ejemplo@servicio_de_ejemplo.org y si esto no funciona consulta la dirección del servidor IMAP en la documentación de tu proveedor de correo electrónico. Se recomienda encarecidamente usar una conexión cifrada a tu servidor IMAP. Para ello inserta el prefijo "imaps://" al principio de la dirección del servidor IMAP. Por ejemplo, imaps://imap.servicio_de_ejemplo.org. + + + + + + + Logging into your IMAP server + + + +
+
+ Usar Gmail con Roundcube + Si quieres usar Roundcube con tu cuenta Gmail necesitas habilitar primero el ingreso con contraseña en las preferencias de tu cuenta Google porque Gmail no va a permitir por defecto que ingresen aplicaciones mediante contraseña. Para hacerlo visita las preferencias de la Cuenta Google y habilita Apps Menos seguras. A continuación ingresa en Roundcube introduciendo tu dirección de Gmail como Usuario y tu contraseña. En el campo servidor pon imaps://imap.gmail.com. + + + + + + + Logging into Gmail + + + +
+
+
+ Samba (Almacenamiento de Ficheros en Red) + Samba te permite tener una carpeta compartida en la red local que se puede usar desde multiples ordenadores con sistemas operativos diferentes. De ahora en adelante nos referiremos a estas carpetas como "shares". Puedes tener una carpeta personal compartida por tus propios dispositivos (share casero), una compartida con un grupo de confianza (share de grupo) o una compartida con todo dispositivo de la red (share abierto). + Samba te permite tratar un share como si fueran carpetas locales de tu ordenador. No obstante los shares solo están disponibles en la red local. + Para aprender más acerca de Samba, mira la documentación de usuario de su wiki. + Disponible desde la versión: 19.22 +
+ Usar Samba + Tras la instalación, puedes elegir qué discos compartir. Los shares habilitados están accesibles en el administrador de archivos de tu ordenador en la ruta \\freedombox (en Windows) o smb://freedombox.local (en Linux y Mac). Hay 3 tipos de share para elegir: + + + Share abierto - accesible a cualquiera en tu red local. + + + Share de grupo - accesible solo a usuarios FreedomBox que estén en el grupo freedombox-share. + + + Share casero - cada usuario del grupo freedombox-share puede tener su propio espacio privado. + + +
+ En Android + Para acceder a shares Samba desde un dispositivo Android instala el "Cliente Samba para Android" desde F-Droid o Google Play. Introduce smb://freedombox.local/<disco> como ruta del share en la app. Tus carpetas compartidas deberían estar visibles en la app de administración de archivos. También VLC para Android puede detectar automáticamente y usar los shares Samba. +
+
+
+ Integración con otras apps + La app Transmission de FreedomBox proporciona una configuración para permitir que las descargas se graben directamente en un share Samba. + Si quieres dejar disponibles en Samba ficheros sincronizados con Syncthing tienes que asegurarte de sincronizar en la carpeta compartida de Samba. Además, para dejar las carpetas de Syncthing disponibles en carpetas abiertas o de grupo de Samba necesitas asegurarte de pulsar el botón "Permisos > Ignorar" bajo la pestaña "Avanzado" de la carpeta en el interfaz web de usuario de Syncthing. Esto permitirá escribir los ficheros mediante Samba. +
+
+ Comparación con otras apps +
+ Syncthing + Syncthing mantiene una copia de la carpeta compartida en cada dispositivo con el que se comparte. Samba mantiene solo una copy en tu dispositivo FreedomBox. + Syncthing puede sincronizar tus carpetas compartidas entre dispositivos por Internet. Los shares Samba solo están disponibles en tu red local. + Como Syncthing es primordialmente una solución de sincronización, tiene funcionalidades como resolución de conflictos y versionado. Samba solo tiene una copia del fichero, así que no necesita tales funcionalidades. Por ejemplo, si dos personas están editando una hoja de cálculo almacenada en un share Samba el último que grabe el fichero gana. +
+
+
+
+ Searx (Búsqueda Web) +
+ Acerca de Searx + Searx es un metabuscador. Un metabuscador agrega los resultados de varios buscadores y los presenta en un interfaz unificado. + Lee más acerca de Searx en su sitio web oficial. + Disponible desde: versión 0.24.0 +
+
+ Captura de pantalla + + + + + + + Searx Screenshot + + + +
+
+ Vídeo + Searx installation and first steps (14 MB) +
+
+ ¿Por qué usar Searx? +
+ Personalización y Burbujas por Filtrado + Los buscadores tienen la capacidad de perfilar a sus usuarios y les sirven los resultados más relevantes para ellos, encerrandoles en burbujas por filtrado y distorsionando la visión que la gente tiene del mundo. Los buscadores tienen un incentivo financiero para servir publicidad interesante a sus usuarios, ya que incrementa la probabilidad de que hagan clic en los anuncios. + Un metabuscador es una solución posible a este problema, ya que agrega resultados de multiples buscadores puenteando así los intentos de personalización de los buscadores. + Searx evita almacenar cookies de buscadores para eludir traceos y perfilados de buscadores. +
+
+ Filtrado de publicidad + Searx filtra anuncios de los resultados de búsqueda antes de servirlos al usuario, con lo que mejora la relevancia de tus resultados y te evita distracciones. +
+
+ Privacidad + Searx usa por defecto HTTP POST en vez de GET para enviar tus consultas de búsqueda a los buscadores, así que si alguien espía tu tráfico no podrá leerlas. Tampoco se almacenarán las consultas en el histórico de tu navegador. + Nota: Searx usado desde la barra (omnibar) del navegador Chrome hará peticiones GET en vez de POST. +
+
+
+ Searx en FreedomBox + + + En FreedomBox Searx usa las credenciales únicas de Single Sign On. Esto implica que tienes que haber ingresado en tu FreedomBox con el navegador en el que estás usando Searx. + + + Se puede acceder fácilmente a SearX a través de Tor. + + + Se puede añadir a Searx a la barra de buscadores del navegador Firefox. Mira la Ayuda de Firefox acerca de este asunto. Una vez esté Searx añadido también podrás establecerlo como tu buscador por defecto. + + + Searx también ofrece resultados de búsqueda en formatos csv, json y rss, que se pueden usar desde scripts para automatizar algunas tareas.
- Lector de Feeds de Noticias (Tiny Tiny RSS) + Shadowsocks (Proxy SOCKS5) +
+ ¿Qué es Shadowsocks? + Shadowsocks es un proxy SOCKS5 ligero y seguro, diseñado para proteger tu tráfico Internet. Se puede usar para eludir la censura y los filtros de Internet. Tu FreedomBox puede ejecutar un cliente Shadowsocks que puede conectar con un servidor Shadowsocks. También ejecutará un proxy SOCKS5. Los dispositivos locales pueden conectar con este proxy y sus datos serán cifrados y retransmitidos a través del sevidor Shadowsocks. + Nota: Shadowsocks está disponible en FreedomBox a partir de la versión 0.18. +
+
+ Usar el cliente Shadowsocks + La implementación actual de Shadowsocks en FreedomBox solo soporta configurar FreedomBox como cliente Shadowsocks. Este caso de uso sería así: + + + El client de Shadowsocks (FreedomBox) está en una región en la que partes de Internet están bloqueadas o censuradas. + + + El servidor de Shadowsocks está en una región diferente que no tiene esos bloqueos. + + + FreedomBox proporciona un servicio de proxy SOCKS en la red local para que otros dispositivos hagan uso de la conexión Shadowsocks. + + + En el futuro será posible configurar FreedomBox como servidor Shadowsocks. +
+
+ Configurar tu FreedomBox para el cliente Shadowsocks + Para habilitar Shadowsocks primero navega a la página Proxy Socks5 (Shadowsocks) e instalalo. + Servidor: el servidor Shadowsocks no es la IP o la URL de FreedomBox, sino que será otro servidor o VPS configurado como tal (servidor Shadowsocks). También hay algunos servidores Shadowsocks públicos listados en la web, pero sé consciente de que quienquiera que opere el servidor puede ver a dónde van las peticiones y cualquier dato no cifrado que se transmita. + Para usar Shadowsocks una vez instalado configura la URL del proxy SOCKS5 en tu dispositivo, navegador o aplicación como http://<tu_freedombox>:1080/. +
+
+
+ Syncthing (Sincronización de Archivos) + Con Syncthing instalado en tu FreedomBox puedes sincronizar contenido desde otros dispositivos a tu FreedomBox y vice-versa. Por ejemplo puedes mantener sincronizadas las fotos tomadas desde tu teléfono móvil con tu FreedomBox. + Disponible desde versión: 0.14. + Syncthing es una solución de sincronización entre pares, no una de tipo cliente-servidor. Esto implica que FreedomBox no es realmente el servidor y tus otros dispositivos no son sus clientes. Desde la perspectiva de Syncthing todos son dispositivos equivalentes. Puedes emplear Syncthing para sincronizar tus archivos entre cualquiera de tus dispositivos. La ventaja que aporta FreedomBox consiste en que como es un servidor está encendida (casi) siempre. Supón que quieres sincronizar las fotos de tu teléfono con tu portátil. Si sincronizas tu teléfono con FreedomBox el portátil podrá obtenerlas desde la FreedomBox cuando vuelva a conectarse. No necesitas preocuparte de cuando se conectan los otros dispositivos. Si tu FreedomBox es uno de los dispositivos configurados con la carpeta compartida de Syncthing puedes estár tranquilo que tus otros dispositivos se sincronizarán en cuanto se conecten. + Tras instalarlo sigue estas instrucciones del proyecto Syncthing: Arrancando. + Syncthing permite compartir selectivamente carpetas individuales. Antes de compartir los dispositivos tienen que estar emparejados leyendo códigos QR o introduciendo manualmente identificadores de dispositivo. Syncthing tiene un servicio de autodescubrimiento para identicar fácilmente a los otros dispositivos de la misma subred que tengan Syncthing instalado. + Para acceder al cliente web de la instancia Syncthing que se ejecuta en tu FreedomBox, usa la ruta /syncthing. Actualmente este cliente web está accesible solo a los usuarios de FreedomBox que tengan privilegios de administrador aunque en alguna futura versión podría estarlo a todos los usuarios de FreedomBox. + + + + + + + Syncthing web interface + + + + Syncthing tiene apps Android disponibles en F-Droid y Google Play. También hay disponibles aplicaciones de escritorio multiplataforma. + Para más información acerca de Syncthing visita su sitio web oficial y su documentación. +
+ Sincronizar via Tor + Syncthing debe sincronizar automáticamente con tu FreedomBox incluso cuando esta solo sea accesible como servicio Tor Onion. + Si quieres enrutar tu cliente Syncthing via Tor configura la variable de entorno all_proxy: + + Para más información mira la documentación de Syncthing acerca de el uso de proxies. +
+
+ Evitar repetidores de Syncthing + Syncthing emplea por defecto conexiones dinámicas para conectar con otros pares. Esto significa que si estás sincronizando a través de Internet, los datos quizá tengan que atravesar repetidores de Syncthing públicos para alcanzar tus dispositivos. Esto desaprovecha que tu FreedomBox tenga una dirección IP pública. + Al añadir tu FreedomBox como dispositivo en otros clientes de Syncthing establece tu dirección como "tcp://<mi.dominio.freedombox>" en vez de "dinámica". Esto permite a tus pares Syncthing conectarse diréctamente a tu FreedomBox eludiendo la necesidad de repetidores. También permite sincronización rápida bajo demanda si no quieres mantener a Syncthing ejecuándose todo el tiempo en tus dispositivos móviles. +
+
+
+ Tiny Tiny RSS (Lector de Feeds de Noticias) Tiny Tiny RSS es un lector y agregador de feeds de noticias (RSS/Atom) diseñado para leer noticias desde cualquier lugar con una experiencia lo más parecida posible a una aplicación de escritorio. Cualquier usuario creado mediante el interfaz web de FreedomBox podrá ingresar y usar esta app. Cada usuario tiene sus propios feeds, estado y preferencias.
Usar el interfaz web - Cuando esté habilitado Tiny Tiny RSS estará disponible en la ruta /tt-rss del servidor web. Cualquier usuario creado mediante el interfaz web de FreedomBox podrá ingresar y usar esta app. + Cuando esté habilitado Tiny Tiny RSS estará disponible en la ruta /tt-rss del servidor web. Cualquier usuario creado mediante FreedomBox podrá ingresar y usar esta app. @@ -2515,658 +3003,769 @@ echo "UPDATE users SET admin=1 WHERE name='@miusuario:dominio'" | sudo sqlite3 /
- Alojamiento Git Simple (GitWeb) - GitWeb proporciona alojamiento Git en FreedomBox. Proporciona un interfaz web simple para realizar acciones comunes como ver archivos, diferencias, descripciones de cambio, etc. - Disponible desde versión: 19.19 + Tor (Red para el anonimato)
- Autenticación básica HTTP - Actualmente el GitWeb de FreedomBox solo soporta remotos HTTP. Para evitar tener que introducir la contraseña cada vez que haces pull/push al repositorio puedes editar tu remoto para incluír credenciales. + ¿Qué es Tor? + Tor es una red de servidores operada por voluntarios. Permite a los usuarios de esos servidores mejorar su privacidad y seguridad cuando navegan por Internet. Tu y tus amigos podéis acceder a tu FreedomBox a través de la red Tor sin revelar su dirección IP. Activando la aplicación Tor en tu FreedomBox podrás ofrecer servicios remotos (chat, wiki, file sharing, etc...) sin mostrar tu localización. Esta aplicación te dará una protección mejor que un servidor web público porque estarás menos expuesto a gente intrusiva. +
+
+ Usar Tor para navegación anónima + Tor Browser es la manera recomendada para navegar la web a través de Tor. Puedes descargar Tor Browser desde y seguir sus instrucciones para instalarlo y ejecutarlo. +
+
+ Usar Servicio Tor Onion para acceder a tu FreedomBox + El Servicio Tor Onion proporciona una manera de acceder a tu FreedomBox incluso aunque esté detrás de un router, cortafuegos, o redirector NAT (p.ej. si tu proveedor de Internet no proporciona una dirección pública IPv4 para tu router). Para habilitar el Servicio Tor Onion primero navega a la página Red para el anónimato (Tor). (Si no la ves haz clic en el logo de FreedomBox de arriba a la izquierda de la página y ve a la página principal de Apps.) En la página Red para el anónimato (Tor), bajo Configuración, habilita la caja Habilitar los Servicios Tor Onion y pulsa el botón de Actualizar configuración. Tor se reconfigurará y se reiniciará. + Transcurrido un rato la página se refrescará bajo Estado verás la tabla que lista la dirección .onion del servicio. Copia toda la dirección (que termina en .onion) y pégala en el campo dirección de Tor Browser. Deberías poder acceder a tu FreedomBox. (Quizá veas un aviso de certificado porque FreedomBox tiene un certificado autofirmado.) - Ejemplo: - + + + + + + Tor Configuration - FreedomBox + + - Tu nombre de usuario y contraseña se cifrarán. Quien monitorize el tráfico de la red solo apreciará el nombre de dominio. - Nota: Al usar este método tu contraseña se almacenará en claro en el fichero .git/config del repositorio local. Por este motivo debes crear un usuario FreedomBox que solo tenga acceso a gitweb y no usar nunca una cuenta de administrador. -
-
- Réplicas Espejo - Aunque tus repositorios se albergan principalmente en tu propia FreedomBox puedes configurar un repositorio en otro servicio de alojamiento Git como GitLab a modo de copia espejo. -
-
-
- Servidor SIP (Repro) - - - App eliminada - - Repro ha sido eliminada de Debian 10 (Buster) y por tanto ya no está disponible en FreedomBox. - -
-
- Proxy SOCKS5 (Shadowsocks) -
- ¿Qué es Shadowsocks? - Shadowsocks es un proxy SOCKS5 ligero y seguro, diseñado para proteger tu tráfico Internet. Se puede usar para eludir la censura y los filtros de Internet. Tu FreedomBox puede ejecutar un cliente Shadowsocks que puede conectar con un servidor Shadowsocks. También ejecutará un proxy SOCKS5. Los dispositivos locales pueden conectar con este proxy y sus datos serán cifrados y retransmitidos a través del sevidor Shadowsocks. - Nota: Shadowsocks está disponible en FreedomBox a partir de la versión 0.18 de Plinth. -
-
- Usar el cliente Shadowsocks - La implementación actual de Shadowsocks en FreedomBox solo soporta configurar FreedomBox como cliente Shadowsocks. Este caso de uso sería así: - - El client de Shadowsocks (FreedomBox) está en una región en la que partes de Internet están bloqueadas o censuradas. - - - El servidor de Shadowsocks está en una región diferente que no tiene esos bloqueos. - - - FreedomBox proporciona un servicio de proxy SOCKS en la red local para que otros dispositivos hagan uso de la conexión Shadowsocks. + + Onion - En el futuro será posible configurar FreedomBox como servidor Shadowsocks. + Actualmente solo HTTP (puerto 80), HTTPS (puerto 443) y SSH (puerto 22) están accesibles a través del Servicio Tor Onion configurado en la FreedomBox.
- Configurar tu FreedomBox para el cliente Shadowsocks - Para habilitar Shadowsocks primero navega a la página Proxy Socks5 (Shadowsocks) e instalalo. - Servidor: el servidor Shadowsocks no es la IP o la URL de FreedomBox, sino que será otro servidor o VPS configurado como tal (servidor Shadowsocks). También hay algunos servidores Shadowsocks públicos listados en la web, pero sé consciente de que quienquiera que opere el servidor puede ver a dónde van las peticiones y cualquier dato no cifrado que se transmita. - Para usar Shadowsocks una vez instalado configura la URL del proxy SOCKS5 en tu dispositivo, navegador o aplicación como http://<tu_freedombox>:1080/. -
-
-
- Red Privada Virtual (OpenVPN) -
- ¿Qué es OpenVPN? - OpenVPN proporciona un servicio de red privada virtual a tu FreedomBox. Puedes usar este software para acceso remoto, VPNs punto-a-punto y seguridad Wi-Fi. OpenVPN incluye soporte para direcciones IP dinámicas y NAT. -
-
- Redirección de puertos - Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos en tu router. Debes redirigir los siguientes puertos para OpenVPN: + Apps accesibles via Tor + Las siguientes apps se pueden acceder a través de Tor. Esta lista puede ser incompleta. - UDP 1194 + Calendario y Libreta de direcciones (Radicale) + + + Sincronización de ficheros (Syncthing) + + + Búsqueda Web (Searx) + + + Wiki (MediaWiki) + + + Wiki y Blog (Ikiwiki)
- Configurar - - - En el menú de apps de Plinth selecciona Red Privada Virtual (OpenVPN) y haz clic en Instalar. - - - Tras instalar el módulo todavía queda un paso de configuración que puede llevar largo tiempo completar. Haz clic en "Iniciar configuración" para empezar. - - - - - - - OpenVPN service page - - - - - - Espera a que termine la configuración. Puede tardar un rato. - - - Una vez completada la configuración del servidor OpenVPN puedes descargar tu perfil. Esto descargará un archivo llamado <usuario>.ovpn, siendo <usuario> un usuario de FreedomBox. Todos los usuarios de FreedomBox podrán descargar un perfil propio y diferente. Los usuarios que no sean administradores pueden descargar el perfil desde la portada después de ingresar. - - - El archivo ovpn contiene toda la información que necesita un cliente vpn para conectar con un servidor. - - - El perfil descargado contiene el nombre de dominio de FreedomBox al que debe conectarse el cliente. Este se obtiene del dominio configurado en la sección 'Configuración' de la página de 'Sistema'. En caso de que tu dominio no esté configurado adecuadamente quizá necesites cambiar este valor después de descargar el perfil. Si tu cliente OpenVPN lo permite puedes hacer esto después de importar el perfil OpenVPN. De lo contrario puedes editar el perfil .ovpn con un editor de texto y cambiar la línea 'remote' para que contenga la dirección IP WAN o el hostname de tu FreedomBox como se indica aquí. - - - -
-
- Navegar por Internet tras conectar a una VPN - Tras conectar a la VPN el dispositivo cliente podrá navegar por Internet sin más configuración adicional. No obstante una pre-condición para que esto funcione es que necesitas tener al menos 1 interfaz (tarjeta) de red conectado a Internet en la zona Externa del cortafuegos. Usa la página de configuración de redes para editar la zona del cortafuegos con los interfaces (tarjetas) de red del dispositivo. -
-
- Uso -
- En Android/LineageOS - - - Visita la página principal de FreedomBox. Ingresa con tu cuenta de usuario. Desde la página principal descarga el perfil OpenVPN. El archivo se llamará <usuario>.ovpn. - - - - - - - - - OpenVPN Download Profile - - - - - - - - Descarga un cliente OpenVPN como OpenVPN for Android. Se recomienda el repositorio F-Droid. En la app, selecciona Importar perfil. - - - - - - - - - OpenVPN App - - - - - - - - En el diálogo Seleccionar perfil elige el archivo <usuario>.opvn que acabas de descargar. Pon un nombre a la conexión y graba el perfil. - - - - - - - - - OpenVPN import profile - - - - - - - - El perfil recién creado aparecera. Si hace falta edita el perfil y pon el nombre de dominio de tu FreedomBox como dirección de servidor. - - - - - - - - - OpenVPN profile created - - - - - - - - - - OpenVPN edit domain name - - - - - - - - Conecta haciendo clic sobre el perfil. - - - - - - - - - OpenVPN connect - - - - - - - - - - OpenVPN connected - - - - - - - - Cuando esté desconecta haciendo clic sobre el perfil. - - - - - - - - - OpenVPN disconnect - - - - - - - -
-
- En Debian - Instala un cliente OpenVPN para tu sistema - - Abre el archivo ovpn con el cliente OpenVPN. - .ovpn]]> -
-
-
- Comprobar si estás conectado -
- En Debian - - - Trata de hacer ping a tu FreedomBox u otros dispositivos de tu red. - - - El comando ip addr debe mostrar una conexión tun0. - - - El comando traceroute freedombox.org debiera mostrar la dirección IP del servidor VPN como primer salto. - - - Si usas Network Manager puedes crear una conexión nueva importando el fichero: - .ovpn]]> -
-
-
- Enlaces Externos - - - -
-
-
- Conversaciones de Voz (Mumble) -
- ¿Qué es Mumble? - Mumble es un software de conversaciones de voz. Principalmente diseñado para uso con juegos multijugador por red, sirve para hablar con alta calidad de audio, cancelación de ruido, comunicación cifrada, autenticación de interlocutores por defecto mediante par de claves pública/privada, y "asistentes" para configurar tu micrófono, por ejemplo. Se puede marcar a un usuario dentro de un canal como "interlocutor prioritario". -
-
- Usar Mumble - FreedomBox incluye el servidor Mumble. Para conectar con el servidor los usuarios pueden descargar algún cliente de entre los disponibles para plataformas de escritorio y móviles. -
-
- Redirección de Puertos - Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos de tu router. Deberías redirigir los siguientes puertos para Mumble: + Ejecutar un nodo Tor + Cuando se instala Tor se configura por defecto para ejecutarse como puente a la red (bridge relay). Esta opción se puede deshabilitar en la página de configuración de Tor de FreedomBox. + En la parte inferior de página de Tor de FreedomBox hay una lista de puertos que usa el puente a la red Tor. Si tu FreedomBox está detrás de un router necesitarás configurar la redirección de puertos de tu router para que estos puertos sean accesibles desde Internet. + Los requisitos para ejecutar un puente a la red se listan en la Tor Relay Guide. En resúmen, se - TCP 64738 + recomienda que un puente tenga disponibles para Tor al menos 16 Mbit/s (Mbps) de ancho de banda para subida y bajada. Mejor más. - UDP 64738 + requiere que a se le permita al puente usar un mínimo de 100 GByte de tráfico mensual de salida y de entrada. + + + recomienda que un nodo sin salida (mero reenrutador) de <40 Mbit/s tenga al menos 512 MB de RAM disponible; Uno más rápido de 40 Mbit/s debería tener al menos 1 GB de RAM.
- Administrar Permisos - En Mumble un supeusuario puede crear cuentas de administrador que a su vez pueden administrar permisos a grupos y canales. Esto se puede hacer tras ingresar con el usuario "SuperUser" y la contraseña de superusuario. Ver la Guía de Mumble para obtener información respecto a cómo hacer esto. Actualmente FreedomBox no ofrece una interfaz gráfica para obtener o establecer la contraseña de superusuario en Mumble. Se genera una contraseña de superusuario automáticamente durante la instalación de Mumble. Para obtenerla ingresa en el terminal como admin usando Cockpit , la Shell Segura o la consola. Y ejecuta el siguiente comando: - - Deberás ver una salida como esta: - 2019-11-06 02:47:41.313 1 => Password for 'SuperUser' set to 'noo8Dahwiesh']]> - O puedes establecer una contraseña nueva así: - + Usar el puerto Tor SOCKS (avanzado) + FreedomBox proporciona un puerto Tor SOCKS al que pueden conectar otras aplicaciones para enrutar su tráfico a través de la red Tor. Este puerto es accesible a cualquier interfaz (de red) configurado en la zona interna del cortafuegos. Para configurar la aplicación apunta el Host SOCKS a la dirección IP interna de la conexión y pon el Puerto SOCKS a 9050. +
+ Exjemplo con Firefox + Tu navegador web se puede configurar para emplear la red Tor para toda tu actividad de navegación. Esto permite eludir la censura y oculta tu dirección IP a los sitios web durante la navegación normal. Para anonimato se recomienda usar el Navegador Tor. + Configura tu dirección IP local de FreedomBox y el puerto 9050 como un proxy SOCKS en Firefox. Hay extensiones para facilitar la activación y desactivación del proxy. + + + + + + + Configuring Firefox with Tor SOCKS proxy + + + + Con en proxy SOCKS configurado puedes acceder cualquier URL de tipo onion diréctamente desde Firefox. FreedomBox tiene una dirección onion v3 propia a la que puedes conectarte por la red Tor (guárdala en tus favoritos para usarla en situaciones de emergencia). +
+
+
+ Eludiendo la censura de Tor + Si tu proveedor de Internet (ISP) está tratando de bloquear el tráfico Tor puedes usar puentes (a la red Tor) para conectar (a la red Tor). + 1. Obtén la configuración de los puentes de Tor BridgeDB + + + + + + + Tor BridgeDB + + + + 2. Añade las líneas a la configuración de Tor de tu FreedomBox como se muestra. + + + + + + + Tor Configuration Page + + +
- Asistente para VoIP (Coturn) - Coturn es un servidor para facilitar llamadas y conferencias de audio/video proporcionando una implementación de los protocolos TURN y STUN. Los servidores de comunicación por WebRTC, SIP y otros pueden usarlo para establecer una llamada entre partes que de otro modo no podrían conectarse entre si. - No está pensado para que lo usen diréctamente los usuarios. Los servidores como Matrix Synapse necesitan configurarse con los datos proporcionados en la página de app de Coturn. Además de Matrix Synapse, Jitsi, Ejabberd, Nexcloud Talk, etc. pueden usar el servidor Coturn para llamadas y conferencias de audio/video. No hace falta que los servidores se ejecuten en la misma máquina que FreedomBox. Los servidores externos pueden usar un Coturn ejecutado en FreedomBox. - Coturn está disponible en FreedomBox desde la version 20.8 como app avanzada. Esto implica que para ver el icono de Coturn en la sección "Apps" necesitas marcar en "Mostrar apps y funcionalidades avanzadas" en "Configuración General". + Transmission (Cliente web de BitTorrent)
- Cómo funciona - Al hacer una llamada de audio/video lo mejor es enrutar los flujos multimedia directamente entre los pares porque minimiza la latencia (mejor calidad de señal) y evita depender de un servidor centralizado (privacidad). Esto escala bien porque un servidor de chat simple puede albergar miles de llamadas sin involucrarse de ningún otro modo que para establecer la llamada. Sin embargo este enfoque no suele funcionar la mayoría de las veces por cómo se configuran las redes. La mayoría de los pares de la red carecen de una dirección IP propia reservada para ellos y suelen operar detrás de un dispositivo de red que les traduce las direcciones de red (NAT: "Network Address Translation"). Esto significa que en realidad estos pares no tienen modo de alcanzarse entre sí directamente. - Para abordar este problema se introdujo una técnica simple conocida como STUN. Con ayuda de un servidor STUN los pares pueden prescindir de los dispositivos NAT para transmitir entre ellos. Desafortunadamente este truco solo funciona un 80% de las ocasiones. Así que si STUN falla, los pares no tienen más opción que enrutar su comunicación a través de un intermediario llamado servidor TURN. Todo el mecanismo de intentar primero con STUN y recaer en TURN se describe en un protocolo llamado ICE. - En FreedomBox, Coturn proporciona servidores STUN y TURN. Ambos servicios se proporcionan tanto sobre TCP como sobre UDP y tanto en canales cifrados (que tienen mayor probabilidad de éxito) como sin cifrar. Como los servidores STUN son baratos y no consumen muchos recursos no se necesita autenticación para usarlos. Por otra parte los servidores TURN sí la necesitan. Esta autenticación está altamente simplificada y no requiere mantener una base de datos de usuarios. Un servidor como matrix-synapse que vaya a establecer una llamada de audio/video entre dos pares generará un nombre de usuario y contraseña empleando un secreto compartido. Cuando los pares usen el servidor TURN se les validará usando estas credenciales porque el servidor TURN conoce este secreto. - En resumen, un servidor de comunicaciones necesita saber las URLs de los servidores STUN/TURN junto con el secreto de autenticación para TURN. Después, durante el establecimiento de la llamada de audio/video guiarán a los pares a usar los servidores STUN/TURN. La app Coturn de FreedomBox proporciona exactamente ésta información, que se puede usar para configurar un servidor de comunicaciones independientemente de que se ejecute en la misma máquina que FreedomBox o en otro servidor. -
-
- Configurar Matrix Synapse - El servidor de Matrix Synapse de FreedomBox se puede configurar para que use el servidor de TURN/STUN Coturn. En el futuro, cuando instales Matrix Synapse FreedomBox instalará Coturn automáticamente y configurará sus parámetros en Matrix Synapse. Para configurar Matrix Synapse, edita el fichero /etc/matrix-synapse/homeserver.yaml con las siguientes líneas: - - Y luego reinicia el servidor matrix-synapse deshabilitando y rehabilitando la app de matrix-synapse. -
-
-
- Proxy Web (Privoxy) - Un proxy web actúa como filtro para tráfico web entrante y saliente. Por tanto, puedes ofrecer a los ordenadores de tu red pasar su tráfico internet a través del proxy para eliminar anuncios y mecanismos de rastreo indeseados. - Privoxy es un software para la seguridad, privacidad, y control certero sobre la web. Proporciona una navegación web mucho más controlada (y anónima) que la que te puede ofrecer tu navegador. Privoxy "es un proxy enfocado principalmente al aumento de la privacidad, eliminación de anuncios y morralla, y a liberar al usuario de las restricciones impuestas sobre sus propias actividades" (fuente: Preguntas frecuentes acerca de Privoxy). -
- Vídeo - Mira el vídeo acerca de como configurar y usar Privoxy en FreedomBox. -
-
- Configurar - - - Instala Proxy Web (Privoxy) desde Plinth - - - - - - - Privoxy Installation - - - - - - Adapta las preferencias de proxy de tu navegador al hostname (o dirección IP) de tu FreedomBox con el puerto 8118. Observa por favor que Privoxy sólo puede tratar tráfico HTTP y HTTPS. No funciona con FTP u otros protocolos. - - - - - - - Privoxy Browser Settings - - - - - - Vé a la página o . Si Privoxy está instalado adecuadamente podrás configurarlo en detalle y si no verás un mensaje de fallo. - - - Si usas un portátil que tenga a veces que conectarse con FreedomBox y Privoxy pasando por routers de terceros quizá quieras instalar una extensión proxy switch que te permite activar y desactivar el proxy más fácilmente. - - -
-
- Usuarios Avanzados - - - La instalación de serie debería proporcionar un punto de partida razonable para la mayoría de los usuarios. Indudablemente habrá ocasiones en las que quieras ajustar la configuración. Eso se puede afrontar cuando surja la necesidad. - - - Con Privoxy activado puedes ver su documentación y los detalles de su configuración en http://config.privoxy.org/ o en http://p.p. - - - Para habilitar los cambios en estas configuraciones primero tienes que cambiar el valor de habilitar-acciones-de-edición en /etc/privoxy/config a 1. Antes de hacerlo lee el manual con atención, especialmente: - - - - No se puede controlar por separado el accesso al editor por "ACLs" o authenticación HTTP, así que cualquiera con acceso a Privoxy puede modificar la configuración de todos los usuarios. Esta opción no se recomienda para entornos con usuarios no confiables. Nota que un código de cliente malicioso (p.ej. Java) también puede usar el editor de acciones y no deberías habilitar estas opciones a no ser que entiendas las consecuencias y estés seguro de que los navegadores están correctamente configurados. - - - - - - Ahora encontrarás un botón EDITAR en la pantalla de configuración de http://config.privoxy.org/. - - - La Guía rápida es un buen punto de partida para leer acerca de cómo definir reglas de bloqueo y filtrado propias. - - -
-
-
- Búsqueda Web (Searx) -
- Acerca de Searx - Searx es un metabuscador. Un metabuscador agrega los resultados de varios buscadores y los presenta en un interfaz unificado. - Lee más acerca de Searx en su sitio web oficial. - Disponible desde: versión 0.24.0 + ¿Qué es Transmission ? + BitTorrent es un protocolo de comunicaciones para compartir ficheros entre pares (P2P = peer-to-peer). No es anónimo; debes asumir que otros puedan ver qué ficheros estás comprtiendo. Hay 2 clientes web para BitTorrent disponibles en FreedomBox: Transmission y Deluge. Tienen funcionalidades similares pero quizá prefieras uno sobre otro. + Transmission es un cliente BitTorrent ligero, famoso por su simplicidad y una configuración por defecto que "símplemente funciona".
Captura de pantalla - + - Searx Screenshot + Transmission Web Interface
- Vídeo - Searx installation and first steps (14 MB) + Usar Transmission + Tras instalar Transmission está accesible en https://<tu freedombox>/transmission. Transmission emplea el ingreso único de FreedomBox lo que significa que si has ingresado en tu FreedomBox puedes acceder diréctamente a Transmission sin tener que volver a introducir las credenciales. Si no, se te pedirá que ingreses primero y luego se te redirigirá a la app Transmission.
- ¿Por qué usar Searx? + Consejos
- Personalización y Burbujas por Filtrado - Los buscadores tienen la capacidad de perfilar a sus usuarios y les sirven los resultados más relevantes para ellos, encerrandoles en burbujas por filtrado y distorsionando la visión que la gente tiene del mundo. Los buscadores tienen un incentivo financiero para servir publicidad interesante a sus usuarios, ya que incrementa la probabilidad de que hagan clic en los anuncios. - Un metabuscador es una solución posible a este problema, ya que agrega resultados de multiples buscadores puenteando así los intentos de personalización de los buscadores. - Searx evita almacenar cookies de buscadores para eludir traceos y perfilados de buscadores. -
-
- Filtrado de publicidad - Searx filtra anuncios de los resultados de búsqueda antes de servirlos al usuario, con lo que mejora la relevancia de tus resultados y te evita distracciones. -
-
- Privacidad - Searx usa por defecto HTTP POST en vez de GET para enviar tus consultas de búsqueda a los buscadores, así que si alguien espía tu tráfico no podrá leerlas. Tampoco se almacenarán las consultas en el histórico de tu navegador. - Nota: Searx usado desde la barra (omnibar) del navegador Chrome hará peticiones GET en vez de POST. -
-
-
- Searx en FreedomBox - - - En FreedomBox Searx usa las credenciales únicas de Single Sign On. Esto implica que tienes que haber ingresado en tu FreedomBox con el navegador en el que estás usando Searx. - - - Se puede acceder fácilmente a SearX a través de Tor. - - - Se puede añadir a Searx a la barra de buscadores del navegador Firefox. Mira la Ayuda de Firefox acerca de este asunto. Una vez esté Searx añadido también podrás establecerlo como tu buscador por defecto. - - - Searx también ofrece resultados de búsqueda en formatos csv, json y rss, que se pueden usar desde scripts para automatizar algunas tareas. - - -
-
-
- Wiki (MediaWiki) -
- Acerca de MediaWiki - MediaWiki es el software de base de la gama de wikis Wikimedia. - Lee más acerca de MediaWiki en Wikipedia - Disponible desde: versión 0.20.0 -
-
- MediaWiki en FreedomBox - MediaWiki viene configurado en FreedomBox para ser públicamente legible y editable en privado. Sólo los usuarios ingresados pueden editar el wiki. Esta configuración evita publicidad indeseada (spam) y otros vandalismos en tu wiki. -
- Administración de Usuarios - Solo el administrador de MediaWiki (usuario "admin") puede crear los usuarios. El usuario "admin" puede usarse también para restablecer contraseñas de usuarios MediaWiki. Si se olvida la contraseña del administrador se puede restablecer desde la página de MediaWiki del interfaz web de FreedomBox. -
-
- Casos de uso - MediaWiki es muy versátil y se puede emplear para muchos usos creativos. También es áltamente adaptable y viene con un montón de extensiones (plugins) y estilos estéticos. -
- Repositorio Personal de Conocimiento - El MediaWiki de FreedomBox puede ser tu propio repositorio de conocimiento personal. Como MediaWiki tiene buen soporte multimedia puedes escribir notas, almacenar imágenes, crear listas de comprobación, guardar referencias y enlaces, etc. de manera organizada. Puedes almacenar el conocimiento de una vida en tu instancia de MediaWiki. -
-
- Wiki Comunitario - Una comunidad de usuarios podría usar MediaWiki como su repositorio común de conocimiento y material de referencia. Se puede emplear como un tablón de anunciós de universidad, como un servidor de documentación para una pequeña empresa, como un bloc de notas para grupos de estudio o como un wiki de fans al estilo de wikia. -
-
- Sitio Web Personal implementado mediante un Wiki - Varios sitios web de internet son sólo instancias de MediaWiki. El MediaWiki de FreedomBox es de solo lectura para visitantes. Se puede por tanto adaptar para servir como tu sitio web y/o blog personal. El contenido de MediaWiki es fácil de exportar y puede moverse después a otro motor de blogs. -
-
-
- Editar Contenido del Wiki - FreedomBox monta MediaWiki con un editor básico con una barra de herramientas con opciones de uso habitual como negrita, cursiva etc. Haz clic en la sección Avanzadas para acceder a más opciones como cabaceras, listas con viñetas, etc. - - - - - - - mediawiki-toolbar.png - - - -
- Editor Visual - Como su nombre indica, el nuevo Editor Visual de MediaWiki ofrece un interfaz de usuario visual (WYSIWYG) para crear páginas del wiki. Pero esta funcionalidad está todavía en pruebas y MediaWiki no la trae de serie. Una solución temporal posible sería escribir tu contenido con el Editor Visual del borrador de Wikipedia, cambiar el modo de edición a texto y copiarlo a tu wiki. -
-
- Otros Formatos - No es imprescindible que aprendas el lenguaje de formateo de MediaWiki. Puedes escribir en tu formato favorito (Markdown, Org-mode, LaTeX etc.) y convertirlo al formato de MediaWiki usando Pandoc. -
-
- Cargar Imágenes - Se puede habilitar la carga de imágenes desde FreedomBox versión 0.36.0. También puedes usar directamente imágenes de Wikimedia Commons mediante una funcionalidad llamada Instant Commons. -
-
-
- Personalización -
- Temas de estilo - El tema por defecto de MediaWiki suele ser Vector. El de FreedomBox es Timeless. - Vector es un tema optimizado para visualizarlo en pantallas grandes pero no se adecúa bien a los tamaños de pantalla de los móviles. Wikimedia usa otro sitio específico para móviles. Para instalaciones pequeñas como las de FreedomBox no merece la pena un segundo sitio dedicado. Usar un tema de estilo más polivalente como Timeless es una solución más eficiente al problema. - Los administradores pueden elegir el tema por defecto desde la configuración de la app. Los usuarios del sitio tienen también la opción de visualizarlo con temas diferentes. -
+ Transferir Descargas desde la FreedomBox + + + Se puede añadir el directorio de descargas de Transmission como directorio compartido en la app "Compartir" y así acceder a tus descargas en este directorio compartido empleando un navegador web. + + + (Avanzado) Si tienes acceso SSH a tu FreedomBox puedes usar sftp para ver el directorio de descargas usando un gestor de archivos o un navegador apropiados (p.ej. dolphin o Konqueror). + +
- Wiki y Blog (Ikiwiki) + Sitios Web de Usuario (User websites)
- ¿Qué es Ikiwiki? - Ikiwiki convierte páginas wiki a páginas HTML listas para publicar en un sitio web. En particular, proporciona blogs, podcasts, calendarios y una amplia selección de extensiones (plugins). + ¿Qué es User websites? + User websites es un módulo del servidor web Apache habilitado para permitir a los usuarios definidos en el sistema FreedomBox exponer un conjunto de archivos del sistema de ficheros de FreedomBox como sitio web a la red local y/o a internet de acuerdo a la configuración de la red y el cortafuegos. + + + + + + + + + Datos básicos de la aplicación + + + + + + Categoría + + + Compartición de archivos + + + + + Disponible desde la versión + + + 0.9.4 + + + + + Sitio web del proyecto original + + + + + + + + + + Documentación original de usuario + + + + + + + + + +
- Inicio rápido - Tras instalar la app en el interfaz de administración de tu FreedomBox: - - - Ve a la sección Crear y crea un wiki o un blog. - - - Vuelve a la sección Configurar y haz clic en el enlace /ikiwiki. - - - Haz clic en el nombre de tu nuevo wiki o blog bajo Directorio Padre. - - - Disfruta de tu nueva página de publicación. - - -
-
- Crear un wiki o blog - Puedes crear un wiki o blog para albergarlo en tu FreedomBox mediante la página Wiki y Blog (Ikiwiki) de Plinth. La primera vez que visites esta página te pedirá instalar paquetes requiridos por Ikiwiki. - Tras completar la instalación de paquetes selecciona la solapa Crear. Puedes elegir el tipo: Wiki o Blog. Teclea también un nombre para el wiki o blog, y el usuario y contraseña para su cuenta de administrador. Al hacer clic en Actualizar configuración verás el wiki/blog añadido a tu lista. Observa que cada wiki/blog tiene su propia cuenta de administrador. + Captura de pantalla - - - - - - ikiwiki: Create - - + Añadir cuando/si se crea un interfaz para FreedomBox
- Acceder a tu wiki o blog - Desde la página de Wiki y Blog (Ikiwiki) selecciona la solapa Administrar y verás una lista de tus wikis y blogs. Haz clic en un nombre para navegar a ese wiki o blog. + Usar User websites + El módulo está siempre activado y el interfaz web de FreedomBox no ofrece configuración ni página de estado para este módulo. Para servir documentos con el módulo solo se necesita poner los documentos en un subdirectorio designado /home/<un_usuario_de_plinth>/public_html. + User websites servirá los archivos que haya en este directorio cuando se reciban peticiones con la URI ~<un_usuario_de_freedombox>. Por tanto para un dominio ejemplo.org con un usuario pepe una petición ejemplo.org/~pepe/index.html transferirá el fichero /home/pepe/public_html/index.html. +
+
+ Usar SFTP para crear public_html y subir archivos - - - - - - ikiwiki: Manage - - + Pendiente de redactar - Desde aquí, si le das a Editar o a Preferencias se te llevará a una página de ingreso. Para ingresar con la cuenta de administrador que creaste antes selecciona la solapa Otros, introduce el usuario y la contraseña y haz clic en Ingresar. -
-
- Ingreso único de usuarios (SSO) - Se puede dar permiso para editar a otros usuarios de FreedomBox además de al administrador del wiki/blog. Sin embargo no tendrán todos los permisos del administrador. Podrán añadir o editar páginas pero no podrán cambiar la configuración del wiki. - Para añadir a un usuario al wiki ve a la página Usuarios y Grupos de Plinth (bajo Configuración del Sistema, el icono del engranaje de la esquina superior derecha de la página). Crea o modifica un usuario y añádele al grupo wiki. (Los usuarios del grupo admin tendrán también acceso al wiki.) - Para ingresar como usuario FreedomBox ve a la página de ingreso del wiki/blog y selecciona la solapa Otros. Luego haz clic en el botón Ingresar con autenticación HTTP. El navegador mostrá un diálogo emergente en el que podrás introducir el usuario y la contraseña del usuario de FreedomBox. -
-
- Añadir usuarios FreedomBox como admnistradores de wiki - - - Ingresa al wiki con su cuenta de administrador. - - - Haz clic en Preferencias y luego en Configurar. - - - Debajo de Principal, en usuarios administradores de algún wiki, añade el nombre de un usuario de FreedomBox. - - - (Opcional) Desmarca la opción habilitar autenticación mediante contraseña de extensión de autenticación: autenticación mediante contraseña. (Nota: Esto deshabilitará el ingreso con la cuenta de administrador anterior. Solo se podrá ingresar mediante ingreso único usando autenticación HTTP.) - - - Haz clic en Grabar Configuración. - - - Pulsa Preferencias y a continuación Salir. - - - Ingresa como el nuevo usuario administrador usando Ingresar con autenticación HTTP. - - -
-
-
- Red de Anonimato (I2P) -
- Acerca de I2P - El Proyecto Internet Invisible (I2P) es una capa anonimizadora de red concebida para protejer las comunicaciones de la censura y la vigilancia. I2P proporciona anonimato enviando tráfico cifrado a través de una red distribuída alrededor del mundo gestionada por voluntarios. - Más información acerca de I2P en la página principal del proyecto. -
-
- Servicios Ofrecidos - Los siguientes servicios se ofrecen en FreedomBox a través de I2P de serie. Se pueden habilitar más servicios desde la consola de enrutado I2P que se puede abrir desde el interfaz web de FreedomBox. - - - Navegación web anónima: I2P se puede usar para navegar por la web de forma anónima. Para ello configura tu navegador (preferíblemente un navegador Tor) para conectar al proxy I2P. Esto se puede hacer estableciendo los proxies HTTP y HTTPS a freedombox.local (o la IP local de tu FreedomBox) con sus respectivos puertos a 4444 y 4445. Este servicio está disponible sólo cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de navegación web anónima a través de I2P. - - - Acceso a eepsites: La red I2P puede albergar sitios web anónimos llamados eepsites cuyo nombre de dominio acaba en .i2p. Por ejemplo, http://i2p-projekt.i2p/ es el sitio web del proyecto I2P en la red I2P. Los eepsites son inaccesibles a un navegador normal a través de una conexión Internet normal. Para navegar a los eepsites tu navegador necesita configurarse para usar los proxies HTTP y HTTPS como se describió antes. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de acceso a eepsites a través de I2P. - - - Descargas anónima de torrentes: I2PSnark, una aplicación para descargar y compartir archivos anónimamente mediante la red BitTorrent está disponible y habilitada por defecto en FreedomBox. Esta aplicación se controla mediante un interfaz web que se puede abrir desde la sección Torrentes Anonimos de la app I2P en el interfaz web de FreedomBox o de la consola de enrutado I2P. Solo los usuarios ingresados pertenecientes al grupo Manage I2P application pueden usar este servicio. - - - Red IRC: La red I2P contiene una red IRC llamada Irc2P. Esta red alberga el canal IRC oficial del proyecto I2P, entre otros. Este servicio viene habilitdo de serie en FreedomBox. Para usarlo abre tu cliente IRC favorito y configuralo para conectar con freedombox.local (o la IP local de tu FreedomBox) en el puerto 6668. Este servicio solo está disponible cuando accedes a la FreedomBox usando la red local (redes de la zona interna del cortaguegos) y no cuando llegas a la FreedomBox desde Internet. Una excepción a esto es cuando te conectas al servicio VPN de la FreedomBox desde Internet, en cuyo caso sí puedes usar el servicio de IRC a través de I2P. - - - Consola de enrutado I2P: Este es el interfaz central de administración de I2P. Muestra el estado actual de I2P, estadísticas de ancho de banda y permite modificar varias preferencias de configuración. Puedes adecuar tu participación en la red I2P y usar/editar una lista con tus sitios I2P (eepsites) favoritos. Solo los usuarios ingresados pertenecientes al grupo Manage I2P application pueden usar este servicio. - -
Sistema +
+ Actualizaciones de Software + FreedomBox puede instalar actualizaciones de seguridad automaticamente. Esta funcionalidad viene activada por defecto y no hace falta ninguna acción manual. Puedes activar las actualizaciones automaticas desde el interfaz web de FreedomBox en la página Actualización de la sección Sistema. Se recomienda encarecidamente que tengas esta opción habilitada para mantener tu FreedomBox segura. + Las actualizaciones se efectúan cada noche. Si quieres apagar tu FreedomBox cada día después de usarla, déjala ejecutando una noche a la semana más o menos para permitir que ocurran las actualizaciones automaticas. Otra posibilidad es ejecutar actualizaciones manuales como se describe más adelante. + Nota que una vez comiencen las actualizaciones podría llevarles mucho tiempo completarse. Durante el proceso de actualización (ya sea el automático nocturno o el manual), no podrás instalar aplicaciones desde el interfaz web de FreedomBox. + + + + + + + upgrades_es_v01.png + + + +
+ ¿Cuando obtendré las últimas funcionalidades? + Aunque las actualizaciones se efectúan a diario por razones de seguridad, las últimas funcionalidades no se propagan a todos los usuarios. A continuación se explica cómo llegan las novedades a los usuarios de las diferentes versiones de Debian: + + + Usuarios de versiones estables: Esta categoria de usuarios incluye a los usuarios que compraron la FreedomBox Pioneer Edition, a los que instalaron FreedomBox sobre una distribución estable de Debian y a los que descargaron las imágenes estables desde freedombox.org. Como regla general a estos usuarios solo se les proporciona actualizaciones de seguridad de determinados paquetes. Cuando una release obtiene la confianza de los desarrolladores el propio servicio FreedomBox se actualiza, lo que supone una excepción a esta regla. Esto implica que las últimas funcionalidades de FreedomBox estarán disponibles para estos usuarios aunque no tán inmediata- o frecuentemente como para los usuarios de las versiones en pruebas (testing). Si una app sólo está disponible en la distribución en pruebas (testing) pero no en la estable la app aparecerá en el interfaz web pero no será instalable para los usuarios de la distribución estable. Algunas apps se actualizan en excepción a la regla de "solo actualizaciones de seguridad" cuando la app esté seriamente rota por algún motivo. Debian libera cada bienio una entrega (release) con las últimas versiones estables de cada paquete de software y los desarrolladores de FreedomBox intentarán actualizar a estos usuarios a la nueva entrega (release) sin necesidad de intervención manual. + + + Usuarios de versiones en pruebas: Esta categoria de usuarios incluye a los usuarios que instalaron FreedomBox sobre una distribución en pruebas (testing) y a los que descargaron las imágenes en pruebas (testing) desde freedombox.org. Estos usuarios asumen la posibilidad de afrontar disrupciones ocasionales en los servicios e incluso tener que intervenir manualmente para arreglarlas. Como regla general estos usuarios reciben las últimas funcionalidades y actualizaciones de seguridad para todos los paquetes instalados. Cada quincena se libera una nueva versión de FreedomBox con todas las últimas funcionalidades y correcciones. Estas versiones llegan a los usuarios de la distribución en pruebas (testing) aproximadamente 2 o 3 días después de la liberación. + + + Usuarios de versiones inestables: Esta categoria de usuarios incluye a los usuarios que instalaron FreedomBox sobre una distribución inestable y a los que descargaron las imágenes inestables desde freedombox.org. Estos usuarios asumen la probabilidad de afrontar disrupciones en los servicios y tener que intervenir manualmente para arreglarlas. Como regla general estos usuarios reciben las últimas funcionalidades y actualizaciones de seguridad para todos los paquetes instalados. Cada quincena se libera una nueva versión de FreedomBox con todas las últimas funcionalidades y correcciones. Estas versiones llegan a los usuarios de la distribución inestable el mismo día de la liberación. Solo los desarrolladores, probadores y contribuyentes al proyecto FreedomBox debieran emplear la distribution inestable. Se advierte y exhorta a los usuarios finales de que no la usen. + + +
+
+ Actualizaciones Manuales desde el Terminal + Algunos paquetes de software podrían requerir intervención manual para actualizarlos, generalmente por razones de configuración. En tales casos FreedomBox se actualiza a sí mismo y solicita información nueva necesaria para la actualización del paquete. Después de autoactualizarse FreedomBox actúa en nombre del usuario y actualiza los paquetes con la información recabada. Estos paquetes no se deben actualizar manualmente hasta que FreedomBox tenga la posibilidad de actualizarlos. La actualización que se dispara manualmente desde el interfaz web ya es consciente de estos paquetes y no los actualiza. + En situaciones muy extrañas, FreedomBox podría fallar o quedar a expensas de una intervención manual desde el terminal. Para esto, entra a FreedomBox por un terminal, ya sea físico, web (empleando Cockpit) o mediante SSH (ver sección Shell Segura) y ejecuta los siguientes comandos: + +# dpkg --configure -a +# apt update +# apt -f install +# unattended-upgrade --debug +# apt install freedombox +# apt update]]> + Si apt-get update te pide confirmación para algo responde que . Si durante la actualización del paquete freedombox te pregunta acerca de los archivos de configuración responde que instale los archivos de configuración nuevos que vienen con la última versión del paquete. Este proceso solo actualizará los paquetes que no necesitan preguntar (excepto el paquete freedombox). Después, deja que FreedomBox se encargue de la actualización de los demás paquetes. Sé paciente mientras se crean nuevas versiones de FreedomBox para tratar los paquetes que necesitan intervención manual. + Si quieres ir más allá de la recomendación e instalar todos los paquetes en tu FreedomBox y realmente estás muy seguro de poder tratar los cambios de configuración de paquetes por tí mismo, ejecuta el siguiente comando: + +
+
+
+ Almacenamiento + Almacenamiento te permite ver los dispositivos de almacenamiento conectados a tu FreedomBox y el uso de su espacio. + FreedomBox puede detectar y montar automáticamente medios extraíbles como unidades flash USB. Se muestran listados bajo la sección Dispositivos extraíbles junto con una opción para expulsarlos. + Si queda espacio libre detrás de la partición de root, se mostrará también la opción para expandirla. Normalmente no se muestra ya que en el primer arranque de la FreedomBox se produce automáticamente una expansión total de la partición de root. + + + + + + + Storage.png + + + +
+ Operación de almacenamiento avanzada + Cockpit proporciona muchas funcionalidades de almacenamiento más avanzadas que las de FreedomBox. Ambos, FreedomBox y Cockpit, operan sobre el demonio de almacenamiento Udisks2 y son por ello compatibles entre sí. Entre las funciones proporcionadas por Cockpit se incluyen: + + + Formatear un disco o partición con un nuevo sistema de ficheros. + + + Añadir, eliminar particiones o borrar la tabla de particiones. + + + Crear y desbloquear sistemas de ficheros cifrados. + + + Crear y administrar dispositivos RAID. + + + + + + + + + storage-cockpit.png + + + +
+
+
+ Almacén de instantáneas + Las Instantáneas te permiten crear instantáneas del sistema de archivos y devolver al sistema a un estado anterior. + + + Nota: Esta funcionalidad requiere un sistema de archivos Btrfs. Todas las imágenes de disco de FreedomBox estables usan Btrfs. + + + + + + + + + Instantáneas + + + +
+
+ Apagado + Power proporciona un modo fácil de reiniciar o apagar tu FreedomBox. Después de seleccionar "Reiniciar" o "Apagar", se te pedirá confirmación. Se puede llegar también a las opciones "Reiniciar" y "Apagar" desde el menú desplegable del usuario en la esquina superior derecha. +
+
+ BIND (Servidor de Nombre de Dominio) + BIND te permite publicar en Internet tu información de Sistema de Nombre de Dominio (DNS) y resolver consultas DNS de los dispositivos de usuario en tu red. + Actualmente en FreedomBox BIND solo se usa para resolver consultas DNS de otras máquinas en tu red local. También es incompatible con compartir conexiones a Internet de tu FreedomBox. + Nota: Este servicio solo está disponible en redes configuradas como zona "interna". Tampoco está disponble a través de OpenVPN (es incompatible). +
+
+ Cliente de DNS Dinamico +
+ ¿Qué es DNS Dinamico? + Para que se pueda llegar a un servidor desde Internet este necesita tener una dirección pública permanente, también conocida como dirección IP estática o fija. Muchos proveedores de servicio de Internet no otorgan IP fija a sus usuarios normales o la cobran. En su lugar les otorgan una IP temporal diferente cada vez que el usuario se conecta a internet. O una que cambia de vez en cuando. Si es tu caso los clientes que quieran contactar con tu servidor tendrán dificultades. + Los proveedores de servicio de DNS Dinamico ayudan a solventar este problema. Primero te dan un nombre de dominio, como 'miservidor.ejemplo.org' y te permiten asociar tu dirección IP temporal a este nombre de dominio cada vez que esta cambia. De este modo quien quiera llegar a tu servidor empleará el nombre de dominio 'miservidor.ejemplo.org' que siempre apuntará a la última dirección IP de tu servidor. + Para que esto funcione cada vez que te conectes a Internet tendrás que decirle a tu proveedor de servicio de DNS Dinamico cual es tu dirección IP provisional actual. Por esto necesitas tener un software especial en tu servidor que haga esto. La funcionalidad DNS Dinamico de tu FreedomBox permite a los usuarios sin dirección IP pública fija mantener su dirección IP pública temporal actualizada en el servicio de DNS Dinamico. Esto te permite exponer servicios de tu FreedomBox, como ownCloud, a Internet. +
+
+ GnuDIP vs. Update URL + Eisten 2 mecanismos principales para notificar al the servicio de DNS Dinamico cual es tu dirección IP provisional actual: empleando el protocolo GnuDIP o empleando el mecanismo URL de actualización. + Si un servicio expuesto usando URL de actualización no se securiza apropiadamente mediante HTTPS, tus credenciales podrían quedar expuestas. Una vez que un atacante accede a tus credenciales podrá reproducir tus comunicaciones con el servicio de DNS Dinamico y suplantar tu dominio. + Por otra parte el protocolo GnuDIP solo transportará un valor MD5 salpimentado de tu contraseña de tal forma que es seguro contra ataques de este tipo. +
+
+ Emplear el protocolo GnuDIP + + + Registra una cuenta en cualquier proveedor de servicio de DNS Dinamico. Hay un servicio gratuito provisto por la comunidad FreedomBox disponible en . + + + Habilita el Servicio de DNS Dinamico en el interfaz de usuario de FreedomBox. + + + Selecciona GnuDIP como tipo de servicio, introduce la dirección de tu proveedor de servicio de DNS Dinamico (por ejemplo, gnudip.datasystems24.net) en el campo Dirección del servidor GnuDIP. + + + + + + + Dynamic DNS Settings + + + + + + Completa la información que te ha dado tu proveedor en los campos correspondientes Nombre de Dominio, Usuario y Contraseña. + + +
+
+ Emplear URL de actualización + Se implementa esta funcionalidad porque los proveedores de servicio de DNS Dinamico más populares están empleando el mecanismo URL de actualización. + + + Registra una cuenta en el proveedor de servicio de DNS Dinamico que emplea el mecanismo Update URL. Se listan algunos proveedores de ejemplo en la propia página de configuración. + + + Habilita el Servicio de DNS Dinamico en el interfaz de usuario de FreedomBox. + + + Selecciona URL de actualización como tipo de servicio, introduce la URL de actualización que te ha dado tu proveedor de servicio de DNS Dinamico en el campo URL de actualización. + + + Si vas a la URL de actualización con tu navegador de Internet y te muestra un aviso acerca de un certificado no confiable, activa aceptar todos los certificados SSL. AVISO: ¡Tus credenciales podrían quedar expuestas en este punto a un ataque MIM (man-in-the-middle)! Valora la posibilidad de elegir otro proveedor de servicio mejor. + + + Si vas a la URL de actualización con tu navegador de Internet y te muestra la caja de usuario/contraseña, selecciona usar autenticación HTTP basica e introduce el usuario y la contraseña. + + + Si la URL de actualización contiene tu dirección IP temporal actual reemplaza la dirección IP por la cadena de texto <Ip>. + + +
+
+ Comprobar si funciona + + + Asegúrate de que los servicios externos que has habilitado como /jwchat, /roundcube o /ikiwiki están disponibles en tu dirección de dominio. + + + Ve a la página Estado y asegúrate de que el tipo de NAT se detecta correctamente. Si tu FreedomBox está detrás de un dispositivo NAT debería detectarse en este punto (Texto: Detrás de NAT). Si tu FreedomBox tiene una dirección IP pública asignada el texto debería ser "Conexión directa a Internet". + + + Comprueba que el último estado de actualización no sea fallida. + + +
+
+ Recap: How to create a DNS name with GnuDIP + + to delete or to replace the old text + + + + Access to GnuIP login page (answer Yes to all pop ups) + + + Click on "Self Register" + + + Fill the registration form (Username and domain will form the public IP address [username.domain]) + + + Take note of the username/hostname and password that will be used on the FreedomBox app. + + + Save and return to the GnuDIP login page to verify your username, domain and password (enter the datas, click login). + + + Login output should display your new domain name along with your current public IP address (this is a unique address provided by your router for all your local devices). + + + Leave the GnuDIP interface and open the Dynamic DNS Client app page in your FreedomBox. + + + Click on "Set Up" in the top menu. + + + Activate Dynamic DNS + + + Choose GnuDIP service. + + + Add server address (gnudip.datasystems24.net) + + + Add your fresh domain name (username.domain, ie [username].freedombox.rocks) + + + Add your fresh username (the one used in your new IP address) and password + + + Add your GnuDIP password + + + Fill the option with (try this url in your browser, you will figure out immediately) + + +
+
+
+ Cockpit (Administración de Servidor) + Cockpit es una aplicación que facilita administrar servidores GNU/Linux desde el navegador web. En una FreedomBox, hay disponibles controles para muchas funciones avanzadas que normalmente no se necesitan. También hay disponible un terminal web para operaciones de consola. + Cualquier usuario del grupo de administradores de to FreedomBox puede acceder a Cockpit. Cockpit solo se puede usar si tienes una configuración de nombre de dominio apropiada para tu FreedomBox y usas ese nombre de dominio para acceder a Cockpit. Para más información mira la sección de Resolución de Problemas. + + Usa cockpit sólo si eres un administrador de sistemas GNU/Linux con habilidades avanzadas. FreedomBox intenta coexistir con los cambios al sistema que efectúan los administradores y sus herramientas, como Cockpit. Sin embargo, los cambios al sistema inadecuados pueden causar fallos en las funciones de FreedomBox. + +
+ Usar Cockpit + Instala Cockpit como cualquier otra aplicación de FreedomBox. Y a continuación asegúrate de que Cockpit está habilitado. + + + + + + + cockpit-enable.png + + + + Asegúrate de que la cuenta de usuario de FreedomBox que se empleará con Cockpit es parte del grupo de administradores. + + + + + + + cockpit-admin-user.png + + + + Arranca el interfaz web de Cockpit. Ingresa con la cuenta de usuario configurada. + + + + + + + cockpit-login.png + + + + Empieza a usar cockpit. + + + + + + + cockpit-system.png + + + + Cockpit también funciona con interfaces mobiles. + + + + + + + cockpit-mobile.png + + + +
+
+ Funcionalidades + Las siguientes funcionalidades de Cockpit pueden ser útiles para usuarios avanzados de FreedomBox. +
+ Cuadro de Mando del Sistema + Cockpit tiene un cuadro de mando del sistema que + + + Muestra información detallada del hardware. + + + Muestra métricas básicas de rendimiento del sistema. + + + Permite cambiar la hora y el huso del sistema. + + + Permite cambiar el hostname. Por favor usa el interfaz de usuario de FreedomBox UI para hacer esto. + + + Muestra las huellas del servidor SSH. + + + + + + + + + cockpit-system.png + + + +
+
+ Visualización de los Registros de Ejecución (logs) del Sistema + Cockpit permite consultar los registros de ejecución (logs) del sistema y examinarlos a todo detalle. + + + + + + + cockpit-logs.png + + + +
+
+ Administración de Almacenamiento + Cockpit permite las siguientes funciones avanzadas de almacenamiento: + + + Visualización de llenado de discos. + + + Edición de particiones de disco. + + + Administración de RAID. + + + + + + + + + cockpit-storage1.png + + + + + + + + + + cockpit-storage2.png + + + +
+
+ Redes + Tanto Cockpit como FreedomBox se apoyan en NetworkManager para configurar la red. No obstante, Cockpit ofrece alguna configuración avanzada no disponible en FreedomBox: + + + Configuración de rutas. + + + Configuración de enlaces, puentes y VLANs. + + + + + + + + + cockpit-network1.png + + + + + + + + + + cockpit-network2.png + + + + + + + + + + cockpit-network3.png + + + +
+
+ Servicios + Cockpit permite agendar servicios y tareas periódicas (como cron). + + + + + + + cockpit-services1.png + + + + + + + + + + cockpit-services2.png + + + +
+
+ Terminal Web + Cockpit ofrece un terminal web que se puede usar para ejecutar tareas manuales de administración del sistema. + + + + + + + cockpit-terminal.png + + + +
+
+
+ Resolución de Problemas + Cockpit require un nombre de dominio adecuadamente configurado en tu FreedomBox y solo funcionará cuando accedas a él mediante una URL con ese nombre de dominio. Cockpit no funcionará con una dirección IP en la URL. Tampoco con freedombox.local como nombre de dominio. Por ejemplo, las URLs siguientes no funcionarán: + + A partir de la versión 19.15 funciona el dominio .local. Puedes acceder a Cockpit mediante la URL . El dominio .local se basa en tu hostname. Si tu hostname es mifb tu nombre de dominio .local será mifb.local y la URL de Cockpit será . + Para acceder apropiadamente a Cockpit, usa el nombre de dominio configurado en tu FreedomBox. Cockpit también funcionará cuando se use un Servicio Tor Onion. Las siguientes URLs funcionarán: + + La razón para este comportamiento es que Cockpit emplea WebSockets para conectar con el servidor de backend. Por seguridad se deben evitar las peticiones a WebSockets con servidores cruzados. Para implementar esto Cockpit maintiene una lista de todos los dominios desde los que se admiten peticiones. FreedomBox configura automaticamente esta lista cuando añades o borras un dominio. Sin embargo, como no podemos fiarnos de las direcciones IP, FreedomBox no las añade a esta lista. Puedes mirar la lista actual de dominios aceptados administrada por FreedomBox en /etc/cockpit/cockpit.conf. Puedes editarla pero hazlo solo si comprendes sus consecuencias para la seguridad web. +
+
+
+ Configurar + Configurar tiene algunas opciones generales de configuración: +
+ Hostname + + + Hostname es el nombre local por el que otros dispositivos pueden alcanzar tu FreedomBox desde la red local. El hostname por defecto es freedombox. + + +
+
+ Nombre de Dominio + + + El Nombre de Dominio es el nombre global por el que otros dispositivos pueden alcanzar tu FreedomBox desde la Internet. El valor que se asigne aquí es el que usarán Chat Server (XMPP), Matrix Synapse, Certificates (Let's Encrypt), y Monkeysphere. + + +
+
+ Página Principal (home) del Servidor Web + + + Esta es una opción avanzada que te permite establecer como home algo diferente al servicio FreedomBox para que se sirva a quien acceda con el navegador al nombre de dominio de FreedomBox. Por ejemplo, si el nombre de dominio de tu FreedomBox es y estableces a MediaWiki como home, al visitar te llevará a en vez de a . Puedes asignar la home a cualquier aplicación web, los wikis y blogs de Ikiwiki o la página index.html por defecto de Apache. + + + + Una vez asignada como home otra aplicación, ya solo puedes navegar al servicio FreedomBox tecleando en el navegador . + /freedombox también se puede usar como alias para /plinth + + + + Consejo: Guarda la URL del servicio FreedomBox antes de asignar la home a otra app. + + +
+
Copias de respaldo (backups) FreedomBox incluye la posibilidad de copiar y restaurar datos, preferencias, configuración y secretos de la mayoría de las aplicaciones. La funcionalidad de Backups se resuelve con el software de backup Borg. Borg es un programa de backup con deduplicación y compresión. Está diseñado para hacer backups eficientes y seguros. Esta funcionalidad de backups se puede emplear para respaldar y recuperar datos aplicación por aplicación. Las copias de respaldado se pueden almacenar en la propia máquina FreedomBox o en un servidor remoto. Cualquier servidor remoto con acceso por SSH se puede emplear como almacenamiento para los backups de la FreedomBox. Las copias remotas se pueden cifrar para que el servidor remoto no pueda leer los datos que alberga. @@ -3754,445 +4353,6 @@ turn_allow_guests: True]]>
-
- Configurar - Configurar tiene algunas opciones generales de configuración: -
- Hostname - - - Hostname es el nombre local por el que otros dispositivos pueden alcanzar tu FreedomBox desde la red local. El hostname por defecto es freedombox. - - -
-
- Nombre de Dominio - - - El Nombre de Dominio es el nombre global por el que otros dispositivos pueden alcanzar tu FreedomBox desde la Internet. El valor que se asigne aquí es el que usarán Chat Server (XMPP), Matrix Synapse, Certificates (Let's Encrypt), y Monkeysphere. - - -
-
- Página Principal (home) del Servidor Web - - - Esta es una opción avanzada que te permite establecer como home algo diferente al servicio FreedomBox (Plinth) para que se sirva a quien acceda con el navegador al nombre de dominio de FreedomBox. Por ejemplo, si el nombre de dominio de tu FreedomBox es y estableces a MediaWiki como home, al visitar te llevará a en vez de a . Puedes asignar la home a cualquier aplicación web, los wikis y blogs de Ikiwiki o la página index.html por defecto de Apache. - - - - Una vez asignada como home otra aplicación, ya solo puedes navegar al servicio FreedomBox (Plinth) tecleando en el navegador . - /freedombox también se puede usar como alias para /plinth - - - - Consejo: Guarda la URL del servicio FreedomBox (Plinth) antes de asignar la home a otra app. - - -
-
-
- Administración de Servidor (Cockpit) - Cockpit es una aplicación que facilita administrar servidores GNU/Linux desde el navegador web. En una FreedomBox, hay disponibles controles para muchas funciones avanzadas que normalmente no se necesitan. También hay disponible un terminal web para operaciones de consola. - Cualquier usuario del grupo de administradores de to FreedomBox puede acceder a Cockpit. Cockpit solo se puede usar si tienes una configuración de nombre de dominio apropiada para tu FreedomBox y usas ese nombre de dominio para acceder a Cockpit. Para más información mira la sección de Resolución de Problemas. - - Usa cockpit sólo si eres un administrador de sistemas GNU/Linux con habilidades avanzadas. FreedomBox intenta coexistir con los cambios al sistema que efectúan los administradores y sus herramientas, como Cockpit. Sin embargo, los cambios al sistema inadecuados pueden causar fallos en las funciones de FreedomBox. - -
- Usar Cockpit - Instala Cockpit como cualquier otra aplicación de FreedomBox. Y a continuación asegúrate de que Cockpit está habilitado. - - - - - - - cockpit-enable.png - - - - Asegúrate de que la cuenta de usuario de FreedomBox que se empleará con Cockpit es parte del grupo de administradores. - - - - - - - cockpit-admin-user.png - - - - Arranca el interfaz web de Cockpit. Ingresa con la cuenta de usuario configurada. - - - - - - - cockpit-login.png - - - - Empieza a usar cockpit. - - - - - - - cockpit-system.png - - - - Cockpit también funciona con interfaces mobiles. - - - - - - - cockpit-mobile.png - - - -
-
- Funcionalidades - Las siguientes funcionalidades de Cockpit pueden ser útiles para usuarios avanzados de FreedomBox. -
- Cuadro de Mando del Sistema - Cockpit tiene un cuadro de mando del sistema que - - - Muestra información detallada del hardware. - - - Muestra métricas básicas de rendimiento del sistema. - - - Permite cambiar la hora y el huso del sistema. - - - Permite cambiar el hostname. Por favor usa el interfaz de usuario de FreedomBox UI para hacer esto. - - - Muestra las huellas del servidor SSH. - - - - - - - - - cockpit-system.png - - - -
-
- Visualización de los Registros de Ejecución (logs) del Sistema - Cockpit permite consultar los registros de ejecución (logs) del sistema y examinarlos a todo detalle. - - - - - - - cockpit-logs.png - - - -
-
- Administración de Almacenamiento - Cockpit permite las siguientes funciones avanzadas de almacenamiento: - - - Visualización de llenado de discos. - - - Edición de particiones de disco. - - - Administración de RAID. - - - - - - - - - cockpit-storage1.png - - - - - - - - - - cockpit-storage2.png - - - -
-
- Redes - Tanto Cockpit como FreedomBox se apoyan en NetworkManager para configurar la red. No obstante, Cockpit ofrece alguna configuración avanzada no disponible en FreedomBox: - - - Configuración de rutas. - - - Configuración de enlaces, puentes y VLANs. - - - - - - - - - cockpit-network1.png - - - - - - - - - - cockpit-network2.png - - - - - - - - - - cockpit-network3.png - - - -
-
- Servicios - Cockpit permite agendar servicios y tareas periódicas (como cron). - - - - - - - cockpit-services1.png - - - - - - - - - - cockpit-services2.png - - - -
-
- Terminal Web - Cockpit ofrece un terminal web que se puede usar para ejecutar tareas manuales de administración del sistema. - - - - - - - cockpit-terminal.png - - - -
-
-
- Resolución de Problemas - Cockpit require un nombre de dominio adecuadamente configurado en tu FreedomBox y solo funcionará cuando accedas a él mediante una URL con ese nombre de dominio. Cockpit no funcionará con una dirección IP en la URL. Tampoco con freedombox.local como nombre de dominio. Por ejemplo, las URLs siguientes no funcionarán: - - A partir de la versión 19.15 funciona el dominio .local. Puedes acceder a Cockpit mediante la URL . El dominio .local se basa en tu hostname. Si tu hostname es mifb tu nombre de dominio .local será mifb.local y la URL de Cockpit será . - Para acceder apropiadamente a Cockpit, usa el nombre de dominio configurado en tu FreedomBox. Cockpit también funcionará cuando se use un Servicio Tor Onion. Las siguientes URLs funcionarán: - - La razón para este comportamiento es que Cockpit emplea WebSockets para conectar con el servidor de backend. Por seguridad se deben evitar las peticiones a WebSockets con servidores cruzados. Para implementar esto Cockpit maintiene una lista de todos los dominios desde los que se admiten peticiones. FreedomBox configura automaticamente esta lista cuando añades o borras un dominio. Sin embargo, como no podemos fiarnos de las direcciones IP, FreedomBox no las añade a esta lista. Puedes mirar la lista actual de dominios aceptados administrada por FreedomBox en /etc/cockpit/cockpit.conf. Puedes editarla pero hazlo solo si comprendes sus consecuencias para la seguridad web. -
-
-
- Fecha y hora - Este servidor de hora de red es un programa que mantiene el tiempo del sistema sincronizado con servidores de Internet. - Puedes seleccionar el huso horario - - - escogiendo una capital cercana (están ordenadas por Continente/Ciudad) o - - - seleccionando directamente el huso en relación a GMT (Greenwich Mean Time). - - - - - - - - - DateTime_es_v01.png - - - -
-
- Diagnósticos - La prueba de diagnóstico del sistema ejecutará varias verificaciones sobre tu sistema para confirmar que las aplicaciones y servicios están funcionando como se espera. - Sólo haz clic Ejecutar Diagnósticos. Esto puede llevar varios minutos. -
-
- Cliente de DNS Dinamico -
- ¿Qué es DNS Dinamico? - Para que se pueda llegar a un servidor desde Internet este necesita tener una dirección pública permanente, también conocida como dirección IP estática o fija. Muchos proveedores de servicio de Internet no otorgan IP fija a sus usuarios normales o la cobran. En su lugar les otorgan una IP temporal diferente cada vez que el usuario se conecta a internet. O una que cambia de vez en cuando. Si es tu caso los clientes que quieran contactar con tu servidor tendrán dificultades. - Los proveedores de servicio de DNS Dinamico ayudan a solventar este problema. Primero te dan un nombre de dominio, como 'miservidor.ejemplo.org' y te permiten asociar tu dirección IP temporal a este nombre de dominio cada vez que esta cambia. De este modo quien quiera llegar a tu servidor empleará el nombre de dominio 'miservidor.ejemplo.org' que siempre apuntará a la última dirección IP de tu servidor. - Para que esto funcione cada vez que te conectes a Internet tendrás que decirle a tu proveedor de servicio de DNS Dinamico cual es tu dirección IP provisional actual. Por esto necesitas tener un software especial en tu servidor que haga esto. La funcionalidad DNS Dinamico de tu FreedomBox permite a los usuarios sin dirección IP pública fija mantener su dirección IP pública temporal actualizada en el servicio de DNS Dinamico. Esto te permite exponer servicios de tu FreedomBox, como ownCloud, a Internet. -
-
- GnuDIP vs. Update URL - Eisten 2 mecanismos principales para notificar al the servicio de DNS Dinamico cual es tu dirección IP provisional actual: empleando el protocolo GnuDIP o empleando el mecanismo URL de actualización. - Si un servicio expuesto usando URL de actualización no se securiza apropiadamente mediante HTTPS, tus credenciales podrían quedar expuestas. Una vez que un atacante accede a tus credenciales podrá reproducir tus comunicaciones con el servicio de DNS Dinamico y suplantar tu dominio. - Por otra parte el protocolo GnuDIP solo transportará un valor MD5 salpimentado de tu contraseña de tal forma que es seguro contra ataques de este tipo. -
-
- Emplear el protocolo GnuDIP - - - Registra una cuenta en cualquier proveedor de servicio de DNS Dinamico. Hay un servicio gratuito provisto por la comunidad FreedomBox disponible en . - - - Habilita el Servicio de DNS Dinamico en el interfaz de usuario de FreedomBox. - - - Selecciona GnuDIP como tipo de servicio, introduce la dirección de tu proveedor de servicio de DNS Dinamico (por ejemplo, gnudip.datasystems24.net) en el campo Dirección del servidor GnuDIP. - - - - - - - Dynamic DNS Settings - - - - - - Completa la información que te ha dado tu proveedor en los campos correspondientes Nombre de Dominio, Usuario y Contraseña. - - -
-
- Emplear URL de actualización - Se implementa esta funcionalidad porque los proveedores de servicio de DNS Dinamico más populares están empleando el mecanismo URL de actualización. - - - Registra una cuenta en el proveedor de servicio de DNS Dinamico que emplea el mecanismo Update URL. Se listan algunos proveedores de ejemplo en la propia página de configuración. - - - Habilita el Servicio de DNS Dinamico en el interfaz de usuario de FreedomBox. - - - Selecciona URL de actualización como tipo de servicio, introduce la URL de actualización que te ha dado tu proveedor de servicio de DNS Dinamico en el campo URL de actualización. - - - Si vas a la URL de actualización con tu navegador de Internet y te muestra un aviso acerca de un certificado no confiable, activa aceptar todos los certificados SSL. AVISO: ¡Tus credenciales podrían quedar expuestas en este punto a un ataque MIM (man-in-the-middle)! Valora la posibilidad de elegir otro proveedor de servicio mejor. - - - Si vas a la URL de actualización con tu navegador de Internet y te muestra la caja de usuario/contraseña, selecciona usar autenticación HTTP basica e introduce el usuario y la contraseña. - - - Si la URL de actualización contiene tu dirección IP temporal actual reemplaza la dirección IP por la cadena de texto <Ip>. - - -
-
- Comprobar si funciona - - - Asegúrate de que los servicios externos que has habilitado como /jwchat, /roundcube o /ikiwiki están disponibles en tu dirección de dominio. - - - Ve a la página Estado y asegúrate de que el tipo de NAT se detecta correctamente. Si tu FreedomBox está detrás de un dispositivo NAT debería detectarse en este punto (Texto: Detrás de NAT). Si tu FreedomBox tiene una dirección IP pública asignada el texto debería ser "Conexión directa a Internet". - - - Comprueba que el último estado de actualización no sea fallida. - - -
-
- Recap: How to create a DNS name with GnuDIP - - to delete or to replace the old text - - - - Access to GnuIP login page (answer Yes to all pop ups) - - - Click on "Self Register" - - - Fill the registration form (Username and domain will form the public IP address [username.domain]) - - - Take note of the username/hostname and password that will be used on the FreedomBox app. - - - Save and return to the GnuDIP login page to verify your username, domain and password (enter the datas, click login). - - - Login output should display your new domain name along with your current public IP address (this is a unique address provided by your router for all your local devices). - - - Leave the GnuDIP interface and open the Dynamic DNS Client app page in your FreedomBox. - - - Click on "Set Up" in the top menu. - - - Activate Dynamic DNS - - - Choose GnuDIP service. - - - Add server address (gnudip.datasystems24.net) - - - Add your fresh domain name (username.domain, ie [username].freedombox.rocks) - - - Add your fresh username (the one used in your new IP address) and password - - - Add your GnuDIP password - - - Fill the option with (try this url in your browser, you will figure out immediately) - - -
-
Cortafuegos Un cortafuegos es un sistema de seguridad de red que controla el tráfico de entrada y salida desde/a la red. Mantener un cortafuegos habilitado y apropiadamente configurado reduce el riesgo de amenazas a la seguridad desde Internet. @@ -4210,12 +4370,26 @@ https://exampletorhs.onion/cockpit/]]> La administración del cortafuegos en FreedomBox se hace empleando FirewallD.
Interfaces - Cada interfaz de red necesita asignarse a 1 (y sólo 1) zona. Las reglas que tenga activas la zona se aplicarán al interfaz. Por ejemplo, si se permite el trafico HTTP en una zona en particular las peticiones web se acceptarán en todas las direcciones configuradas para todos los interfaces asignados a esa zona. + Cada interfaz de red necesita asignarse a 1 (y sólo 1) zona. Si no se le establece zona, automáticamente se le asigna la zona externa. Las reglas que tenga activas la zona se aplicarán al interfaz. Por ejemplo, si se permite el trafico HTTP en una zona en particular las peticiones web se acceptarán en todas las direcciones configuradas para todos los interfaces asignados a esa zona. Principalmente se emplean 2 zonas de cortafuegos. La zona interna está pensada para servicios ofrecidos a todas las máquinas de la red local. Esto podría incluir servicios como streaming multimedia o compartición simple de archivos. La zona externa está pensada para servicios públicamente expuestos a Internet. Esto podría incluir servicios como blog, sitio web, cliente web de correo electrónico etc. Para más detalles acerca de como se configuran por defecto los interfaces de red mira la sección Redes.
- Puertos/Servicios + Abrir Puertos Propios + Cockpit proporciona administración avanzada de cortafuegos. Ambos, FreedomBox y Cockpit operan sobre firewalld y son por tanto compatibles entre sí. En particular, Cockpit se puede usar en FreedomBox para abrir servicios o puertos. Esto resulta útil si además de los servicios proporcionados por FreedomBox estás ejecutando manualmente tus propios servicios en la misma máquina. + + + + + + + firewalld-cockpit.png + + + +
+
+ Puertos/Servicios de FreedomBox La siguiente tabla trata de documentar los puertos, servicios y sus estados por defecto en FreedomBox. Si encuentras esta página desactualizada mira la página de estado del cortafuegos en el interfaz web de FreedomBox. @@ -6069,7 +6243,41 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0]]>
- Certificados (Let's Encrypt) + Detección de Servicios + La Detección de Servicios permite a otros dispositivos de la red detectar a tu FreedomBox y a los servicios que expone. Si un cliente de la red local soporta mDNS, puede encontrar tu FreedomBox en <hostname>.local (por ejemplo: freedombox.local). + También permite a FreedomBox detectar otros dispositivos y servicios que están funcionando en tu red local. + La Detección de Servicios no es esencial y solo funciona en redes internas. Se puede deshabilitar para mejorar la seguridad especialmente cuando la conectas a una red local hostil. +
+
+ Diagnósticos + La prueba de diagnóstico del sistema ejecutará varias verificaciones sobre tu sistema para confirmar que las aplicaciones y servicios están funcionando como se espera. + Sólo haz clic Ejecutar Diagnósticos. Esto puede llevar varios minutos. +
+
+ Fecha y hora + Este servidor de hora de red es un programa que mantiene el tiempo del sistema sincronizado con servidores de Internet. + Puedes seleccionar el huso horario + + + escogiendo una capital cercana (están ordenadas por Continente/Ciudad) o + + + seleccionando directamente el huso en relación a GMT (Greenwich Mean Time). + + + + + + + + + DateTime_es_v01.png + + + +
+
+ Let's Encrypt (Certificados) Un certificado digital permite a los usuarios de un servicio web verificar la identidad del servicio y comunicar con él de modo seguro. FreedomBox puede obtener y configurar automaticamente certificados digitales para cada dominio disponible. Lo hace probando a Let's Encrypt, una authoridad de certificación (CA) ser el dueño de un dominio. Let's Encrypt es una autoridad de certificación abierta, automatizada, libre y gratuita administrada para beneficio público por el Internet Security Research Group (ISRG). Por favor, lee y acepta los términos del Acuerdo de Suscripción de Let's Encrypt antes de usar este servicio.
@@ -6166,8 +6374,56 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0]]> Monkeysphere también puede generar una clave OpenPGP para cada certificado de servidor web seguro (HTTPS) instalado en esta máquina. La clave pública OpenPGP se puede subir entonces a los servidores de claves OpenPGP. Los usuarios que se conecten mediante HTTPS podrán verificar que se están conectando a la máquina correcta. Para validar el certificado el usuario deberá instalar cierto software disponible en el sitio web de Monkeysphere.
- Servicios de Nombre - Los Servicios de Nombre proporcionan una vista general a las formas de acceder desde la Internet pública a tu !Freedombox: nombre de dominio, servicio Tor Onion y cometa (Pagekite). Para cada tipo de nombre se indica si los servicios HTTP, HTTPS, y SSH están habilitados o deshabilitados para conexiones entrantes. + PageKite (Visibilidad Publica) +
+ ¿Qué es PageKite? + PageKite hace inmediata y públicamente accesibles desde internet a los sitios web y servicios locales sin tener que crear tu mismo una dirección IP pública. Lo hace tunelando protocolos como HTTPS o SSH a través de cortafuegos y NAT. Usar PageKite require ana cuenta en un servicio de repetidor de PageKite. es uno de de estos servicios. + Un servicio de repetidor de PageKite te permitirá crear cometas (kites). Las cometas son similares a los nombres de dominio pero con ventajas y desventajas diferentes. Una cometa puede tener varios servicios configurados. Se sabe que PageKite funciona con HTTP, HTTPS, y SSH, y muchas funcionan con otros servicios, pero no todas. +
+
+ Usar PageKite + + + Créate una cuenta en un servicio de repetidor de PageKite. + + + Añade una cometa a tu cuenta. Anota el nombre y el sectreo de tu cometa. + + + En FreedomBox, vé a la solapa "Configurar PageKite" de la página Visibilidad Publica (PageKite). + + + Marca la caja "Habilitar PageKite" e introduce el nombre y el secreto de tu cometa. Haz clic en "Grabar propiedades". + + + En la solapa "Servicios Estándar" puedes habilitar HTTP y HTTPS (recomendado) y SSH (opcional). + + + HTTP se necesita para obtener el certificado Let's Encrypt. Puedes deshabilitarlo (HTTPS) más tarde. + + + + + En la página Certificados (Let's Encrypt) puedes obtener un certificado Let's Encrypt para el nombre de tu cometa. + + +
+
+
+ Protección + Cuando se habilita esta opción sólo los usuarios del grupo "admin" podrán entrar a la consola o mediante SSH. Los usuarios de consola podrán acceder a algunos servicios sin más autorización. + La sección Usuarios explica cómo definir grupos de usuarios. + Cuando la opción Acceso a consola restringido está habilitada, sólo los usuarios del grupo admin podrán ingresar via consola, shell segura (SSH) o interfaz gráfico. Al desactivar esta funcionalidad cualquier usuario con cuenta en FreedomBox podrá ingresar y quizá tener acceso a ciertos servicios sin más autorización. Esta opción solo debería desactivarse si se confía plenamente en todos los usuarios del sistema. Si quieres usar tu máquina FreedomBox también como escritorio y admitir que usuarios no-admin ingresen mediante interfáz gráfica esta opción debe estar desactivada. Puedes determinar la lista de usuarios admin en la sección Users. + + + + + + + Security_es_v01.png + + +
Redes @@ -6185,7 +6441,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0]]>
- interfaz (tarjeta) ethernet único + Interfaz (tarjeta) ethernet único Cuando el dispositivo hardware solo tiene 1 único interfaz (tarjeta) ethernet hay poco margen para que haga de router. En tal caso se asume que el dispositivo es solo una máquina más en la red. En consecuencia el único interfaz (tarjeta) disponible se configura para ser un interfaz interno en modo de configuración automática. Esto significa que se conecta a Internet empleando la configuración provista por un router de la red y que hace todos sus servicios (internos y externos) accesibles a todos los clientes que haya en esta red. @@ -6238,7 +6494,7 @@ firewall-cmd --permanent --zone=internal --add-interface=eth0]]> Si tu ISP no proporciona configuración de red automática via DHCP y te obliga a conectar por PPPoE, para configurarlo elimina toda conexión de red existente en el interfaz y añade una de tipo PPPoE. Aquí, si procede, indica el usuario y la contraseña que te ha dado tu ISP y activa la conexión.
- Conectar a Internet mdiante Wi-Fi + Conectar a Internet mediante Wi-Fi Por defecto durante el primer arranque los dispositivos Wi-Fi se configurarán como puntos de acceso. Sin embargo se pueden reconfigurar como dispositivos Wi-Fi normales para conectar a la red local o a un router WiFi existente. Para hacer esto haz clic en la conexión Wi-Fi para editarla. Cambia el modo a Infraestructura en vez de Punto de Acceso y Método de direccionamiento IPv4 a Automático (DHCP) en vez de Modo compartido. SSID proporcionado significa el nombre de la red Wi-Fi a la que quieres conectar. Rellena la frase clave.
Problemas con la Funcionalidad de Privacidad @@ -6546,7 +6802,41 @@ wifi.scan-rand-mac-address=no]]>
- Operación de Red Manual + Operación avanzada de Red + Cockpit proporciona muchas funcionalidades de red más avanzadas que las de FreedomBox. Ambos, FreedomBox y Cockpit, operan sobre Network Manager y son por ello compatibles entre sí. Entre las funciones de Cockpit se incluyen: + + + Establer de la unidad máxima de transmisión (MTU) para una conexión de red. + + + Cambiar de la dirección hardware (MAC) de un interfaz de red. + + + Añadir más servidores DNS y configurar el enrutado de una conexión de red. + + + Crear dispositivos coordinados para interfaces de red de alta disponibilidad. + + + Crear dispositivos en puente para agregar redes diferentes en un mismo interfaz de red. + + + Administrar VLAN para crear particiones virtuales en la red física. + + + + + + + + + networks-cockpit.png + + + +
+
+ Operación manual de Red FreedomBox configura redes automáticamente por defecto y proporciona un interfaz simplificado para personalizar la configuración a necesidades específicas. En la mayoría de los casos la operación manual no es necesaria. Los siguientes pasos describen cómo operar la configuración de red a mano en caso de que el interfaz de FreedomBox le resulte insuficiente a un usuario para realizar una tarea o para diagnosticar un problema que FreedomBox no identifique. En el interfaz de línea de comandos: Para acceder a un interfaz de configuración de conexiones de red basado en texto: @@ -6576,44 +6866,8 @@ nmcli con modify "" connection.zone internal]]>
- Apagado - Power proporciona un modo fácil de reiniciar o apagar tu FreedomBox. Después de seleccionar "Reiniciar" o "Apagar", se te pedirá confirmación. Se puede llegar también a las opciones "Reiniciar" y "Apagar" desde el menú desplegable del usuario en la esquina superior derecha. -
-
- Visibilidad Publica (PageKite) -
- ¿Qué es PageKite? - PageKite hace inmediata y públicamente accesibles desde internet a los sitios web y servicios locales sin tener que crear tu mismo una dirección IP pública. Lo hace tunelando protocolos como HTTPS o SSH a través de cortafuegos y NAT. Usar PageKite require ana cuenta en un servicio de repetidor de PageKite. es uno de de estos servicios. - Un servicio de repetidor de PageKite te permitirá crear cometas (kites). Las cometas son similares a los nombres de dominio pero con ventajas y desventajas diferentes. Una cometa puede tener varios servicios configurados. Se sabe que PageKite funciona con HTTP, HTTPS, y SSH, y muchas funcionan con otros servicios, pero no todas. -
-
- Usar PageKite - - - Créate una cuenta en un servicio de repetidor de PageKite. - - - Añade una cometa a tu cuenta. Anota el nombre y el sectreo de tu cometa. - - - En Plinth, vé a la solapa "Configurar PageKite" de la página Visibilidad Publica (PageKite). - - - Marca la caja "Habilitar PageKite" e introduce el nombre y el secreto de tu cometa. Haz clic en "Grabar propiedades". - - - En la solapa "Servicios Estándar" puedes habilitar HTTP y HTTPS (recomendado) y SSH (opcional). - - - HTTP se necesita para obtener el certificado Let's Encrypt. Puedes deshabilitarlo (HTTPS) más tarde. - - - - - En la página Certificados (Let's Encrypt) puedes obtener un certificado Let's Encrypt para el nombre de tu cometa. - - -
+ Servicios de Nombre + Los Servicios de Nombre proporcionan una vista general a las formas de acceder desde la Internet pública a tu !Freedombox: nombre de dominio, servicio Tor Onion y cometa (Pagekite). Para cada tipo de nombre se indica si los servicios HTTP, HTTPS, y SSH están habilitados o deshabilitados para conexiones entrantes.
Shell Segura @@ -6624,8 +6878,8 @@ nmcli con modify "" connection.zone internal]]>
Configurando una Cuenta de Usuario
- Primer ingreso a Plinth: Cuenta de Admin - Al crear una cuenta en Plinth por primera vez, el usuario tendrá automaticamente privilegios de administrador. Los usuarios Admin pueden ingresar mediante ssh (abajo se explica cómo) y escalar sus privilegios a superusuario mediante sudo. + Primer ingreso a FreedomBox: Cuenta de Admin + Al crear una cuenta en FreedomBox por primera vez, el usuario tendrá automaticamente privilegios de administrador. Los usuarios Admin pueden ingresar mediante ssh (abajo se explica cómo) y escalar sus privilegios a superusuario mediante sudo.
Cuenta de Usuario por Defecto @@ -6660,13 +6914,13 @@ nmcli con modify "" connection.zone internal]]> Para ingresar mediante SSH a tu FreedomBox: Reemplaza fbx por el usuario con el que quieres ingresar. Hay que reemplazar freedombox por el hostname o dirección IP de tu dispositivo FreedomBox como se indica en el proceso de Inicio rápido. - fbx es el usuario de FreedomBox con privilegios de superusuario por defecto. Cualquier otro usuario creado con Plinth que pertenezca al grupo admin podrá ingresar. La cuenta root no tiene contraseña configurada y no podrá ingresar. A todos los demás usuarios se les denegará el acceso. + fbx es el usuario de FreedomBox con privilegios de superusuario por defecto. Cualquier otro usuario creado con FreedomBox que pertenezca al grupo admin podrá ingresar. La cuenta root no tiene contraseña configurada y no podrá ingresar. A todos los demás usuarios se les denegará el acceso. fbx y los otros usuarios del grupo admin podrán ingresar directamente por el terminal. A todos los demás usuarios se les denegará el acceso. Si fallas repetidamente intentando ingresar se te bloqueará el acceso por algún tiempo. Esto se debe al paquete libpam-abl que FreedomBox instala por defecto. Para controlar este comportamiento consulta la documentación de libpam-abl.
SSH via Tor - Si tienes habilitados en Plinth los servicios Tor Onion puedes acceder a tu FreedomBox mediante ssh sobre Tor. Instala netcat-openbsd. + Si tienes habilitados en FreedomBox los servicios Tor Onion puedes acceder a tu FreedomBox mediante ssh sobre Tor. Instala netcat-openbsd. Edita ~/.ssh/config para habilitar conexiones sobre Tor. @@ -6699,110 +6953,6 @@ nmcli con modify "" connection.zone internal]]> Esto te preguntará tu contraseña actual antes de darte la oportunidad de establecer la nueva.
-
- Protección - Cuando se habilita esta opción sólo los usuarios del grupo "admin" podrán entrar a la consola o mediante SSH. Los usuarios de consola podrán acceder a algunos servicios sin más autorización. - La sección Usuarios explica cómo definir grupos de usuarios. - Cuando la opción Acceso a consola restringido está habilitada, sólo los usuarios del grupo admin podrán ingresar via consola, shell segura (SSH) o interfaz gráfico. Al desactivar esta funcionalidad cualquier usuario con cuenta en FreedomBox podrá ingresar y quizá tener acceso a ciertos servicios sin más autorización. Esta opción solo debería desactivarse si se confía plenamente en todos los usuarios del sistema. Si quieres usar tu máquina FreedomBox también como escritorio y admitir que usuarios no-admin ingresen mediante interfáz gráfica esta opción debe estar desactivada. Puedes determinar la lista de usuarios admin en la sección Users. - - - - - - - Security_es_v01.png - - - -
-
- Detección de Servicios - La Detección de Servicios permite a otros dispositivos de la red detectar a tu FreedomBox y a los servicios que expone. Si un cliente de la red local soporta mDNS, puede encontrar tu FreedomBox en <hostname>.local (por ejemplo: freedombox.local). - También permite a FreedomBox detectar otros dispositivos y servicios que están funcionando en tu red local. - La Detección de Servicios no es esencial y solo funciona en redes internas. Se puede deshabilitar para mejorar la seguridad especialmente cuando la conectas a una red local hostil. -
-
- Instantáneas - Las Instantáneas te permiten crear instantáneas del sistema de archivos y devolver al sistema a un estado anterior. - - - Nota: Esta funcionalidad requiere un sistema de archivos Btrfs. Todas las imágenes de disco de FreedomBox estables usan Btrfs. - - - - - - - - - Instantáneas - - - -
-
- Almacenamiento - Almacenamiento te permite ver los dispositivos de almacenamiento conectados a tu FreedomBox y el uso de su espacio. - FreedomBox puede detectar y montar automáticamente medios extraíbles como unidades flash USB. Se muestran listados bajo la sección Dispositivos extraíbles junto con una opción para expulsarlos. - Si queda espacio libre detrás de la partición de root, se mostrará también la opción para expandirla. Normalmente no se muestra ya que en el primer arranque de la FreedomBox se produce automáticamente una expansión total de la partición de root. - - - - - - - Storage.png - - - -
-
- Actualizaciones de Software - FreedomBox puede instalar actualizaciones de seguridad automaticamente. Esta funcionalidad viene activada por defecto y no hace falta ninguna acción manual. Puedes activar las actualizaciones automaticas desde el interfaz web de FreedomBox en la página Actualización de la sección Sistema. Se recomienda encarecidamente que tengas esta opción habilitada para mantener tu FreedomBox segura. - Las actualizaciones se efectúan cada noche. Si quieres apagar tu FreedomBox cada día después de usarla, déjala ejecutando una noche a la semana más o menos para permitir que ocurran las actualizaciones automaticas. Otra posibilidad es ejecutar actualizaciones manuales como se describe más adelante. - Nota que una vez comiencen las actualizaciones podría llevarles mucho tiempo completarse. Durante el proceso de actualización (ya sea el automático nocturno o el manual), no podrás instalar aplicaciones desde el interfaz web de FreedomBox. - - - - - - - upgrades_es_v01.png - - - -
- ¿Cuando obtendré las últimas funcionalidades? - Aunque las actualizaciones se efectúan a diario por razones de seguridad, las últimas funcionalidades no se propagan a todos los usuarios. A continuación se explica cómo llegan las novedades a los usuarios de las diferentes versiones de Debian: - - - Usuarios de versiones estables: Esta categoria de usuarios incluye a los usuarios que compraron la FreedomBox Pioneer Edition, a los que instalaron FreedomBox sobre una distribución estable de Debian y a los que descargaron las imágenes estables desde freedombox.org. Como regla general a estos usuarios solo se les proporciona actualizaciones de seguridad de determinados paquetes. Cuando una release obtiene la confianza de los desarrolladores el propio servicio FreedomBox se actualiza, lo que supone una excepción a esta regla. Esto implica que las últimas funcionalidades de FreedomBox estarán disponibles para estos usuarios aunque no tán inmediata- o frecuentemente como para los usuarios de las versiones en pruebas (testing). Si una app sólo está disponible en la distribución en pruebas (testing) pero no en la estable la app aparecerá en el interfaz web pero no será instalable para los usuarios de la distribución estable. Algunas apps se actualizan en excepción a la regla de "solo actualizaciones de seguridad" cuando la app esté seriamente rota por algún motivo. Debian libera cada bienio una entrega (release) con las últimas versiones estables de cada paquete de software y los desarrolladores de FreedomBox intentarán actualizar a estos usuarios a la nueva entrega (release) sin necesidad de intervención manual. - - - Usuarios de versiones en pruebas: Esta categoria de usuarios incluye a los usuarios que instalaron FreedomBox sobre una distribución en pruebas (testing) y a los que descargaron las imágenes en pruebas (testing) desde freedombox.org. Estos usuarios asumen la posibilidad de afrontar disrupciones ocasionales en los servicios e incluso tener que intervenir manualmente para arreglarlas. Como regla general estos usuarios reciben las últimas funcionalidades y actualizaciones de seguridad para todos los paquetes instalados. Cada quincena se libera una nueva versión de FreedomBox con todas las últimas funcionalidades y correcciones. Estas versiones llegan a los usuarios de la distribución en pruebas (testing) aproximadamente 2 o 3 días después de la liberación. - - - Usuarios de versiones inestables: Esta categoria de usuarios incluye a los usuarios que instalaron FreedomBox sobre una distribución inestable y a los que descargaron las imágenes inestables desde freedombox.org. Estos usuarios asumen la probabilidad de afrontar disrupciones en los servicios y tener que intervenir manualmente para arreglarlas. Como regla general estos usuarios reciben las últimas funcionalidades y actualizaciones de seguridad para todos los paquetes instalados. Cada quincena se libera una nueva versión de FreedomBox con todas las últimas funcionalidades y correcciones. Estas versiones llegan a los usuarios de la distribución inestable el mismo día de la liberación. Solo los desarrolladores, probadores y contribuyentes al proyecto FreedomBox debieran emplear la distribution inestable. Se advierte y exhorta a los usuarios finales de que no la usen. - - -
-
- Actualizaciones Manuales desde el Terminal - Algunos paquetes de software podrían requerir intervención manual para actualizarlos, generalmente por razones de configuración. En tales casos FreedomBox se actualiza a sí mismo y solicita información nueva necesaria para la actualización del paquete. Después de autoactualizarse FreedomBox actúa en nombre del usuario y actualiza los paquetes con la información recabada. Estos paquetes no se deben actualizar manualmente hasta que FreedomBox tenga la posibilidad de actualizarlos. La actualización que se dispara manualmente desde el interfaz web ya es consciente de estos paquetes y no los actualiza. - En situaciones muy extrañas, FreedomBox podría fallar o quedar a expensas de una intervención manual desde el terminal. Para esto, entra a FreedomBox por un terminal, ya sea físico, web (empleando Cockpit) o mediante SSH (ver sección Shell Segura) y ejecuta los siguientes comandos: - -# dpkg --configure -a -# apt update -# apt -f install -# unattended-upgrade --debug -# apt install freedombox -# apt update]]> - Si apt-get update te pide confirmación para algo responde que . Si durante la actualización del paquete freedombox te pregunta acerca de los archivos de configuración responde que instale los archivos de configuración nuevos que vienen con la última versión del paquete. Este proceso solo actualizará los paquetes que no necesitan preguntar (excepto el paquete freedombox). Después, deja que FreedomBox se encargue de la actualización de los demás paquetes. Sé paciente mientras se crean nuevas versiones de FreedomBox para tratar los paquetes que necesitan intervención manual. - Si quieres ir más allá de la recomendación e instalar todos los paquetes en tu FreedomBox y realmente estás muy seguro de poder tratar los cambios de configuración de paquetes por tí mismo, ejecuta el siguiente comando: - -
-
Usuarios y Grupos Puedes otorgar acceso a tu FreedomBox a otros usuarios. Proporciona el nombre del usuario y su contraseña y asignale un grupo. Actualmente se soportan los grupos @@ -8145,10 +8295,10 @@ Password: Puedes compilar e instalar un paquete desde el control de versiones de Debian. Por ejemplo, + dpkg -i ../freedombox*.deb]]>
@@ -9020,7 +9170,7 @@ esac]]> - This page will help you get started with using FreedomBox on a virtual machine using VirtualBox. While VirtualBox images are primarily used for testing and development, they can also be used for regular use if you have spare resources on one of your machines. This setup is useful if: + This page will help you get started with using FreedomBox on a virtual machine using VirtualBox. While VirtualBox images are primarily used for testing and development, they can also be used for regular use if you have spare resources on one of your machines. This setup is useful if: You don't own one of the supported hardware devices. @@ -9032,9 +9182,9 @@ esac]]> You don't want to disturb your Debian installation to try out FreedomBox. - Prebuilt FreedomBox images for VirtualBox are routinely made available in VirtualBox's own VDI image file format. They contain a Debian GNU/Linux operating system and an installation of FreedomBox with all dependencies ready to run on any OS supported by VirtualBox (Windows, Linux, Macintosh, and Solaris). + Prebuilt FreedomBox images for VirtualBox are routinely made available in VirtualBox's own VDI image file format. They contain a Debian GNU/Linux operating system and an installation of FreedomBox with all dependencies ready to run on any OS supported by VirtualBox (Windows, Linux, Macintosh, and Solaris). A more adventurous alternative to downloading one of these images is to install Debian on VirtualBox and then install FreedomBox on it. - VirtualBox itself is available from (or your distribution's package manager). + VirtualBox itself is available from (or your distribution's package manager).
Download Follow the instructions on the download page to download and verify a VirtualBox image. The latest images are available on freedombox.org. @@ -9094,7 +9244,7 @@ esac]]>
First Boot When satisfied with the VM settings click the start button in the VirtualBox UI and your new FreedomBox will boot. - The console of the VM will show the textual screen below when finished booting, from here most interaction with FreedomBox will be through the web interface (aka. Plinth) in a browser. + The console of the VM will show the textual screen below when finished booting, from here most interaction with FreedomBox will be through the web interface in a browser. @@ -9106,7 +9256,7 @@ esac]]> If everything went well so far, you should be able to access the web interface of FreedomBox by pointing a browser on the host machine to . - In case freedombox.local cannot be resolved, you need to find out your FreedomBox's IP address as described in Finding out the IP address of the virtual machine. Then access this IP from a web browser which is on the same network as the VM (f.ex. the host). If all is well, you are now presented with a welcome message and invited to complete the first boot process. + In case freedombox.local cannot be resolved, you need to find out your FreedomBox's IP address as described in Finding out the IP address of the virtual machine. Then access this IP from a web browser which is on the same network as the VM (for example, the host). If all is well, you are now presented with a welcome message and invited to complete the first boot process. @@ -9122,7 +9272,7 @@ esac]]>
Using See the FreedomBox usage page for more details. - You can log in to the Debian GNU/Linux system as the user created during Plinth first boot on the VirtualBox console or remotely via ssh. + You can log in to the Debian GNU/Linux system as the user created during FreedomBox first boot on the VirtualBox console or remotely via ssh. After logging in, you can become root with the command sudo su.
@@ -9472,7 +9622,7 @@ esac]]> Finding out the IP address of the virtual machine This depends on the network configuration you chose. With a bridged adapter, your virtual machine gets its IP address from the DHCP server of your network, most likely of your Router. You can try the first couple of IP addresses or check your router web interface for a list of connected devices. If you chose host-only adapter, the IP address is assigned by the DHCP server of your VirtualBox network. In the VirtualBox Manager, go to File -> Preferences -> Network -> Host-only Networks. You can see and edit the DHCP address range there, typically you get assigned addresses close to the Lower Address Bound. - Another possibility of finding the IP address is to login via the Virtualbox Manager (or similar software). The FreedomBox images do not have any default user accounts, so you need to set an initial user and password using the passwd-in-image script. + Another possibility of finding the IP address is to login via the VirtualBox Manager (or similar software). The FreedomBox images do not have any default user accounts, so you need to set an initial user and password using the passwd-in-image script. See also QuickStart for instructions on how to scan your network to discover the IP of the VM.
@@ -10111,6 +10261,67 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Release Notes The following are the release notes for each FreedomBox version. +
+ FreedomBox 20.10 (2020-06-01) +
+ Top Highlights + + + pagekite: Fix expired certificates causing connection failures + + + tor: Fix problems with running a relay + + +
+
+ Other Changes + + + backups: Add optional field - Name + + + cockpit: Promote for advanced storage/firewalld/networking ops + + + firewall: Don't show tun interface in internal zone warning + + + firewall: Mention that internal services are available over VPN + + + ikiwiki: Enable 'attachment' plugin by default + + + locale: Update translations for Spanish, French, Russian, Norwegian Bokmål, Czech, Hungarian, and Greek + + + minidlna: Add link to manual page + + + minidlna: Fix internationalization for name of the app + + + mldonkey: Add app to freedombox-share group + + + openvpn: Use app toggle button and common app view + + + radicale: Fix link in description to clients + + + samba: Add clients information + + + templates: Fix setup state check + + + users: Avoid error when user's groups cannot be parsed + + +
+
FreedomBox 20.9 (2020-05-18)
@@ -13285,7 +13496,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Prioridades de Desarrollo - Las prioridades se discuten regularmente. Encontrarás el avance del Servicio FreedomBox (Plinth) con sus prioridades aquí: panel de tareas e hitos. + Las prioridades se discuten regularmente. Encontrarás el avance del Servicio FreedomBox con sus prioridades aquí: panel de tareas e hitos. Por favor, asiste a las próximas reuniones de avance para mantenerte al día y tratar con los miembros del equipo de publicación (release). La Página de trabajos pendientes recopila la lista completa de los elementos en los que trabajar para FreedomBox.
@@ -13303,7 +13514,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw] Si eres desarrollador puedes contribuir código a algún sub-proyecto de FreedomBox. Éste es el procedimiento paso a paso para contribuir código. - Servicio FreedomBox (Plinth): un interfaz web para administrar las funciones de FreedomBox. + Servicio FreedomBox: un interfaz web para administrar las funciones de FreedomBox. Freedom Maker: un script para construir imágenes de disco de FreedomBox para usarlas en dispositivos de hardware variados o en máquinas virtuales. @@ -13318,7 +13529,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw] Si eres diseñador de UX, puedes ayudar a FreedomBox con esto: - Experiencia de interacción para el interfaz web del Servicio FreedomBox (Plinth). + Experiencia de interacción para el interfaz web del Servicio FreedomBox. Diseño web para los sitios freedombox.org, freedomboxfoundation.org y el wiki. @@ -13347,7 +13558,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Documentar: Manual de Usuario, Sitio Web y Wiki - FreedomBox necesita mejor documentación para usuarios y contribuyentes. El manual de FreedomBox se prepara agregando diferentes páginas del wiki y exportando a various formatos. El manual se usa en el Servicio FreedomBox (Plinth) y en otros sitios. + FreedomBox necesita mejor documentación para usuarios y contribuyentes. El manual de FreedomBox se prepara agregando diferentes páginas del wiki y exportando a various formatos. El manual se usa en el Servicio FreedomBox y en otros sitios. Si quieres contribuir al wiki (y por extensión al manual) de FreedomBox, puedes crear una cuenta en el wiki y empezar a editar. Para contribuir al sitio web por favor inicia un debate en la sección de desarrollo del foro de FreedomBox.
@@ -13411,21 +13622,21 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Servicio FreedomBox (Plinth) El servicio FreedomBox (Plinth) es un interfaz web para administrar las funciones de FreedomBox. - El servicio FreedomBox (Plinth) es Software Libre bajo la versión 3 o posterior (a tu elección) de la Licencia Pública General GNU Affero. + El servicio FreedomBox es Software Libre bajo la versión 3 o posterior (a tu elección) de la Licencia Pública General GNU Affero.
Uso - El servicio FreedomBox (Plinth) viene instalado en todas las imágenes de FreedomBox. Puedes descargar imágenes de FreedomBox y ejecutarlas en cualquier hardware soportado. El servicio FreedomBox (Plinth) estará accesible visitando la URL o . + El servicio FreedomBox viene instalado en todas las imágenes de FreedomBox. Puedes descargar imágenes de FreedomBox y ejecutarlas en cualquier hardware soportado. El servicio FreedomBox (Plinth) estará accesible visitando la URL o . - Si estás en una máquina Debian puedes instalar el servicio FreedomBox (Plinth) desde el archivo de paquetes de Debian. Actualmente solo se soportan Buster (estable), Bullseye (en pruebas) y Sid (inestable). Para instalar el servicio FreedomBox (Plinth) ejecuta: + Si estás en una máquina Debian puedes instalar el servicio FreedomBox desde el archivo de paquetes de Debian. Actualmente solo se soportan Buster (estable), Bullseye (en pruebas) y Sid (inestable). Para instalar el servicio FreedomBox ejecuta: - También puedes obtener el servicio FreedomBox (Plinth) en su repositorio Git o instalarlo desde el código fuente. + También puedes obtener el servicio FreedomBox en su repositorio Git o instalarlo desde el código fuente.
@@ -13546,7 +13757,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw]
Contribuir - Buscamos ayuda para mejorar el servicio FreedomBox (Plinth). Puedes contribuir al servicio FreedomBox (Plinth) no solo codificando sino también traduciendo, documentando, diseñando, empaquetando o dando soporte. + Buscamos ayuda para mejorar el servicio FreedomBox. Puedes contribuir al servicio FreedomBox no solo codificando sino también traduciendo, documentando, diseñando, empaquetando o dando soporte. Hay disponibles instrucciones para contribuir código. @@ -13561,7 +13772,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw] Las listas de defectos, tareas pendientes y solicitudes de funcionalidad están en el gestor de incidencias. - Antes de contribuir al código fuente del servicio FreedomBox (Plinth) necesitas entender Python y Django porque se basa en ellos. + Antes de contribuir al código fuente del servicio FreedomBox necesitas entender Python y Django porque se basa en ellos. Puedes solicitar asistencia al desarrollo en el foro de debate, la lista de correo o el canal de IRC #freedombox. @@ -13571,7 +13782,7 @@ wget https://www.thinkpenguin.com/files/ath9k_firmware_free-version/htc_7010.fw] Paquete Debian - El servicio FreedomBox (Plinth) está empaquetado para Debian como paquete nativo y el código fuente de empaquetado es parte del código fuente del paquete principal. + El servicio FreedomBox está empaquetado para Debian como paquete nativo y el código fuente de empaquetado es parte del código fuente del paquete principal. Las incidencias relacionadas con el empaquetado se listan en el BTS de Debian. diff --git a/doc/manual/es/images/firewalld-cockpit.png b/doc/manual/es/images/firewalld-cockpit.png new file mode 100644 index 0000000000000000000000000000000000000000..397f8247c6e262abe39fdc6f1dbc54ee9c2065ab GIT binary patch literal 46555 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 literal 0 HcmV?d00001 diff --git a/doc/manual/es/images/networks-cockpit.png b/doc/manual/es/images/networks-cockpit.png new file mode 100644 index 0000000000000000000000000000000000000000..0f32e5e7d68b8cfa9ca2790cd51e88d3a45bf05c GIT binary patch literal 46402 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 E0M_0`ZvX%Q literal 0 HcmV?d00001 diff --git a/doc/manual/es/images/storage-cockpit.png b/doc/manual/es/images/storage-cockpit.png new file mode 100644 index 0000000000000000000000000000000000000000..eff21ba5cf94c278dc13d58d9550b15bce271701 GIT binary patch literal 61222 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 Date: Mon, 1 Jun 2020 19:49:37 -0400 Subject: [PATCH 41/41] Release v20.10 to unstable Signed-off-by: James Valleroy --- debian/changelog | 60 ++++++++++++++++++++++++++++++++++++++++++++++ plinth/__init__.py | 2 +- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 56cd71bd0..e5fcbb5d6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,63 @@ +plinth (20.10) unstable; urgency=high + + [ Joseph Nuthalapati ] + * backups: Add optional field - Name + * functional-tests: Use Name attribute in backups + * functional-tests: Move @backups to Scenario level + * functional-tests: Leave tor+http test disabled + * tests: functional: Document running tests in parallel + * tests: functional: Add pytest-xdist to install.sh + + [ Sunil Mohan Adapa ] + * openvpn: Use app toggle button and common app view + * tests: functional: Merge into main source hierarchy + * storage: Fix failing path validation unit tests + * tests: functional: cosmetic: flake8 fixes + * tests: functional: Re-organize step definitions and helper methods + * coturn: Fix functional test for backup/restore + * ttrss: Fix functional tests + * snapshot: Fix functional test to account for non-removable snapshots + * test: functional: Fix for Apache restart after domain change + * tor: Fix problems with running a relay + * mldonkey: Add app to freedombox-share group + * samba: Add clients information + * cockpit: Promote for advanced storage/firewalld/networking ops + * firewall: Mention that internal services are available over VPN + * firewall: Don't show tun interface in internal zone warning + * minidlna: Add link to manual page + * minidlna: Fix i18n for name of the app + * pagekite: Fix expired certificates causing connection failures + + [ Luis A. Arizmendi ] + * Translated using Weblate (Spanish) + + [ Etienne ] + * Translated using Weblate (French) + + [ Artem ] + * Translated using Weblate (Russian) + + [ fred1m ] + * ikiwiki: Enable 'attachment' plugin by default + + [ James Valleroy ] + * utils: Handle removal of axes.get_version() + * debian: Mark doc packages as Multi-Arch: foreign + * firewall: Minor spelling fix + * radicale: Fix link in description to clients + * users: Avoid error when user's groups cannot be parsed + * templates: Fix setup state check + * locale: Update translation strings + * doc: Fetch latest manual + + [ Allan Nordhøy ] + * Translated using Weblate (Norwegian Bokmål) + * Translated using Weblate (Czech) + * Translated using Weblate (Hungarian) + * Translated using Weblate (Greek) + + -- James Valleroy Mon, 01 Jun 2020 20:06:53 -0400 + plinth (20.9) unstable; urgency=medium [ Petter Reinholdtsen ] diff --git a/plinth/__init__.py b/plinth/__init__.py index e4e759f85..7559d75cd 100644 --- a/plinth/__init__.py +++ b/plinth/__init__.py @@ -3,4 +3,4 @@ Package init file. """ -__version__ = '20.9' +__version__ = '20.10'